Вернуть идентификатор последней вставки 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);