Comment obtenir le dernier ID inséré d'une table MySQL en PHP?
93
J'ai une table dans laquelle de nouvelles données sont fréquemment insérées. J'ai besoin de la toute dernière pièce d'identité de la table. Comment puis-je faire ceci?
oui, vous cette requête retournera le dernier identifiant de la table. Mais une condition est que l'ID doit être la clé primaire. Ainsi, vous pouvez éviter la repentance.
sathish
7
@sathish: Le principal problème de cette méthode est la concurrence .
Christian C. Salvadó
3
Pour élaborer: le problème avec cela est que si quelqu'un d'autre insère quelque chose dans la table entre votre INSERTet votre requête pour MAX(id), vous pouvez obtenir un identifiant qui n'est pas votre dernier identifiant.
deceze
3
@Jocelyn, cette question a été posée un an plus tard avec des milliers de vues en moins que cette question.
Naftali aka Neal
3
@Neal, vous avez raison. L'autre question doit être fermée en double de celle-ci.
Le problème avec celui-ci est que si vous avez beaucoup d'insertions (par exemple, votre base de données enregistre également quelque chose), vous pouvez obtenir le mauvais ID.
Mike
@Mike Pas si vous utilisez mysql_insert_idjuste après votre mysql_query. Si, bien sûr, vous exécutez plusieurs autres requêtes sur la même connexion entre les deux, rien ne peut vous y aider.
deceze
7
Pour vous assurer que vous n'obtiendrez JAMAIS un faux identifiant, enveloppez votre code avec une TRANSACTION .
Marcelo Assis
28
mysql s'assure que c'est le dernier identifiant DE LA CONNEXION ACTUELLE, il n'y aura donc aucun problème si vous mettez cette instruction juste après la requête d'insertion. Pas de soucis pour les autres processus faisant des insertions, pas besoin d'envelopper cela dans une transaction. Le manuel mysql dit: "L'ID qui a été généré est conservé sur le serveur par connexion. Cela signifie que la valeur renvoyée par la fonction à un client donné est la première valeur AUTO_INCREMENT générée pour l'instruction la plus récente affectant une colonne AUTO_INCREMENT par ce client . C'est la raison pour laquelle vous ne devriez pas utiliser select MAX (ID)
woens
1
@deceze, qu'est-ce que c'est que ce PDObiais que l'on voit partout? Regardons à nouveau la comparaison des fonctionnalités . Il est clair que mysqlic'est le gagnant lorsque vous devez vous salir les mains avec des trucs de bas niveau. En d'autres termes, même si l'on choisit l'AOP, il devra éventuellement l'utiliser de mysqlitoute façon.
Pacerier
53
il y a une fonction pour savoir quel était le dernier identifiant inséré dans la connexion actuelle
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
De plus, l'utilisation de max est une mauvaise idée car cela pourrait entraîner des problèmes si votre code est utilisé en même temps dans deux sessions différentes.
Ce que vous avez écrit vous obtiendrait le meilleur en idsupposant qu'ils étaient uniques et auto-incrémentés, ce qui serait bien en supposant que vous êtes d'accord pour inviter des problèmes de concurrence.
Puisque vous utilisez MySQL comme base de données, il existe une fonction spécifique LAST_INSERT_ID()qui ne fonctionne que sur la connexion actuelle qui a effectué l'insertion.
PHP propose une fonction spécifique pour cela aussi appelée mysql_insert_id.
En outre, c'est faux car cela suggère d'utiliser une bibliothèque obsolète. Vraiment, supprimez ceci
STT LCU
@STTLCU Quel extrait ici est obsolète?
TheBlackBenzKid
@TheBlackBenzKid les deux, car ils sont basés sur les fonctions mysql_ *
STT LCU
@Rahul $ id = last_insert_id (); ne fonctionne pas comme cela peut être obsolète.
Esha
3
Pour obtenir le dernier identifiant inséré dans codeigniter Après avoir exécuté la requête d'insertion, utilisez simplement une fonction appelée insert_id()sur la base de données, elle retournera le dernier identifiant inséré
Ex:
$this->db->insert('mytable',$data);
echo $this->db->insert_id();//returns last inserted id
C'est correct à utiliser mysql_insert_id(), mais il y a une note spécifique sur son utilisation, vous devez l'appeler après l'exécution de la requête INSERT, c'est-à-dire dans la même session de script. Si vous l'utilisez autrement, cela ne fonctionnerait pas correctement.
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Je préfère utiliser une pure syntaxe MySQL pour obtenir le dernier identifiant auto_increment de la table que je veux.
php mysql_insert_id () et mysql last_insert_id () ne donnent que le dernier ID de transaction.
Si vous voulez le dernier ID auto_incrémenté de n'importe quelle table de votre schéma (pas seulement la dernière transaction), vous pouvez utiliser cette requête
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA ='my_database'
AND TABLE_NAME ='my_table_name';
Je doute à ce sujet, car ce SQL est tout simplement faux dans le contexte de la question .... De plus, cette méthode semble sujette à des conditions de course possibles lorsque deux ou plusieurs clients exécutent ce SQL à peu près au même moment ... je ne suis pas sûr à quelle vitesse ces données de colonne sont mises à jour après une insertion qui me fait douter ... Les fonctions PHP qui peuvent obtenir le dernier identifiant sont basées sur le niveau de connexion / session (fait plus ou moins la même chose que LAST_INSERT_ID () de MySQL ), ce qui permet de sauvegarder la condition de course
Raymond Nijland
1
C'est triste de ne voir aucune réponse avec un exemple.
Utilisation de Mysqli :: $ insert_id :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id;// returns last ID
Utilisation de PDO :: lastInsertId :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId();// returns last ID
En utilisant la MySQLitransaction, je n'ai parfois pas pu obtenir mysqli::$insert_id, car elle retournait 0. Surtout si j'utilisais des procédures stockées, qui exécutaient INSERTs. Il existe donc un autre moyen dans la transaction:
Cela renvoie le dernier identifiant inséré de la connexion actuelle, donc si vous gérez correctement vos connexions, cela devrait fonctionner. A travaillé pour moi au moins.
Par toute cette discussion, je suppose que la raison de vérifier l'id max est de savoir quel id devrait être le prochain .. (si mon id max est 5 alors le suivant sera 5 + 1 = 6).
>> Si ce n'est pas la raison, mes meilleures excuses
Cas où quelqu'un d'autre INSERT des informations entre votre CHECK et INSERT vous donnerait un mauvais ID.
Il peut donc être résolu si vous créez un hachage qui pourrait inclure un horodatage ou une autre valeur unique.
Ensuite, dans la même fonction, vous pouvez insérer vos informations avec des valeurs vides et votre hachage. Cela créerait un ID si vous avez sélectionné AUTO_INCRECEMENT.
Ensuite, dans la même fonction, vous auriez toujours votre hachage et vous pourriez rechercher un identifiant avec le même hachage. Et puis vous pouvez compléter le remplissage des valeurs vides avec mysql UPDATE.
Cela inclut un peu plus de connexions, mais c'est toujours un moyen de le faire ...
Si votre table a une colonne AUTO INCREMENT comme UserID, Emp_ID, .. alors vous pouvez utiliser cette requête pour obtenir le dernier enregistrement inséré
SELECT * FROM table_name où UserID = (sélectionnez MAX (UserID)
dans table_name) Dans le code PHP:
$con = mysqli_connect('localhost','userid','password','database_name');if(!$con){die('Could not connect: '. mysqli_error($con));}
$sql ="SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
Ensuite, vous pouvez utiliser les données récupérées comme exigence
INSERT
et votre requête pourMAX(id)
, vous pouvez obtenir un identifiant qui n'est pas votre dernier identifiant.Réponses:
Si vous utilisez PDO, utilisez
PDO::lastInsertId
.Si vous utilisez Mysqli, utilisez
mysqli::$insert_id
.Si vous utilisez toujours Mysql:
Mais si vous devez, utilisez
mysql_insert_id
.la source
mysql_insert_id
juste après votremysql_query
. Si, bien sûr, vous exécutez plusieurs autres requêtes sur la même connexion entre les deux, rien ne peut vous y aider.PDO
biais que l'on voit partout? Regardons à nouveau la comparaison des fonctionnalités . Il est clair quemysqli
c'est le gagnant lorsque vous devez vous salir les mains avec des trucs de bas niveau. En d'autres termes, même si l'on choisit l'AOP, il devra éventuellement l'utiliser demysqli
toute façon.il y a une fonction pour savoir quel était le dernier identifiant inséré dans la connexion actuelle
De plus, l'utilisation de max est une mauvaise idée car cela pourrait entraîner des problèmes si votre code est utilisé en même temps dans deux sessions différentes.
Cette fonction s'appelle mysql_insert_id
la source
C'est bon. Vous pouvez également utiliser LAST_INSERT_ID ()
la source
select max(id)from table
c'est OK?Avec AOP :
Avec Mysqli :
Veuillez ne pas utiliser de
mysql_*
fonctions dans le nouveau code . Ils ne sont plus maintenus et sont officiellement obsolètes . Vous voyez la boîte rouge ? Renseignez-vousplutôtsur les instructions préparées et utilisez PDO ou MySQLi - cet article vous aidera à décider lesquelles. Si vous choisissez PDO, voici un bon tutoriel .la source
PDO
biais que nous ........Ce que vous avez écrit vous obtiendrait le meilleur en
id
supposant qu'ils étaient uniques et auto-incrémentés, ce qui serait bien en supposant que vous êtes d'accord pour inviter des problèmes de concurrence.Puisque vous utilisez MySQL comme base de données, il existe une fonction spécifique
LAST_INSERT_ID()
qui ne fonctionne que sur la connexion actuelle qui a effectué l'insertion.PHP propose une fonction spécifique pour cela aussi appelée
mysql_insert_id
.la source
Essayez ceci devrait fonctionner correctement:
la source
Vous pouvez obtenir le dernier identifiant inséré par la fonction php intégrée
mysql_insert_id();
vous pouvez également obtenir le dernier identifiant par
la source
Pour obtenir le dernier identifiant inséré dans codeigniter Après avoir exécuté la requête d'insertion, utilisez simplement une fonction appelée
insert_id()
sur la base de données, elle retournera le dernier identifiant inséréEx:
en une ligne
la source
C'est correct à utiliser
mysql_insert_id()
, mais il y a une note spécifique sur son utilisation, vous devez l'appeler après l'exécution de la requête INSERT, c'est-à-dire dans la même session de script. Si vous l'utilisez autrement, cela ne fonctionnerait pas correctement.la source
Propre et simple -
la source
REMARQUE: si vous faites plusieurs insertions avec une seule instruction mysqli :: insert_id ne sera pas correcte.
La table:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Maintenant si vous faites:
insert into xyz (name) values('one'),('two'),('three');
Le mysqli :: insert_id sera 1 et non 3.
Pour obtenir la valeur correcte, procédez comme suit:
mysqli::insert_id + mysqli::affected_rows) - 1
Cela a été documenté mais c'est un peu obscur.
la source
Je préfère utiliser une pure syntaxe MySQL pour obtenir le dernier identifiant auto_increment de la table que je veux.
php mysql_insert_id () et mysql last_insert_id () ne donnent que le dernier ID de transaction.
Si vous voulez le dernier ID auto_incrémenté de n'importe quelle table de votre schéma (pas seulement la dernière transaction), vous pouvez utiliser cette requête
C'est tout.
la source
C'est triste de ne voir aucune réponse avec un exemple.
Utilisation de Mysqli :: $ insert_id :
Utilisation de PDO :: lastInsertId :
la source
En utilisant la
MySQLi
transaction, je n'ai parfois pas pu obtenirmysqli::$insert_id
, car elle retournait 0. Surtout si j'utilisais des procédures stockées, qui exécutaientINSERT
s. Il existe donc un autre moyen dans la transaction:la source
Utilisez mysqli car mysql est dépréciant
la source
j'ai essayé
mysqli_insert_id ($ dbConnectionObj)
Cela renvoie le dernier identifiant inséré de la connexion actuelle, donc si vous gérez correctement vos connexions, cela devrait fonctionner. A travaillé pour moi au moins.
la source
Veuillez utiliser PDP et essayez ceci
la source
$ lastid = mysql_insert_id ();
la source
Par toute cette discussion, je suppose que la raison de vérifier l'id max est de savoir quel id devrait être le prochain .. (si mon id max est 5 alors le suivant sera 5 + 1 = 6).
>> Si ce n'est pas la raison, mes meilleures excuses
Cas où quelqu'un d'autre INSERT des informations entre votre CHECK et INSERT vous donnerait un mauvais ID.
Il peut donc être résolu si vous créez un hachage qui pourrait inclure un horodatage ou une autre valeur unique.
Ensuite, dans la même fonction, vous pouvez insérer vos informations avec des valeurs vides et votre hachage. Cela créerait un ID si vous avez sélectionné AUTO_INCRECEMENT.
Ensuite, dans la même fonction, vous auriez toujours votre hachage et vous pourriez rechercher un identifiant avec le même hachage. Et puis vous pouvez compléter le remplissage des valeurs vides avec mysql UPDATE.
Cela inclut un peu plus de connexions, mais c'est toujours un moyen de le faire ...
Bonne chance pour le résoudre.
la source
Si votre table a une colonne AUTO INCREMENT comme UserID, Emp_ID, .. alors vous pouvez utiliser cette requête pour obtenir le dernier enregistrement inséré SELECT * FROM table_name où UserID = (sélectionnez MAX (UserID) dans table_name) Dans le code PHP:
Ensuite, vous pouvez utiliser les données récupérées comme exigence
la source
la source