web-dev-qa-db-fra.com

PHP / MySQL insère une ligne puis obtient 'id'

Le champ 'id' de ma table auto augmente lorsque j'insère une ligne. Je veux insérer une ligne et ensuite obtenir cet identifiant.

Je le ferais exactement comme je l'ai dit, mais y a-t-il un moyen de le faire sans me soucier du temps qui s'écoule entre l'insertion de la ligne et l'obtention de l'identifiant?

Je sais que je peux interroger la base de données pour connaître la ligne qui correspond aux informations saisies, mais il y a beaucoup de changements, il y aura des doublons, la seule différence étant l'id.

188
Hintswen
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

Voir mysqli_insert_id() .

Quoi que vous fassiez, n'insérez pas et faites ensuite un "SELECT MAX(id) FROM mytable". Comme vous le dites, c'est une situation de concurrence critique et inutile. mysqli_insert_id() a déjà cette fonctionnalité.

250
cletus

La fonction MySQL LAST_INSERT_ID() fait exactement ce dont vous avez besoin: elle récupère l'identifiant qui a été inséré pendant cette session . Ainsi, son utilisation est sûre, même s'il existe d'autres processus (d'autres personnes appelant exactement le même script, par exemple) insérant des valeurs dans la même table.

La fonction PHP mysql_insert_id() équivaut à appeler SELECT LAST_INSERT_ID() avec mysql_query().

39
soulmerge

En ce qui concerne le site Web de PHP, mysql_insert_id est maintenant obsolète et nous devons utiliser PDO. Pour ce faire avec PDO, procédez comme suit:

$db = new PDO('mysql:dbname=database;Host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute( array(':name' => 'Bob', ':city' => 'Montreal') );

echo $db->lastInsertId();
28
NaturalBornCamper

Comme @NaturalBornCamper l'a dit, mysql_insert_id est maintenant obsolète et devrait ne pas être utilisé . Les options sont maintenant d'utiliser PDO ou mysqli. NaturalBornCamper a expliqué PDO dans sa réponse. Je vais donc montrer comment le faire avec MySQLi ( MySQL Improved ) en utilisant - mysqli_insert_id .

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

Consultez la documentation PHP pour plus d'exemples: http://php.net/manual/en/mysqli.insert-id.php

20
Luke

Je veux juste ajouter un petit détail concernant lastInsertId();

Lorsque vous entrez plusieurs lignes à la fois, le dernier identifiant n'est pas renvoyé, mais le premier identifiant de la collection des dernières insertions.

Considérez l'exemple suivant

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

Ce qui se passe ici, c’est que j’ajoute my_table deux nouvelles lignes. L'identifiant de la table est auto-incrémenté. Ici, pour le même utilisateur, j’ajoute deux lignes avec un varNumb différent.

La valeur renvoyée à la fin sera égale à l'id de la ligne où varNumb=1, ce qui signifie pas l'id de la dernière dernière ligne, mais l'identifiant de la première ligne qui a été ajouté dans la dernière demande.

7
leMoisela

Essayez comme ça, vous pouvez obtenir la réponse:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

Regardez les liens suivants:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

http://php.net/manual/en/function.mysql-insert-id.php

Veuillez également noter que cette extension est obsolète dans PHP 5.5 et supprimée dans PHP 7.0.

1
Murali

J'ai trouvé une réponse dans le lien ci-dessus http://php.net/manual/en/function.mysql-insert-id.php

La réponse est:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");        
echo $Id=mysql_insert_id();
1
Yaseen Ahmed

Un exemple.

    $query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)";
    $query_new = $databaseConnection->prepare($query_new);
    $query_new->bind_param('s', $_POST['coursename']);
    $query_new->execute();
    $course_id = $query_new->insert_id;
    $query_new->close();

La ligne de code $course_id = $query_new->insert_id; affichera l'ID de la dernière ligne insérée. J'espère que cela t'aides.

1
user1012181

Essayez ceci ... cela a fonctionné pour moi!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }
0
uriateho