为啥 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。如果最后一个查询不是
INSERT
或UPDATE
语句,或者如果修改后的表没有具有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?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Boost.Asio SSL 请求返回 405 Not Allowed?