OVH Cloud OVH Cloud

mysql_insert_id()

4 réponses
Avatar
laurent sturm
Salut,

Juste une petite question.
J'ai un formulaire d'inscription, si deux ou plusieurs personnes
s'inscrivent en même temp, ne risque t'il pas d'y avoir une incohérence dans
le code suivant.

$link = db_connect($DSN);
db_select($DSN, $link);

$SQL="INSERT INTO user
(nom,prenom,email,password,adresse,code_postal,ville,tel_fixe,tel_portable)"
." VALUES('"
.$USER['nom']."','"
.$USER['prenom']."','"
.$USER['email']."','"
.$USER['password']."','"
.$USER['adresse']."','"
.$USER['code_postal']."','"
.$USER['ville']."','"
.$USER['tel_fixe']."','"
.$USER['tel_portable']."')";

db_query($link, $SQL);
$id = mysql_insert_id(); <= ICI est ce que je peut affirmer que l'id est
bien celui qui correspond à cet utilisateur, ou dois plutot effectuer la
requete suivante afin d'être sur que l'id renvoyé est le bon

Aprés db_query($link,$SQL);

$SQL ="SELECT id_user FROM user WHERE email='".USER['email']
$rows = db_query($link, $SQL);

$id = $rows['id_user']

Merci @+




--
______________________
Visitez mon site
http://laurent.sturm.free.fr
______________________

4 réponses

Avatar
John Gallet
Bonour,

J'ai un formulaire d'inscription, si deux ou plusieurs personnes
s'inscrivent en même temp, ne risque t'il pas d'y avoir une incohérence dans
le code suivant.


Non, pas de risques d'accès concurentiel instantané. En revanche au
premier blaireau qui clique tu refresh ou qui fait back et re-soument,
ou qui décide d'appeler ta page en boucle avec un wget bien placé te
crééera des doublons, triplets,milliers d'entrées identiques si tu n'a
pas positionné correctement une clef unique fonctionnelle.

Cf fr.comp.applications.sgbd.


$id = mysql_insert_id(); <= ICI est ce que je peut affirmer que l'id est
bien celui qui correspond à cet utilisateur,
Oui.


ou dois plutot effectuer la
requete suivante afin d'être sur que l'id renvoyé est le bon
$SQL ="SELECT id_user FROM user WHERE email='".USER['email']
$rows = db_query($link, $SQL);


Surtout pas si tu n'as pas de transactions. Le but de mysql_insert_id()
est de pallier l'absence de transactions.

a++
JG

Avatar
deep
"laurent sturm" wrote in news:cam6fg$op9$
reader1.wanadoo.fr:

mysql_insert_id();


C'est un numéro auto incrémenté j'imagine ?
Lors de ton insert, il s'incrémente tout seul
Donc si tu fais $id = mysql_insert_id(); tu crées un enregistrement
vierge avec un numéro tout neuf.
Effectivement l'idéal est de récupérer l'id en fonction du mail.
Ca me parait beaucoup plus propre.
@+
Deep

Avatar
laurent sturm
"John Gallet" a écrit dans le message de
news:
Bonour,

J'ai un formulaire d'inscription, si deux ou plusieurs personnes
s'inscrivent en même temp, ne risque t'il pas d'y avoir une incohérence
dans


le code suivant.


Non, pas de risques d'accès concurentiel instantané. En revanche au
premier blaireau qui clique tu refresh ou qui fait back et re-soument,
ou qui décide d'appeler ta page en boucle avec un wget bien placé te
crééera des doublons, triplets,milliers d'entrées identiques si tu n'a
pas positionné correctement une clef unique fonctionnelle.

Ca c'est pas possible, je vérifie d'abord que l'email de l'utilisateur n'est

pas présente dans ma base de donnée avant d'autorisé l'enregistrement.

Cf fr.comp.applications.sgbd.


$id = mysql_insert_id(); <= ICI est ce que je peut affirmer que l'id
est


bien celui qui correspond à cet utilisateur,
Oui.

Trés bien, je te remercie d'avoir répondue à ma question, et d'avoir dissipé

ce doute.

@+ LS

ou dois plutot effectuer la
requete suivante afin d'être sur que l'id renvoyé est le bon
$SQL ="SELECT id_user FROM user WHERE email='".USER['email']
$rows = db_query($link, $SQL);


Surtout pas si tu n'as pas de transactions. Le but de mysql_insert_id()
est de pallier l'absence de transactions.

a++
JG



Avatar
John Gallet
Re,


En revanche au
premier blaireau qui clique tu refresh ou qui fait back et re-soument,
ou qui décide d'appeler ta page en boucle avec un wget bien placé te
crééera des doublons, triplets,milliers d'entrées identiques si tu n'a
pas positionné correctement une clef unique fonctionnelle.

Ca c'est pas possible, je vérifie d'abord que l'email de l'utilisateur n'est

pas présente dans ma base de donnée avant d'autorisé l'enregistrement.


Ce qui est inutile et n'empêchera pas un doublon (un triplet
probablement, mais pas un doublon, il suffit que l'internaute clique
deux fois sur le submit parce que "ça va pas assez vite" et la
probabilité est loin d'être négligeable, surtout que quand "ça va pas
assez vite" c'est souvent que la base est surchargée, DONC que le temps
entre le SELECT de "vérification" et l'INSERT est non négligeable).

Il suffit de mettre la colonne email en UNIQUE et de trapper l'erreur
1062 (duplicate key) en cas d'insert ou update. Là, aucuns doublons
possibles.

a++;
JG