Comportement étrange de LAST_INSERT_ID()

Eléphant du PHP | 479 Messages

09 juin 2009, 15:17

Salut à tous,

Je dois utiliser la fonction MySQL LAST_INSERT_ID() car la colonne AUTO_INCREMENT de ma table est de type BIGINT (non_signé), et une limite de la fonction PHP mysql_insert_id() m'empêche de l'utiliser.

J'ai néanmoins un comportement étrange dans mon script, car avec la requête ci-dessous, j'ai plusieurs lignes de résultats (avec tous les identifiants ajoutés) alors que je n'en attends qu'une.

Code : Tout sélectionner

SELECT LAST_INSERT_ID(adv_id) AS current_id FROM advertisements
Je me retrouve donc à faire cette requête pour limiter la casse :

Code : Tout sélectionner

SELECT LAST_INSERT_ID(adv_id) AS current_id FROM advertisements ORDER BY current_id DESC LIMIT 1
Si je ne précise pas la colonne à LAST_INSERT_ID(), il me renvoie un 0. Si je zappe les conditions, il me renvoie autant de 0 que j'ai d'enregistrements.

Est-ce moi (il y a de grandes chances) ou LAST_INSERT_ID() qui déconne ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 juin 2009, 16:13

Je ne suis pas sûr de répondre à ta question, mais est-ce que tu as pris garde à ces avertissements de la doc officielle de MySQL :
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.
J'ai le sentiment que si mysql_insert_id() ne te convient pas, c'est parce que tu voudrais récupérer le dernier id inséré, même s'il n'est pas de la session courante.
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 | 479 Messages

10 juin 2009, 16:38

Non, le problème avec mysql_insert_id(), c'est qu'il ne peut pas fonctionner avec un champ auto-incrémenté de type BIGINT ... or, c'est mon cas.