Newsgroup: it.comp.www.php
Titolo: mysql_insert_id() torna zero anche se non dovrebbe

Guardate questo semplice codice:
function writeSport($conn, $campi, &$id)
{
 include ("inc/config.inc.php");
 $sql = "INSERT INTO $TABLE_SPORT SET $campi";
 echo $sql."<br>";
 $res = mysql_query($sql, $conn) or die("Errore:...");
 $id = mysql_insert_id();
 echo "ID(dentro)=".$id."<br>";         
 return($res);
}
Come vedete ho messo un echo su $id per testare il valore della
variabile dopo aver chiamato mysql_insert_id().
Sempre 0.
Dal manuale scopro che mysql_insert_id() torna 0 se la query non ha
tornato un valore AUTO_INCREMENT ma non dovrebbe essere questo il caso
in quanto le righe risultanti assumono la id giusta.
Sappiate che:
- la tabella ha un indice AUTO_INCREMENT
- un esempio di query che popola la tabella č questa:
INSERT INTO sport SET
        dataoraCreazione = '2006-08-07 15:09:34',
        operatoreCreId = '1',
        dataoraUltimaModifica = '2006-08-07 15:09:34',
        operatoreModId = '1',
        id = '0',
        descrizione = 'Hockey',
        id_utente = '1'
- la struttura della tabella, cosě come la riportata un eventuale dump č
questa:
CREATE TABLE `sport` (
  `id` int(6) NOT NULL auto_increment,
  `dataoraUltimaModifica` timestamp(14) NOT NULL,
  `operatoreModId` int(6) unsigned default '0',
  `dataoraCreazione` timestamp(14) NOT NULL default '00000000000000',
  `operatoreCreId` int(6) unsigned default '0',
  `codice` char(10) default NULL,
  `descrizione` char(30) default NULL,
  `id_utente` int(6) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=25 ;
Come vedete dall'ultima riga sono state inserite correttamente 24 righe
(frutto di 24 chiamate alla mia funzione writeSport) ed AUTO_INCREMENT č
pronto per assegnare la id 25 alla prossima.
- PHP 4.3.11
- MySQL 4.0.20
Any ideas?
-- 
Stefano

 Any ideas?
Provo a spararla... aggiungi $conn come argomento a mysql_insert_id()
se non inserisci il link_identifier verrà "preso" l'ultimo creato da 
mysql_connect(), ma siccome non è all'interno della funzione, può essere 
che fai il mysql_insert_id() su una connessione diversa da quella dove 
hai effettuato la query.

 hai effettuato la query.
HAI VINTO!!!
Così funziona, grazie.
A dire la verità ci avevo pensato ma nella miriade di prove che ho fatto
mi sono detto che questa potevo risparmiarmela perché ero l'unico utente
a collegarmi al db (sono in locale).
Chiaramente ciò non vuol dire nulla proprio per quello che hai spiegato
tu.
Però... Vado a controllare il codice e vedo che eseguo una sola
connessione. Come può succedere che 'sbagli' connessione quando ce ne è
solo una? Mi sfugge qualcosa?
-- 
Stefano

 è solo una? Mi sfugge qualcosa?
Sono un semi-niubbo in php quindi provo a tirare delle conclusioni quasi
a caso...
senza vedere il codice è un po' difficile capire se effettivamente si
crea soltanto un identificatore di connessione.
bisognerebbe vedere se il file dove c'è effettivamente la mysql_connect
è incluso in più parti del codice, per esempio se è all'interno di
inc/config.inc.php verrà creata una nuova connessione ogni volta che
richiami la writeSport e il link_identifier cambia, anche se si
riferisce sempre allo stesso database (esempio a caso).
penso che ti sei accorto dell'errore soltanto perchè hai usato $conn
all'interno di mysql_query, altrimenti sia mysql_query che
mysql_insert_id avrebbero usato l'ultimo link_identifier a disposizione
e non ti saresti accorto di nulla :-D
Per una vera risposta forse ti conviene aspettare qualcuno con più
esperienza ;-)
DonnieDarko