Rechercher : dans
Par :

MySQL/PHP last_insert_id()

Dernière réponse le 12 jun 2008 à 15:15:58 arnaudligth, le 11 jun 2008 à 09:48:30 
 Signaler ce message aux modérateurs

Bonjour,

alors voila je viens de découvrir la fonction last_insert_id() de MySQL et j'aurais besoin de quelques confirmations pour voir si j'ai bien compris la doc qui ne me parait pas assez explicite...

- last_insert_id() permet de récupérer le dernier id auto_increment d'une base de données (celle sur laquelle on est connectée) toutes tables confondues même si on fout un mysql_close() après la dernière requéte INSERT (d'ailleurs ça ne renvoi que le last_insert_id() du premier INSERT)

- admettons que 2 utilisateurs soient connectés en même temps MySQL va renvoyer le last_insert_id() de chaque utilisateurs au bon utilisateur ou va-t-il renvoyer le dernier last_insert_id() incrémenté de la table ou de la base de données?
La question se résume à savoir si MySQL considére que l'utilisateur c'est la valeur $user de mysql_connect($host, $user, $pass) ou alors le "client" PHP (georges ou robert qui se baladent sur mon site depuis chacun chez soi) , qui ont tous la même valeur $user pour se connecter à la base

Merci d'une réponse,
si ça permet de récupérer le dernier id généré par table c'est le top (mais c'est pas possible on dirait), si c'est le dernier généré dans la base de données c'est génial aussi et si en plus ça permet de bien faire la différence entre le dernier id de robert, paul et georges et bien je vais pouvoir dormir tranquille la nuit (le jour aussi...)

la doc de last_insert_id() est là : http://dev.mysql.com/doc/refman/5.0/fr/information-functions.html

Si ça manque de précision ben demandez moi je pense faire un saut plusieurs fois par heure pour avoir une réponse !

Configuration: Windows XP
Firefox 2.0.0.14

Meilleures réponses pour « MySQL/PHP last_insert_id() » dans :
Installation rapide de LAMP (Apache+MySql+php) sous Linux Voir LAMP = Linux+Apache+MySql+Php. C'est le serveur web par excellence. L'ensemble est facile à installer. Installation rapide sudo aptitude install apache2 php5 mysql-server php5-mysql libapache2-mod-php5 Le mot de passe administrateur mySQL...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...

1

Reivax962, le 11 jun 2008 à 10:04:32
  • +1

Bonjour,

Tant que tu gardes ouverte ta session MySQL, il te donne le dernier ID inséré pour cette session. Donc une session différente par utilisateur (puisque chacun a eu droit à son mysql_connect), ce qui permet de ne pas s'emmêler les pinceau entre des connexions simultanées.

Par contre, pour plus de simplicité, je te suggère d'utiliser la fonction php mysql_insert_id() décrite ici : http://fr2.php.net/manual/fr/function.mysql-insert-id.php. Tout est géré...

Xavier

Répondre à Reivax962

2

arnaudligth, le 11 jun 2008 à 10:25:26

Donc si je fait un mysql_close() c'est mort?
ou alors je vais récupérer le last_insert_id() de la base?
ou je vais quand même récupérer le last_insert_id() de bob (c'est le petit surnom de robert ;)?

parce que ma fonction executer_requete($requete) fait un truc du genre :
->je me connecte
->je sélectionne la base
->j'exécute la requete
->je mysql_close()


sinon rapport à la doc php de mysql_insert_id(), ce qui me fait peur c'est ça :
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.

Répondre à arnaudligth

3

arnaudligth, le 11 jun 2008 à 14:46:07

Dans le même délire je me demande comment récupérer le last_insert_id() suite à une requete :

<?php
//...connection etc...
mysql_query("INSERT blabla bla");
mysql_close();

//...connection etc...
mysql_fetch_array($last_id = mysql_query("SELECT LAST_INSERT_ID()"));
$dernier_identifiant = $last_id['']; //là question est là c'est quel nom de champ qu'il faut que je mette?

?>

Répondre à arnaudligth

4

arnaudligth, le 12 jun 2008 à 09:34:19

Up

Répondre à arnaudligth

5

Reivax962, le 12 jun 2008 à 10:36:15

Comment ouvres-tu tes connexions ?
Parce que les mysql_close, normalement, ça ne sert... à rien, à moins d'avoir vraiment de gros besoins d'optimisation.
En effet, si tu ouvres tes connexions de façon normale (non persistente), le close() est fait tout seul par php à la fin de la page :

Citation :
> http://fr.php.net/manual/fr/function.mysql-connect.php :
Note: La connexion au serveur sera fermée aussitôt que l'exécution du script se termine, à moins qu'elle soit fermée avant en appelant explicitement mysql_close().

Donc, à mon avis, la solution la plus simple à ton problème est de supprimer tes mysql_close() :)

Répondre à Reivax962

6

arnaudligth, le 12 jun 2008 à 11:10:23

Ouaip mais c'est un serveur mutualisé alors c'est pas sympa pour les copains (et pas propre je trouve...) c'est un peu comme l'histoire du mouchoir en papier qu'on jette dans la forêt en disant qu'un mouchoir en papier, ça se dégrade assez vite (quoique) mais si tout le monde jette son mouchoir dans la foret ben la forêt est crade, c'est pareil sur les serveur lol
en tout cas merci de m'aider sur ce coup là.

Répondre à arnaudligth

7

Reivax962, le 12 jun 2008 à 14:45:00
  • +1

Je ne suis pas d'accord avec toi. Un script php, à moins de faire vraiment des traitements lourds, a un temps d'exécution qui se chiffre en centièmes de seconde, la différence entre laisser la connexion ouverte le temps de la requête et le temps du script entier est franchement minime...
Enfin tu fais comme tu veux :D

Ceci dit si tu fermes ta session mysql tu n'as plus aucune garantie d'obtenir le "last_id" qu'il faut.

Ou alors, tu peux modifier ta fonction d'exécution de la façon suivante :

function executer_requete($requete, $retourId = false)
{
//ouverture connexion
//selection base
//exécution requête

$id = -1;
if ($retourId)
$id = mysql_insert_id();

//fermeture connexion

return $id;
}

Le fait de mettre le paramètre en optionel (c'est à dire en précisant $retourId = false) fait que tu n'as pas besoin de modifier ton code à chaque endroit où tu appelles la fonction, car executer_requete("SELECT..."); sera équivalent à executer_requete("SELECT...", false);

Que penses-tu de cette solution ?

Répondre à Reivax962

8

 arnaudligth, le 12 jun 2008 à 15:15:58

Je crois que je vais jeter mon mouchoir dans la forêt... LOL

Ceci dit si je trouve le moyen de stocker le last id en récupérant le résultat de SELECT LAST_INSERT_ID()
ça sera le top comme ça je pourrai le passer de connection en connection...

merci beaucoup.

Répondre à arnaudligth