captain_torche Posté 27 Janvier 2009 Posté 27 Janvier 2009 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.
Dadou Posté 27 Janvier 2009 Posté 27 Janvier 2009 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
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 Non, malheureusement il me sort le même résultat.
Patrick Posté 27 Janvier 2009 Posté 27 Janvier 2009 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
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 Ce qui est étrange, c'est qu'en local, avec la configuration mentionnée, ça fonctionne très bien.
Dan Posté 27 Janvier 2009 Posté 27 Janvier 2009 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
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 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.
Dan Posté 27 Janvier 2009 Posté 27 Janvier 2009 OK, ma suggestion me semblait aussi bien triviale (te connaissant) As-tu bien la même version de mysql des deux côtés ?
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 Non, Mysql et PHP sont différents sur les deux serveurs. Local : PHP 5.2.0, Mysql 5.0.22 (EasyPHP) Distant : PHP 5.2.6-0.dotdeb.1, MySQL 5.0.51a
Nicolas Posté 27 Janvier 2009 Posté 27 Janvier 2009 Est-ce que tu es bien en autoincrement sur les 2 bases ? je suppose que oui mais on ne sait jamais ;-)
Nicolas Posté 27 Janvier 2009 Posté 27 Janvier 2009 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 ?
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 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
Nicolas Posté 27 Janvier 2009 Posté 27 Janvier 2009 C'est exactement les mêmes structures de bd sur les 2 versions ? = meme script de création. La aussi je suppose que oui ;-)
captain_torche Posté 27 Janvier 2009 Auteur Posté 27 Janvier 2009 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.
Nicolas Posté 27 Janvier 2009 Posté 27 Janvier 2009 Super ;-) Mais pourquoi ca fonctionnait en local alors ? ca viendrait de la différence de version mysql ?
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant