PHP / MySQL insérer une ligne puis obtenir 'id'
Le champ 'id' de ma table automatique augmente lorsque j'insère une ligne. Je veux insérer une ligne, puis obtenir l'IDENTIFIANT.
Je le ferais comme je l'ai dit, Mais y a-t-il un moyen de le faire sans me soucier du temps entre l'insertion de la ligne et l'obtention de l'id?
Je sais que je peux interroger la base de données pour la ligne qui correspond aux informations entrées, mais il y a un changement élevé, il y aura des doublons, la seule différence étant l'id.
10 réponses
$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 condition de course et il n'y a pas besoin. mysqli_insert_id()
a déjà cette fonctionnalité.
La fonction MySQL LAST_INSERT_ID()
fait exactement ce dont vous avez besoin: il récupère l'id qui a été inséré pendant cette session. Il est donc sûr à utiliser, 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()
fait la même chose que l'appel de 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 l'a dit @NaturalBornCamper, mysql_insert_id est maintenant obsolète et devrait Pas être utilisé. Les options sont maintenant D'utiliser PDO ou mysqli. NaturalBornCamper a expliqué PDO dans sa réponse, donc je vais montrer comment le faire avec MySQLi (MySQL amélioré ) 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);
Découvrez 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 plus d'une ligne à la fois, il ne retourne pas le dernier Id, mais le premier Id de la collection des dernières insertions.
Prenons 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 est que je pousse dans my_table
Deux nouvelles lignes. L'id de la table est auto-incrément. Ici, pour le même utilisateur, j'ajoute deux lignes avec un varNumb
différent.
La valeur en écho à la fin sera égale à l'id du ligne où varNumb=1
, ce qui signifie pas l'id de la , dernier de la ligne, mais l'id de la première ligne qui a été ajouté dans la dernière demande.
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;
affiche l'ID de la dernière ligne insérée.
Espérons que cette aide.
Essayez comme ceci, 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
Notez également que cette extension a été obsolète en PHP 5.5 et supprimée en 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();
Essayez ceci... il a travaillé 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);
}
Une autre réponse possible sera:
Lorsque vous définissez la table, avec les colonnes et les données aurez. L'id de colonne peut avoir la propriété AUTO_INCREMENT.
Par cette méthode, vous n'avez pas à vous soucier de la id, cell être fait automatiquement.
Par exemple (tiré de w3schools)
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)
J'espère que cela sera utile pour quelqu'un.
Edit: c'est seulement la partie où vous définissez comment générer un automatique ID, pour l'obtenir après créé, les réponses précédentes avant sont correctes.