PHP / MySQL вставити рядок, потім отримати "id"


192

Поле "id" моєї таблиці автоматично збільшується, коли я вставляю рядок. Я хочу вставити рядок, а потім отримати цей ідентифікатор.

Я би зробив це так, як я це сказав, але чи є спосіб я це зробити, не переживаючи про час між вставкою рядка та отриманням ідентифікатора?

Я знаю, що я можу запитати базу даних для рядка, який відповідає інформації, яка була введена, але є велика зміна, будуть дублікати, з тією лише різницею, що ідентифікатор.

Відповіді:


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

Див mysqli_insert_id().

Що б ви не робили, не вставляйте та не робіть " SELECT MAX(id) FROM mytable". Як ви кажете, це умова гонки і немає потреби. mysqli_insert_id()вже має цю функціональність.


58
Еквівалент PDO - PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Метью Флашен

11
Чи все ще працює, якщо одночасно буде 10000 асинхронних вставок?
zie1ony

16
@ zie1ony Так, це працювало б для мільйона асинхронних вставок, оскільки MySQL сумісний з ACID. Кожен вкладиш з багатьох асинхронних вставок в межах своєї власної ізольованою сесії, який де ID приходить від того, коли ви телефонуєте mysql_insert_id () з PHP (або LAST_INSERT_ID () в MySQL)
Rodrigo-Сільвейра

7
У документі є що зауважити: 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
потрібно переписати все, що я коли-небудь писав -_-
de_nuit

39

Функція MySQL LAST_INSERT_ID()робить саме те, що потрібно: вона отримує ідентифікатор, який було вставлено під час сеансу . Таким чином, це безпечно у використанні, навіть якщо є інші процеси (наприклад, інші, хто викликає точно той самий сценарій), вставляючи значення в ту саму таблицю.

Функція PHP mysql_insert_id()робить те ж саме , як виклик SELECT LAST_INSERT_ID()з mysql_query().


2
Примітка echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); : Другий mysql_insert_id()не відображає 600, де як mysql_query('SELECT LAST_INSERT_ID()')буде. Щоб mysql_insert_id()відобразити зміну, спершу потрібно вставити або оновити (що може вплинути на 0 рядків). Дивіться останній абзац: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Щодо веб-сайту 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();

4
У нас є можливість використовувати PDO або MySQLi (що я описую в іншій відповіді тут). Хороше порівняння: code.tutsplus.com/tutorials/…
Лука

20

Як сказав @NaturalBornCamper, тепер mysql_insert_id застарілий і не повинен використовуватися. Зараз можна використовувати або PDO, або mysqli. NaturalBornCamper пояснив PDO у своїй відповіді, тому я покажу, як це зробити з MySQLi ( MySQL покращено ) за допомогою 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


Дякуємо, що це зробили. Мені дуже подобається позначення точок Javascript над позначенням стрілки PHP. : /
Лука

7

Я просто хочу додати невелику деталь, що стосується lastInsertId();

Вводячи більше одного ряду одночасно, він повертає не останній Id , а перший Id колекції останніх вставок.

Розглянемо наступний приклад

$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це означає не ідентифікатор останнього рядка, а ідентифікатор першого рядка, який був доданий в останньому запиті.


дотримуйтесь однієї операції за один раз - здається, є загальною відповіддю на всі використовувані методи, щоб уникнути несподіваної поведінки
RozzA

1

Приклад.

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

У рядку коду $course_id = $query_new->insert_id;відображатиметься ідентифікатор останнього вставленого рядка. Сподіваюся, це допомагає.


1

Спробуйте так, ви можете отримати відповідь:

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

Перегляньте наступні посилання:

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

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

Також майте на увазі, що це розширення було знято з PHP 5.5 та видалено в PHP 7.0



0

Спробуйте це ... це працювало на мене!

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

-1

Інша можлива відповідь:

Коли ви визначаєте таблицю із стовпцями та даними, які вона матиме. Ідентифікатор стовпця може мати властивість AUTO_INCREMENT .

За допомогою цього методу вам не доведеться турбуватися про ідентифікатор , він буде зроблений автоматично .

Наприклад (взяті з 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)
)

Сподіваюся, це комусь буде корисним.

Редагувати: Це лише частина, де ви визначаєте, як створити автоматичний ідентифікатор, щоб отримати його після створеного, попередні відповіді раніше правильні.


це взагалі не є можливою відповіддю, ОП вже заявляє, що вони використовують автоматичне збільшення (автоматичне збільшення). OP хоче отримати цей автоматично створений ідентифікатор.
RozzA

Добре, прочитавши ще раз, я помітив, що проблема полягає не лише в створенні ідентифікатора, ОП також хочу отримати цей ідентифікатор. Дякую за визначення: D
neoSmith
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.