提问人:MarkO 提问时间:4/21/2019 最后编辑:Nic3500MarkO 更新时间:1/12/2020 访问量:56
最后一个插入值始终返回零
Last insert value always returns zero
问:
尝试使用预准备语句获取最后一个插入的 ID。 始终返回零。mysqli_insert_id
$sql = "INSERT INTO classes (id_course, id_organization, start_date, end_date, status, id_creator, assign_interval) VALUES (?, ?, ?, ?, ?, ?, 'monthly')";
if ($stmt = mysqli_prepare($link, $sql)) {
if (!mysqli_stmt_bind_param($stmt, "ssssss", $course, $idOrg, $thisClass["startDate"], $endDate, $thisClass["status"], $idUser)) {
echo "Error:could not bind parameters";
}
# CODE MISSING...
{
mysqli_stmt_execute($stmt);
$idClass = mysqli_insert_id($stmt);
}
}
else
{
echo 'ERROR: Could not prepare statement';
}
$sql = "INSERT INTO class_modules (id_class, id_module) select ?,id_module from modules m where m.id_course = ?";
if ($stmt = mysqli_prepare($link, $sql)) {
if (!mysqli_stmt_bind_param($stmt, "ss", $idClass, $course)) {
echo "Error:could not bind parameters";
}
if (!mysqli_stmt_execute($stmt)) {
echo "Error: could not update class modules:";
}
}
else
{
echo 'ERROR: Could not prepare statement';
}
答:
0赞
Dharman
1/12/2020
#1
我强烈建议使用面向对象的方法。这样做的原因是您混淆了两个函数的参数。如果使用 OOP,则此错误不太可能发生。
有 4 种方法可以从 MySQLi 准备好的语句中获取自动生成的 ID:
var_dump($stmt->insert_id);
var_dump($mysqli->insert_id);
var_dump(mysqli_stmt_insert_id($stmt));
var_dump(mysqli_insert_id($mysqli));
正如你所看到的,前两个更干净,更容易理解和发现错误。你所做的混淆了最后两个。您使用了该语句,但您将其作为参数传入。更改函数名称或传递 mysqli 对象。最好的选择是使用 OOP 并获取属性值。mysqli_insert_id()
评论
mysqli_insert_id
不将语句作为参数,而是将链接作为参数。