PHP / MySQL вставл¤ем строку, затем получаем 'id'

ѕоле Ђidї моей таблицы auto увеличиваетс¤, когда ¤ вставл¤ю строку. я хочу вставить строку, а затем получить этот идентификатор.

я бы сделал это, как ¤ сказал, но есть ли способ, которым ¤ могу это сделать, не беспоко¤сь о времени между вставкой строки и получением идентификатора?

я знаю, что могу запросить базу данных дл¤ строки, котора¤ соответствует введенной информации, но есть большие изменени¤, будут дубликаты, с той лишь разницей, что это id.

php,mysql,

183

Ответов: 10


240 голосов прин¤то
$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);

—м mysqli_insert_id().

„то бы вы ни делали, не вставл¤йте, а затем делайте Ђ SELECT MAX(id) FROM mytableї.  ак вы говорите, это состо¤ние гонки, и нет необходимости. mysqli_insert_id()уже имеет эту функциональность.


39

‘ункци¤ MySQL LAST_INSERT_ID()выполн¤ет именно то, что вам нужно: она извлекает идентификатор, который был вставлен во врем¤ этого сеанса . “аким образом, это безопасно использовать, даже если есть другие процессы (например, другие люди называют тот же самый скрипт), встав뤤 значени¤ в одну и ту же таблицу.

‘ункци¤ PHP mysql_insert_id()делает то же самое , как вызов SELECT LAST_INSERT_ID()с mysql_query().


26

„то касаетс¤ веб-сайта PHP, mysql_insert_id теперь устарел, и мы должны использовать PDO. „тобы сделать это с помощью PDO, действуйте следующим образом:

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

 ак сказал @NaturalBornCamper, mysql_insert_id теперь устарел и не должен использоватьс¤. “еперь параметры будут использовать либо PDO, либо mysqli. NaturalBornCamper объ¤снил PDO в своем ответе, поэтому ¤ покажу, как это сделать с MySQLi ( MySQL Improved ) с помощью 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);

ќзнакомьтесь с документацией PHP дл¤ получени¤ дополнительных примеров: http://php.net/manual/en/mysqli.insert-id.php


я просто хочу добавить небольшую деталь lastInsertId();

ѕри вводе более чем одной строки в то врем¤ он не возвращает последний идентификатор , а первый идентификатор коллекции последних вставок.

–ассмотрим следующий пример

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

„то здесь происходит, так это то, что ¤ нажимаю my_tableдве новые строки. »дентификатор таблицы ¤вл¤етс¤ автоматическим приращением. «десь дл¤ одного и того же пользовател¤ ¤ добавл¤ю две строки с разными varNumb.

Ёхо-значение в конце будет равно идентификатору строки, где varNumb=1это означает не идентификатор последней строки, а идентификатор первой строки, который был добавлен в последнем запросе.

PHP, MySQL,
Похожие вопросы