为啥 mysqli_insert_id() 总是返回 0?

Posted

技术标签:

【中文标题】为啥 mysqli_insert_id() 总是返回 0?【英文标题】:Why is mysqli_insert_id() always returning 0?为什么 mysqli_insert_id() 总是返回 0? 【发布时间】:2013-02-26 06:08:03 【问题描述】:

我有以下代码。 mysqli_insert_id()(在本例中为“$last_row”)应该返回表的最后一行,但总是返回 0。为什么会这样?

<?php

include 'connect-db.php';
$last_row = mysqli_insert_id($connection);

if ($content != '') 
    $sql = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";

    if (!mysqli_query($connection, $sql)) 
        die('Error: ' . mysqli_error($connection));
    

    echo $last_row;
    mysqli_close($connection);

【问题讨论】:

"返回值:由上一个查询更新的 AUTO_INCREMENT 字段的值。如果连接上没有上一个查询或查询没有更新,则返回零一个 AUTO_INCREMENT 值" 看:php.net/manual/en/mysqli.insert-id.php 【参考方案1】:

mysqli_insert_id 确实返回表格最后一行的 ID。来自the docs,它:

...返回由对具有 AUTO_INCREMENT 属性的列的表的查询生成的 ID。如果最后一个查询不是INSERTUPDATE 语句,或者如果修改后的表没有具有AUTO_INCREMENT 属性的列,则此函数将返回零

(我的重点)

也就是说,如果您要在自动生成 ID 的插入之后立即运行它,在您执行插入的同一连接上,它将返回为该插入生成的 ID。

上面链接的文档中的示例说明了这一点:

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

【讨论】:

【参考方案2】:

要得到结果,你应该把

$last_row = mysqli_insert_id($connection);

在您的 INSERT 查询之后

【讨论】:

在 mysqli_insert_id() 中指定 $connection 很重要。否则无法检索到 ID。 对于任何遇到我同样问题的人,使用 $stmt->insert_id 并且它总是返回 1。我必须关闭语句,然后使用 mysqli_insert_id 获取 id 才能插入实际的 id。跨度> 【参考方案3】:

也许您尝试了INSERT IGNORE INTO 并且您已经插入了UNIQUE 值。在这种情况下,此 id 为零。

此外,如果 MySQL 用完连接,您将得到“零”。

您可能知道 PHP “mysql” 扩展支持持久化 连接,但它们在新的“mysqli”扩展中被禁用 ——彼得·扎伊采夫

【讨论】:

【参考方案4】:

这个功能的另一个问题——如果你正在这样做:

INSERT INTO table (col1, col2) VALUES (1, 2) ON DUPLICATE KEY UPDATE col2=3

并且插入不会发生,因为重复键和UPDATE,就像在我的情况下,如果col2 已经设置为3,那么mysqli_insert_id 也将返回0。

【讨论】:

以上是关于为啥 mysqli_insert_id() 总是返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥函数返回的值总是 null 或 undefined?

为啥 Boost.Asio SSL 请求返​​回 405 Not Allowed?

最后插入值始终返回零

如何获取 MySQL 中最后更新行的 ID?

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

为啥集合名称总是复数? [复制]