我有以下代码。 mysqli_insert_id()(在本例中为“$ last_row”),它应该返回表的最后一行,总是返回0.为什么会这样?
<?php
include('connect-db.php');
$submit_date = date("Ymd");
$content = mysqli_real_escape_string($connection, htmlspecialchars($_POST['editor']));
$ip_address = $_SERVER['REMOTE_ADDR'];
$last_row = mysqli_insert_id($connection);
if ($content != '') {
$sql = "INSERT INTO source ( track_id, submit_date, ip, content) VALUES ('$last_row', '$submit_date','$ip_address','$content')";
if (!mysqli_query($connection,$sql))
{
die('Error: ' . mysqli_error($connection));
}
echo $last_row;
mysqli_close($connection);
}
?>
答案 0 :(得分:20)
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);
答案 1 :(得分:16)
要获得结果,您应该放置
$last_row = mysqli_insert_id($connection);
INSERT查询后
答案 2 :(得分:1)
对于来到这里的其他人,也许您尝试了INSERT IGNORE INTO
,并且您已经插入了UNIQUE
值。在这种情况下,此id为零。
你也会得到&#34;零&#34;如果MySQL用完了连接。我不是持久连接的专家,但这可能对某人有帮助吗?
正如您可能知道PHP“mysql”扩展支持持久化 连接但它们在新的“mysqli”扩展中被禁用 - 彼得·扎伊采夫
答案 3 :(得分:0)
具有此功能的另一个陷阱-如果您正在这样做:
INSERT INTO table (col1, col2) VALUES (1, 2) ON DUPLICATE KEY UPDATE col2=3
并且由于重复的密钥和UPDATE
不会发生插入,就像我的情况一样,如果col2
已经设置为3
,则mysqli_insert_id
也会返回0。