Aller au contenu

Retourner l'identifiant affecté par un SELECT ou UPDATE


Sujets conseillés

Posté

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.

Posté

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

Posté

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

Posté

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 ;)

Posté

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.

Posté

OK, ma suggestion me semblait aussi bien triviale (te connaissant) :)

As-tu bien la même version de mysql des deux côtés ?

Posté

Est-ce qu'il n'y aurait pas sur la version serveur une opération (un script par exemple) qui se déroulerait entre ta requête et la fonction mysql_insert_id ?

Posté

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 ;)

Posté

C'est exactement les mêmes structures de bd sur les 2 versions ? = meme script de création.

La aussi je suppose que oui ;-)

Posté

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.

Veuillez vous connecter pour commenter

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



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