Aller au contenu

Retourner l'identifiant affecté par un SELECT ou UPDATE


captain_torche

Sujets conseillés

Bonjour,

J'ai une requête de ce type :

INSERT INTO table(Key, Texte) VALUES('$ma_key', '$mon_texte') ON DUPLICATE KEY UPDATE Texte = '$mon_texte'

Elle fonctionne très bien (insère un nouvel enregistrement si la clé n'existe pas, met à jour un enregistrement existant si la clé existe déjà).

Je veux par contre récupérer l'ID de l'identifiant affecté par la requête.

En local, j'utilise mysql_insert_id(), qui fonctionne très bien (PHP 5.2.0, Mysql 5.0.22)

Par contre, en distant, le comportement est différent : il me sort l'ID qu'aurait eu le prochain enregistrement (en gros, MAX(ID)+1) (PHP 5.2.6-0.dotdeb.1, MySQL 5.0.51a)

Existerait-il une fonction SQL qui permette de retourner cet identifiant ?

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Utilise LAST_INSERT_ID() de mysql

Attention

mysql_insert_id() convertit le type de valeur retourné par la fonction C de MySQL C mysql_insert_id() en type PHP long (appelé int en PHP). Si votre colonne de type AUTO_INCREMENT est une colonne de type BIGINT, la valeur retournée par mysql_insert_id() sera incorrecte. À la place, utilisez la fonction interne MySQL LAST_INSERT_ID() dans une requête SQL.

Note: La fonction MySQL LAST_INSERT_ID() contient toujours la valeur AUTO_INCREMENT la plus récente, et n'est pas remise à zéro entre deux requêtes.

Sources : http://fr.php.net/manual/fr/function.mysql-insert-id.php

Lien vers le commentaire
Partager sur d’autres sites

Ce qui est logique !

LAST_INSERT_ID() fonctionnera pour la partie INSERT mais en aucun cas pour la partie UPDATE (sauf si l'update se fait sur le dernier enregistrement ajouté).

A ma connaissance il n'y a pas de fonction toute faite dans le cas de l'update. J'ai également besoin de la même info, je recherche de mon coté, si je trouve je viens poster ici.

++

Patrick

Lien vers le commentaire
Partager sur d’autres sites

C'est parce qu'en local ton "ON DUPLICATE" n'a pas été validé.

En clair tu n'avais pas déjà cette clé, et donc tu as fait un INSERT ;)

Lien vers le commentaire
Partager sur d’autres sites

Dan, je peux t'affirmer que non ;)

J'ai constamment le même nombre d'enregistrements.

Si je demande au script local de m'afficher les IDs ainsi récupérés, il me les affiche invariablement de 1 à 965.

Si je le fais en distant, il ne m'affichera que 966 ... 965 fois.

Edit : la requête SQL de Dadou a le même comportement sur les deux serveurs. C'est le comportement de mysql_insert_id() qui varie.

Lien vers le commentaire
Partager sur d’autres sites

Non, je limite à l'identifiant de la connexion, ça ne peut pas être un script extérieur.

Et le script est le même en local et en distant, il n'y a rien dedans qui pourrait s'insérer entre les deux requêtes.

Merci à vous de vous pencher sur ça ;)

Lien vers le commentaire
Partager sur d’autres sites

Oui, ce sont les mêmes structures.

Mais j'ai fini par y arriver !

J'ai suivi les conseils donnés par ce sujet : http://forums.whirlpool.net.au/forum-repli...fm/1126739.html, et j'ai mieux relu la doc pour ce genre de requête SQL : http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

Dans mon cas, ça donne :

INSERT INTO table(Key, Texte) VALUES('$ma_key', '$mon_texte') ON DUPLICATE KEY UPDATE ID = LAST_INSERT_ID(ID), Texte = '$mon_texte'

Ensuite, un simple "SELECT LAST_INSERT_ID()", voire même un mysql_insert_id(), fonctionnent.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...