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.
$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é.
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()
.
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();
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
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.
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.
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();
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.
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);
}