【问题标题】: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 mysqli


【解决方案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。

      【讨论】:

        猜你喜欢
        • 2013-01-26
        • 1970-01-01
        • 2021-01-24
        • 2016-09-16
        • 2020-05-25
        • 2013-06-25
        • 1970-01-01
        • 2017-09-13
        相关资源
        最近更新 更多