Connaitre la valeur de l'ID du dernier enregistrement dans une table

Eléphant du PHP | 86 Messages

20 août 2007, 00:42

J'ai une table produit, avec les champs suivant:

Code : Tout sélectionner

ID_PRODUIT NOM PRIX_HT DESCRITION QUANTITE_STOCK URL_PHOTO ID_PRODUIT est en autoincrement,
Quand j'ajoute un produit à la table, je voudrais connaitre l'ID_PRODUIT du dernier enregistrement
avant d'insérer le produit ?

Bon avec cette requette : j'ai ma solution

Code : Tout sélectionner

SELECT id_produit FROM `produit` ORDER BY id_produit DESC LIMIT 0 , 1
Y a t'il une fonction pour faire ça ?

ViPHP
ViPHP | 5924 Messages

20 août 2007, 01:13

Est ce que cette information t'es vraiment utile ? Tu n'as pas besoin de cela pour insérer ton nouvel enregistrement si justement ton champ est en autoincrement…

Eléphant du PHP | 86 Messages

20 août 2007, 01:27

En fait je veux construire le champ URL_PHOTO avec l'ID de l'enregistrement

ViPHP
ViPHP | 5924 Messages

20 août 2007, 02:37

Oui mais pourquoi l'enregistrement précédant celui que tu veux insérer ? Les données que tu insères dépendent de cette information ?

Eléphant du PHP | 86 Messages

20 août 2007, 09:02

J'ajoute 1 et j'ai l'id de l'enregistrement , ainsi je peux creer une URL qui depend de l'ID de l'enregistrement.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 09:25

Alors, plusieurs remarques ...

1/ Ta requête ne me semble pas super optimisée. J'aurais fait un

Code : Tout sélectionner

SELECT MAX(id_produit) FROM produit
2/ Si je part du fait que tu utilises MySQL (il y a des recommandations lors de la création d'un nouveau post, c'est pas pour faire joli :evil:), il existe la fonction mysql_insert_id() qui permet de récupérer l'identifiant d'une ligne qui vient d'être inséré.

3/ Sinon, dans ta manière de faire (récupérer le plus grand et l'incrémenter), je voulais te montrer une faille :
  • Tu as 10 enregistrements dans ta table, la valeur courante de l'auto_increment est 10
  • Tu ajoutes un enregistrement, l'id_produit est 11, la valeur courante de l'auto_increment est donc 11
  • Tu supprimes ce dernier enregistrement, le plus grand id_produit est donc 10 mais la valeur courante de l'auto_increment reste 11
  • Tu ajoutes un nouvel enregistrement, son id_produit est 12 mais ta requête t'as retourné 11
Même si, dans l'immédiat, tu ne comptes pas supprimer d'enregistrements dans cette table, il me semble que c'est un soucis assez grave (risque de rupture de l'intégrité de ta base de données) pour le prendre en compte tout de suite.
MySQL te propose une gestion automatique des auto_increment, profite-en plutôt que de vouloir réinventer la roue ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 86 Messages

20 août 2007, 09:36

ok, merci :D

ViPHP
ViPHP | 5924 Messages

20 août 2007, 13:00

Si je part du fait que tu utilises MySQL (il y a des recommandations lors de la création d'un nouveau post, c'est pas pour faire joli :evil:), il existe la fonction mysql_insert_id() qui permet de récupérer l'identifiant d'une ligne qui vient d'être inséré.
Ouais, mais je ne sais pas si j'ai bien compris, mais j'ai l'impression qu'il veut utiliser l'insert id dans les données qu'il est en train d'insérer, et c'est là tout le problème… Je pense tout de même qu'il sera obligé soit d'abandonner l'idée d'utiliser l'id dan les données (après tout elle y est déjà), soit de refaire une requète ensuite. (à moins qu'il y ait une autre solution mais j'en doute)
Le mieux, se serait stakanof que tu nous expliques pourquoi tu en as absolument besoin. Car j'ai l'impression que la donnée dont tu parles qui utiliserait l'insert id peut parfaitement être généré lorsque tu récupères l'enregistrement, en utilisant l'id courante.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 13:24

C'est possible ... :-k

J'étais parti du fait qu'il voulais insérer un enregistrement dans la table T1 puis un enregistrement dans la table T2 avec une clé étrangère sur l'enregistrement de la table T1 qui vient d'être créé.
Et là, à part le transactionnel, je ne vois pas ... :? (Je pars du fait qu'il ne dispose pas de MySQL 5.0, par expérience ... :oops: )
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

20 août 2007, 16:41

En transactionel, tu ferais comment, comme ça ?

Code : Tout sélectionner

BEGIN INSERT INTO table VALUES(donnee1, donnee2, …); UPDATE table SET champ=CONCAT('photo.php?ID=', LAST_INSERT_ID()) WHERE id=LAST_INSERT_ID(); // Apparement il voulait stocker une URL. COMMIT

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 16:47

Je préfèrerais utiliser un déclencheur qui me donnerais l'id à utiliser puis me servir de cet id pour l'INSERT et l'UPDATE
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

20 août 2007, 16:53

Ah ok, je vois, je ne connaissais pas cette fonctionnalité…