recuperer l'id d'un enregistrement

Répondre
LA GLOBULE
le 13/11/2008 à 00:21
LA GLOBULE
Si, il y a plein de techniques.
Dans tous les cas, tu vas devoir gicler l'auto_increment et calculer ton id avant de faire ton INSERT.

Technique 1 : générer une clé unique

Pour cette solution, tu vas utiliser une clé primaire que tu vas générer au préalable.
Il te suffit en fait de générer une clé "unique". PHP fait la même pour générer des identifiants de session PHP.

Pour cela, tu peux par exemple utiliser la fonction uniqid. Voir te créer une fonction génératrice d'identifiant unique.

Tu obtiens alors ton identifiant à utiliser pour ton INSERT.

Technique 2 : utiliser une table SQL contenant le dernier id utilisé

Tu vas, par exemple, te créer une table 'generation_id' ou tu auras juste une seule ligne d'une seule colonne. Appelons ce champs de type numérique 'id'.
Le but du jeu, c'est de sélectionner la valeur de ce chiffre pour connaitre le dernier 'id' utilisé, l'augmenter de 1 et mettre à jour ce chiffre pour les utilisations futures.
Pour éviter le problème de concurrence d'accès à cet 'id', il faut faire un SELECT FOR UPDATE (je te conseille de lire la documentation MySQL à ce sujet).

Exemple de marche à suivre :

Tu vas lancer une première requete qui va vérouiller ton champs 'id' (aucune autre requete ne pourra accéder à ce champ tant que tu ne l'auras pas modifié) :

<?php
$sql = 'SELECT id FROM generation_id FOR UPDATE';
?>


Tu récupères la valeur dans une variable PHP genre $id, ensuite, dans ton PHP tu l'incrémentes, et enfin tu mets à jour le compteur :

<?php
$sql = 'UPDATE generation_id SET id = '".intval($id)."'';
?>


Tu as alors dans $id l'identifiant unique que tu souhaitais obtenir. Il te suffit de l'utiliser pour ton INSERT.

Pour info, la technique 1 n'est pas sure à 100% (toutefois, je l'ai déjà employé, je n'ai jamais eu de problème de génération de deux id identiques, la base était les données d'un webmail de 4 000 000 de comptes mails, la base pesant plus de 1To et se prenant plus de 1000 req/seconde), la technique 2 est sure, mais tu fais plus de requêtes SQL, et tu peux "locker" ton id si ton script plante. A toi de choisir.
jeca
le 13/11/2008 à 07:46
jeca
Bonjour,

Extrait du manuel mysql :
Retourne le dernier identifiant automatiquement généré par une colonne AUTO_INCREMENT.

mysql> SELECT LAST_INSERT_ID();
-> 195

Le dernier ID généré est conservé par le serveur pour chaque connexion. Un autre client ne la modifiera donc pas, même s'ils génèrent une autre valeur AUTO_INCREMENT de leur coté. Ce comportement permet de s'assurer que les actions des autres clients ne perturbe pas les actions du client en cours.

Donc, pas besoin de réinventer la roue.
cordialement
LupusMic
le 15/11/2008 à 04:54
LupusMic
(jeca) Tu as lu ça où ? Parce que sur le manuel de MySQL, ce n'est pas vraiment ce qui est marqué :
documentation

Notez aussi que la valeur de retour de la fonction SQL LAST_INSERT_ID() contient toujours la valeur d'AUTO_INCREMENT la plus à jour. Cette valeur n'est pas remise à zéro lors de l'exécution d'autre requêtes car elle est maintenue pour le serveur.


Ceci dit, si l'autoincrément est considéré par connexion, ça ne change pas grand chose si tu utilises le module PHP pour Apache. Le socket « risque » d'être le même, et donc la connexion MySQL commune entre les appels de différents clients HTTP. Ce qui nous ramène au problème initial de risque de collision et d'inconsistance.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours