Вернуть идентификатор последней вставки MySQL в PHP

Я пытаюсь получить идентификатор последней вставленной строки автоинкремента и не могу успешно получить его.

error_reporting(E_ALL);
ini_set('display_errors', 1);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$title = mysqli_real_escape_string($conxn,$_POST['blog_title']);
$entry = mysqli_real_escape_string($conxn,$_POST['blog_entry']);
$sourceName = mysqli_real_escape_string($conxn,$_POST['blog_source_name']);
$sourceLink = mysqli_real_escape_string($conxn,$_POST['blog_source_link']);

if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$title','$entry','$sourceName','$sourceLink')";

$lastID = $mysqli->insert_id;

if (!mysqli_query($conxn,$sql)) {
die('Error: ' . mysqli_error($conxn));
}

Когда я эхом $lastID "0" возвращается после каждой отправки.

1 ответ

Решение

Вам нужно разместить $mysqli->insert_id() после фактического mysqli_query(), Увидеть ниже.

if (!mysqli_query($conxn,$sql)) {
  die('Error: ' . mysqli_error($conxn));
}

$lastID = $mysqli->insert_id;

Тем не менее, есть другие проблемы с вашим кодом. Прежде всего, вы путаете объектно-ориентированный стиль вызова mysqli_* с процедурным стилем. Например, метод ООП $mysqli->real_escape_string приравнивается к процессуальному методу mysqli_real_escape_string,

Итак, это:

$lastID = $mysqli->insert_id;

Должно быть так:

$lastID = mysqli_insert_id($conxn);

Так что, не видя остальной части вашего кода, непонятно, как с этим справиться. Знай разницу и экспериментируй. Но вот мои добросовестные предложения, основанные на коде, который вы представили.

Например, ваши ссылки на $_POST значения не имеют одинарных кавычек, поэтому я добавил это. Кроме того, поскольку вы используете двойные кавычки - которые обрабатывают подстановку строк - вы можете сжать INSERT настройка переменной, избавившись от . конкатенации.

$title = mysqli_real_escape_string($conxn, $_POST['blog_title']);
$entry = mysqli_real_escape_string($conxn, $_POST['blog_entry']);
$sourceName = mysqli_real_escape_string($conxn, $_POST['blog_source_name']);
$sourceLink = mysqli_real_escape_string($conxn, $_POST['blog_source_link']);

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$title','$entry','$sourceName','$sourceLink')";

if (!mysqli_query($conxn,$sql)) {
  die('Error: ' . mysqli_error($conxn));
}

$lastID = mysqli_insert_id($conxn);

После этого этот фрагмент кода можно очистить еще больше, и вот как я справлюсь с этим. Я сделал массив из $_POST значения, которые вы захватываете, поэтому вам не нужно повторять код. Также добавлены комментарии, чтобы было понятнее, что происходит. И я использовал процедурный формат для всех команд здесь. Если вам нужен ООП, вам нужно изменить все команды в соответствии с форматом ООП.

// Set all of the `$_POST` values into an array.
$post_items = array('blog_title','blog_entry','blog_source_name', 'blog_source_link');

// Roll through those values with a `foreach` loop.
foreach ($post_items as $post_item) {
  $$post_item = mysqli_real_escape_string($conxn, $_POST[$post_item]);
}

// MySQL connection error check.
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// Set the SQL values.
$sql = "INSERT INTO blog (blog_title, blog_entry, blog_source, blog_link)
VALUES ('$blog_title','$blog_entry','$blog_source_name','$blog_source_link')";

// Run the query.
if (!$mysqli_query($conxn, $sql)) {
  die('Error: ' . mysqli_error($conxn));
}

// Get the last insert ID via object oriented method.
// $lastID = $mysqli->insert_id;

// Get the last insert ID via procedural method.
$lastID = mysqli_insert_id($conxn);
Другие вопросы по тегам