在mysqli预处理语句程序样式中获取最后一个插入id的正确方法是什么?

时间:2014-08-10 08:06:55

标签: php mysqli prepared-statement

我正在使用mysqli预处理语句在表格中插入记录

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

/* check connection */
if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

/* execute prepared statement */
mysqli_stmt_execute($stmt);

if(mysqli_stmt_affected_rows($stmt) > 0){
//if insert is successful then get the insrted id.


}

/* close statement and connection */
mysqli_stmt_close($stmt);

/* close connection */
mysqli_close($link);

并希望得到最后一个插入的id,因为该表有record_num字段,它是自动增量。

所以我的问题是我应该在函数中放置连接名称还是语句名称。

即 1)

echo mysqli_insert_id($link);

来源:http://php.net/manual/en/mysqli.insert-id.php

2)

echo mysqli_stmt_insert_id($stmt);

来源:http://php.net/manual/en/mysqli-stmt.insert-id.php

哪一个是正确的? 哪一个会通过$ stmt给我最后一个ins id?

  • 没有其他插件正在使用相同的stmt同一页面进行.. *

更新

根据http://php.net/manual/en/mysqli-stmt.insert-id.php

的说明

我只做一次插入所以我想我可以使用

mysqli_stmt_insert_id($stmt)

但是在使用

使用预准备语句进行多次插入时
echo mysqli_insert_id($link);

是最佳做法。

3 个答案:

答案 0 :(得分:4)

你应该使用

mysqli_insert_id($link);

由于PHP手册中的这个注释,您将我们引用到

mysqli_stmt_insert_id

  

应该注意的是,使用mysqli_stmt-> insert_id不会导致为每次执行准备好的insert语句返回唯一ID。实际上,似乎返回了第一个插入ID。如果您使用相同的预准备语句执行多个插入(一次调用mysqli_stmt :: prepare以及对给定语句多次调用mysqli_stmt :: execute()),并且需要保留每个插入的唯一ID,请使用mysqli_connection-&gt ; INSERT_ID。

答案 1 :(得分:1)

您需要在代码下面使用过程语言, mysqli_insert_id($链接));

是的,正如你在1点提到的那样。

答案 2 :(得分:1)

正确是1) - 链接,如文档中所述:

http://php.net/manual/en/mysqli.insert-id.php