21

我有以下代码。应该返回表的最后一行的 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);
}
4

4 回答 4

29

mysqli_insert_id不返回最后一行的 ID。从文档中,它:

...返回由对具有 AUTO_INCREMENT 属性的列的表的查询生成的 ID。如果最后一个查询不是INSERTorUPDATE语句,或者修改后的表没有具有该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);
于 2013-03-11T06:14:40.960 回答
20

要获得结果,您应该将

$last_row = mysqli_insert_id($connection);

在您的 INSERT 查询之后

于 2013-03-11T06:17:31.150 回答
3

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

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

您可能知道 PHP “mysql” 扩展支持持久连接,但它们在新的“mysqli”扩展中被禁用——Peter Zaitsev

于 2015-06-02T01:57:06.383 回答
0

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

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

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

于 2020-01-13T01:37:28.193 回答