Newsgroup: it.comp.www.php
Titolo: mysql_insert_id() affidabilità?

Ipotizzando di avere un unica pagina che fa INSERT con centinaia di 
connessioni simultanee quanto ï¿œ affidabile la suddetta funzione
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
     die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
Non ci sarï¿œ il rischio di accavallare l'id di un INSERT con quello del 
successivo?

 successivo?
Potresti aggiungere un "LOCK TABLES settings WRITE" prima dell'INSERT
ed un "UNLOCK TABLES" subito dopo, per evitare problemi.
Alfredo

 connessioni simultanee quanto è affidabile la suddetta funzione
A meno di bug, e` affidabile al 100% perche` funziona "per connessione", e 
non guarda l'ultimo id inserito nel DB, ma l'ultimo inserito nella 
connessione corrente.
Bye.

Alessandro Pellizzari ha scritto:

E' questo che mi spaventa, se ho N server di front-end con Apache che si 
connettono tutti allo stesso server MySQL c'è il rischio che l'ID che mi 
viene restituito non corrisponda al record inserito nel DB
O sto dicendo cazzate... delle due l'una
cmq, riflettendo sul mio problema mi sa che ho esattamente il problema 
inverso, spiego meglio..
immagina di avere una tabella "votanti"
id_votante auto inc
nome
cognome
codicefiscale unique
email
in un altra tabella "voto"
id_voto auto inc
partito
candidato1
candidato2
codiceverifica unique
ora, ciò che vogliamo ottenere è che venga fatto l'INSERT dei dati 
relativi al votante nella tabella votanti e fin qui...
I dati provengono da variabili passate direttametne da mod_ssl che legge 
il certificato client di una smart card per la precisione della CNS 
(Carta nazionale dei Servizi) rilasciata da 
https://www.firma.infocert.it/
e che venga inserito nella tabella "voto" il partito, i candidati ed un 
codice di verifica semi-random ovvero qualcosa tipo 
timestamp+numerorandom in modo che se malauguratamente il numero random 
dovesse essere duplicato la prima parte del timestamp ci garantirà 
l'unicità dello stesso.
Il codice verifica è indispensabile in quanto andrà a formare un .pdf
contenente i dati del record inserito in "voto" simile a
id_voto partito candidato1  candidato2 codiceverifica
   1       xxx   Mario Rossi Gigi Mosca 1212690530.4132-1212690530xbfhjj
che successivamente sarà firmato digitalmente .p7m ed inviato all'e-mail 
dell'elettore
Ora, il problema è che il primo che vota avrà id_votante = 1 e id_voto = 
1 il ché manda a remengo la segretezza del voto..
Idee?

 1 il ché manda a remengo la segretezza del voto..
Non e` detto che sia biunivoca la relazione id_votante<->id_voto.
Se il primo votante e` veloce a iscriversi ma lento a votare e il secondo 
e` lento a iscriversi e veloce a votare, potresti avere (per via della 
concorrenza suddetta, che il primo ha id_votante=1 e id_voto=2, e l'altro 
all'opposto.
Il problema magari ce l'hai per i primi voti sparuti, ma allora puoi 
risolvere facendo partire l'auto-increment di entrambe le tabelle da un 
valore random generato al momento della creazione delle tabelle o al 
momento dell'apertura delle urne.
Ah, io nel DB terrei anche traccia in un qualche modo che il votante con 
id n ha gia` votato per le votazioni x, magari con una terza tabella 
"votazioni" e una quarta "votazioni_votante" (di relazione).
Bye.

 Bye.