PHP / MySQL insérer une ligne puis obtenir 'id'

192

Le champ 'id' de ma table augmente automatiquement lorsque j'insère une ligne. Je veux insérer une ligne, puis 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 entre l'insertion de la ligne et l'obtention de l'identifiant?

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 important, il y aura des doublons, la seule différence étant l'id.

Hintswen
la source

Réponses:

255
$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 ne faites pas de " SELECT MAX(id) FROM mytable". Comme vous le dites, c'est une condition de course et ce n'est pas nécessaire. mysqli_insert_id()a déjà cette fonctionnalité.

cletus
la source
58
L'équivalent PDO est PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen
11
Cela fonctionne-t-il toujours s'il y a 10000 inserts asynchrones en même temps?
zie1ony
16
@ zie1ony Oui, cela fonctionnerait pour un million d'insertions asynchrones car MySQL est compatible ACID. Chaque insert individuel des nombreux insertions asynchrones se trouve dans sa propre session isolée , d'où provient l'ID lorsque vous appelez mysql_insert_id () depuis votre PHP (ou LAST_INSERT_ID () dans MySQL)
rodrigo-silveira
7
Sur le doc il y a quelque chose à noter: mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek
7
besoin de réécrire tout ce que j'ai jamais écrit -_-
de_nuit
39

La fonction MySQL LAST_INSERT_ID()fait exactement ce dont vous avez besoin: elle récupère l'identifiant qui a été inséré lors de 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) qui insèrent des valeurs dans la même table.

La fonction PHP mysql_insert_id()fait la même chose que l'appel SELECT LAST_INSERT_ID()avec mysql_query().

soulmerge
la source
2
NB echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); Le second mysql_insert_id()ne reflète pas 600, où comme le mysql_query('SELECT LAST_INSERT_ID()')fera. Pour que le mysql_insert_id()reflète le changement, vous devez d'abord effectuer une insertion ou une mise à jour (qui peut affecter 0 ligne). Voir le tout dernier paragraphe de: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife
28

Quant au site web de PHP, mysql_insert_id est désormais 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();
NaturelBornCamper
la source
4
Nous avons la possibilité d'utiliser PDO ou MySQLi (que je décris dans une autre réponse ici). Une bonne comparaison: code.tutsplus.com/tutorials/…
Luc
20

Comme l'a dit @NaturalBornCamper, mysql_insert_id est désormais obsolète et ne doit 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);

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

Luke
la source
Merci d'avoir attrapé ça. Je préfère vraiment la notation par points de Javascript à la notation de flèche de PHP. : /
Luke
7

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

Lors de la saisie de plusieurs lignes à la fois, il ne renvoie 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, c'est que je pousse dans my_tabledeux nouvelles lignes. L'identifiant de la table est auto-incrémenté. Ici, pour le même utilisateur, j'ajoute deux lignes avec un autre varNumb.

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

leMoisela
la source
s'en tenir à une opération à la fois - semble être la réponse globale pour toutes les méthodes utilisées, pour éviter les comportements inattendus
RozzA
1

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.

user1012181
la source
1

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);
?>

Jetez un œil aux 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 était obsolète dans PHP 5.5 et supprimée dans PHP 7.0

Murali
la source
1

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();
Yaseen Ahmed
la source
mysqlréponse non sécurisée , ne l'utilisez jamais.
RozzA
0

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);
    }
Uriateho
la source
-1

Une autre réponse possible sera:

Lorsque vous définissez la table, avec les colonnes et les données qu'elle contiendra. L'ID de colonne peut avoir la propriété AUTO_INCREMENT .

Par cette méthode, vous n'avez pas à vous soucier de l' identifiant , il sera créé 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: Ce n'est que la partie où vous définissez comment générer un ID automatique, pour l'obtenir après sa création, les réponses précédentes sont correctes.

néoSmith
la source
ce n'est pas du tout une réponse possible, OP déclare déjà utiliser l'incrémentation automatique (augmentations automatiques). OP veut récupérer cet identifiant généré automatiquement.
RozzA
D'accord, après avoir lu à nouveau, j'ai remarqué que le problème n'est pas seulement de générer l'identifiant, OP veut également obtenir cet identifiant. Merci pour la définition: D
neoSmith