PHP / MySQL вставьте строку, затем получите 'id' - PullRequest
188 голосов
/ 22 мая 2009

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

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

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

Ответы [ 10 ]

250 голосов
/ 22 мая 2009
$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 голосов
/ 22 мая 2009

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

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

28 голосов
/ 30 июля 2012

Что касается сайта 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();
20 голосов
/ 25 августа 2013

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

7 голосов
/ 14 декабря 2012

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

Возвращаемое значение в конце будет равно id строки, где varNumb=1, что означает не идентификатор последней строки, а идентификатор первой строки, которая была добавлена ​​в последний запрос.

1 голос
/ 23 декабря 2015

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

Ответ:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");        
echo $Id=mysql_insert_id();
1 голос
/ 12 сентября 2015

Попробуйте вот так вы можете получить ответ:

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

1 голос
/ 21 октября 2014

Пример.

    $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; будет отображаться идентификатор последней вставленной строки. Надеюсь это поможет.

0 голосов
/ 11 июля 2018

Попробуй это ... у меня сработало!

$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);
    }
0 голосов
/ 27 ноября 2016

Другой возможный ответ будет:

Когда вы определите таблицу со столбцами и данными, она будет иметь. Идентификатор столбца может иметь свойство AUTO_INCREMENT .

С помощью этого метода вам не нужно беспокоиться о id , он будет * автоматически .

Например (взято из 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)
)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...