web-dev-qa-db-fra.com

Comment obtenir le dernier ID inséré d'une table MySQL en PHP?

J'ai une table dans laquelle de nouvelles données sont fréquemment insérées. Je dois obtenir le dernier identifiant de la table. Comment puis-je faire ceci?

Est-ce similaire à SELECT MAX(id) FROM table?

85
gweg

Si vous utilisez PDO, utilisez PDO::lastInsertId .

Si vous utilisez Mysqli, utilisez mysqli::$insert_id .

Si vous utilisez toujours Mysql:

Veuillez ne pas utiliser les fonctions mysql_* dans le nouveau code . Ils ne sont plus maintenus et sont officiellement obsolètes . Voir la boîte rouge ? En savoir plus sur instructions préparées à la place, et utilisez PDO ou MySQLi - cet article vous aidera à choisir. Si vous choisissez PDO, voici un bon tutoriel .

Mais si vous devez le faire, utilisez mysql_insert_id .

122
deceze

il y a une fonction pour savoir quel était le dernier identifiant inséré dans la connexion en cours

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

de plus, utiliser max est une mauvaise idée, car cela pourrait conduire à problèmes si votre code est utilisé simultanément dans deux sessions différentes.

Cette fonction s'appelle mysql_insert_id

50
RageZ

C'est bon. Aussi, vous pouvez utiliser LAST_INSERT_ID ()

21
x2.

Avec PDO :

$pdo->lastInsertId();

Avec Mysqli :

$mysqli->insert_id;

Veuillez ne pas utiliser les fonctions mysql_* dans le nouveau code . Ils ne sont plus maintenus et sont officiellement obsolètes . Voir la boîte rouge ? En savoir plus sur instructions préparées à la place, et utilisez PDO ou MySQLi - cet article vous aidera à choisir. Si vous choisissez PDO, voici un bon tutoriel .

18
Neal

Utilisez mysql_insert_id () function.

Voir question similaire ici

9
NawaMan

Ce que vous avez écrit vous donnerait le meilleur id en supposant qu'ils étaient uniques et auto-incrémentés, ce qui serait bien si vous êtes prêt à 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 ayant effectué l’insertion.
PHP offre une fonction spécifique pour cela aussi appelé mysql_insert_id .

7
dlamblin

Vous pouvez obtenir le dernier identifiant inséré par la fonction php intégrée mysql_insert_id();

$id = mysql_insert_id();

vous obtenez également le dernier identifiant par

$id = last_insert_id();
4
Rahul

Il est correct d'utiliser mysql_insert_id(), .__, mais il y a une remarque spécifique à son utilisation, vous devez l'appeler après la requête INSERT exécutée, dans la même session de script. Si vous l'utilisez autrement, cela ne fonctionnera pas correctement.

3
Mihail Dimitrov

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, le dernier identifiant inséré sera renvoyé.

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

en une ligne

echo $this->db->insert('mytable',$data)->insert_id();
3
Narsimha

Essayez cela devrait bien fonctionner:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
3
Sandhu

C'est triste de ne voir aucune réponse avec un exemple.

Utiliser 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

Utiliser PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
1
Rust

Je préfère utiliser une syntaxe purement MySQL pour obtenir le dernier identifiant auto_increment de la table que je souhaite.

php mysql_insert_id () et mysql last_insert_id () ne donnent que le dernier identifiant de transaction.

Si vous voulez le dernier ID auto-incrémenté d'une table de votre schéma (pas seulement la dernière transaction 1), vous pouvez utiliser cette requête

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

C'est tout.

1
syjust

NOTE: si vous faites plusieurs insertions avec une seule instruction, mysqli :: insert_id ne sera pas correct.

La table:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Maintenant si vous le faites:

insert into xyz (name) values('one'),('two'),('three');

Mysqli :: insert_id sera 1 et non 3.

Pour obtenir la valeur correcte, faites:

mysqli::insert_id + mysqli::affected_rows) - 1

C'est un document mais c'est un peu obscur.

1
bartonlp

Propre et simple -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
1
Hitesh

J'ai essayé 

mysqli_insert_id ($ dbConnectionObj)

Cela renvoie le dernier identifiant inséré de la connexion actuelle. Si vous gérez correctement vos connexions, cela devrait fonctionner. Travaillé pour moi au moins. 

0
user2166373

Utiliser mysqli as mysql est en train de nuire 

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
0
Poorna Rao

S'il vous plaît utiliser PDP, puis essayez ceci 

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
0
Humphrey

À l'aide de la transaction MySQLi, je n'ai parfois pas pu obtenir mysqli::$insert_id, car il renvoyait 0. Surtout si j'utilisais des procédures stockées, cela exécutait INSERTs. Donc, il y a une autre manière dans la transaction:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
0
BlitZ