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

192

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

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

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

Hintswen
источник

Ответы:

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. Каждая отдельная вставка из множества асинхронных вставок находится в своем собственном изолированном сеансе, откуда берется идентификатор, когда вы вызываете mysql_insert_id () из вашего PHP (или LAST_INSERT_ID () в MySQL)
rodrigo-silveira
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.\
Эльбек
7
нужно переписать все, что я когда-либо писал -_-
de_nuit
39

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

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

soulmerge
источник
2
NB 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/ru/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();
NaturalBornCamper
источник
4
У нас есть возможность использовать либо PDO, либо MySQLi (что я опишу в другом ответе здесь). Хорошее сравнение: code.tutsplus.com/tutorials/…
Лука
20

Как сказал @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

Люк
источник
Спасибо, что поймали это. Я действительно предпочитаю точечную нотацию Javascript над нотацией стрелок PHP. : /
Люк
7

Я просто хочу добавить небольшую деталь относительно 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, что означает не идентификатор последней строки, а идентификатор первой строки, добавленной в последнем запросе.

leMoisela
источник
придерживайтесь одной операции за раз - кажется, это общий ответ для всех используемых методов, чтобы избежать неожиданного поведения
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;будет отображаться идентификатор последней вставленной строки. Надеюсь это поможет.

user1012181
источник
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

Murali
источник
1

Я нашел ответ в приведенной выше ссылке http://php.net/manual/en/function.mysql-insert-id.php

Ответ:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");        
echo $Id=mysql_insert_id();
Ясен Ахмед
источник
небезопасный mysqlответ, никогда не используйте его.
RozzA
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);
    }
uriateho
источник
-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)
)

Надеюсь, это будет полезно для кого-то.

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

neoSmith
источник
это вообще невозможный ответ, OP уже заявляет, что они используют автоинкремент (авто увеличение). ОП хочет получить этот автоматически сгенерированный идентификатор.
RozzA
Хорошо, прочитав еще раз, я заметил, что проблема заключается не только в создании идентификатора, OP также хочет получить этот идентификатор. Спасибо за определение: D
neoSmith