最后插入值始终返回零

Posted

技术标签:

【中文标题】最后插入值始终返回零【英文标题】:Last insert value always returns zero 【发布时间】:2019-09-10 15:48:55 【问题描述】:

尝试使用准备好的语句获取最后插入的 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';

【问题讨论】:

mysqli_insert_id 不接受语句作为参数,它接受链接。 【参考方案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_insert_id(),但您将语句作为参数传递。要么更改函数名称,要么改为传递 mysqli 对象。最好的选择是使用 OOP 并获取属性值。

【讨论】:

以上是关于最后插入值始终返回零的主要内容,如果未能解决你的问题,请参考以下文章

如何在 zf2 中获取最后插入的 id?

Mybatis selectKey不返回序列值

MySQL PHP插入新行,其中rowNum列值始终按日期和时间按时间顺序排列

无法将 varchar 空/空值插入或更新到始终加密的列中

addPersistentStoreWithType 为 iCloud 存储返回错误“尝试插入零密钥”

在Sql中执行插入命令并返回插入的Id