Php 准备好的语句以及它们如何影响查询

Php 准备好的语句以及它们如何影响查询,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,为了使我的脚本更加安全,我已经开始使用准备好的语句来防止mysql注入。这个脚本可以很好地插入数据,但是获取最后一个插入的id(基于数据库中的自动递增)现在返回0,而它应该返回正确的id号 这部分插入得很好 $stmt = $conn->prepare("INSERT INTO users (userName) VALUES (?)"); $stmt->bind_param("s", $_SESSION['username']); $stmt->execute(); 这就是我

为了使我的脚本更加安全,我已经开始使用准备好的语句来防止mysql注入。这个脚本可以很好地插入数据,但是获取最后一个插入的id(基于数据库中的自动递增)现在返回0,而它应该返回正确的id号

这部分插入得很好

$stmt = $conn->prepare("INSERT INTO users (userName) VALUES (?)");
$stmt->bind_param("s", $_SESSION['username']);
$stmt->execute();
这就是我遇到问题的地方。我正在尝试获取用户最后插入的ID,它返回0

// Get the last inserted ID for the users ID
$query = "SELECT LAST_INSERT_ID()";
$result = mysql_query($query);
if ($result) {
    $nrows = mysql_num_rows($result);
    $row = mysql_fetch_row($result);
    $userId = $row[0];
}
在开始准备语句之前,当我准备好脚本时,这是有效的。我唯一更改的是添加准备好的语句以插入数据,我的db连接如下所示:

$conn = new mysqli($server, $user, $password, $database) or die('Could not connect: ' . mysql_error());

我是php的新手,因此非常感谢您的帮助。

您可能有一个根本性的误解:当您切换到
mysqli
时,您的
mysql.*
函数将不再使用相同的连接

LAST\u INSERT\u ID()
根据每个连接工作


您必须使用与主查询相同的库/连接进行查询,或者正如@zerkms指出的那样,使用。

您可能有一个基本的误解:当您切换到
mysqli
时,您的
mysql.*
函数将不再使用相同的连接

LAST\u INSERT\u ID()
根据每个连接工作


您必须使用与主查询相同的库/连接进行查询,或者正如@zerkms指出的那样,使用。

这一行将完成此答案
$conn->insert_id
当您有API函数执行相同操作时,使用查询获取最后一个插入id是没有意义的。或者如果他想继续使用PDO,那么它就是
$PDO_con->lastInsertId()
-(事后看来:他没有使用PDO。只是暗示他应该使用。mysqli是一个中间API。)@vanneto通常是这样,但请注意API函数和LAST_INSERT_ID()有时会有细微的差异,至少在mysql_*库中:@Pekka和那些也有贡献的人。感谢你的回复,他们非常有用。我现在祈祷我能让这一切顺利进行。再次感谢。这一回答将以这一行完成
$conn->insert_id
使用没有意义当你有API函数来做同样的事情时,一个获取最后一个插入id的查询。或者如果他想继续使用PDO,那么它就是
$PDO\u con->lastInsertId()
-(事后看来:他不使用PDO。只是暗示他应该这样做。mysqli是一个中间API。)@vanneto通常是的,但请注意API函数和最后一个插入id()有时会有细微的差异,至少在mysql_*库中:@Pekka和那些也有贡献的人。谢谢你的回复,他们非常有帮助。我现在祈祷我能让这一切顺利进行。再次感谢。谢谢。我已经四处搜索过了,但都没有成功。你知道mysqli_insert_id()吗返回数据库中最后一个插入的行作为一个整体,还是每个会话?如果有多个用户正在插入,我想检索插入的用户的最后一个插入ID。@Jason,这是对
mysqli
对象的最后一次查询。谢谢。我已经到处搜索了,但没有成功。你知道mysqli_insert_id()返回数据库中最后一个插入的行作为一个整体,还是每个会话?如果有多个用户正在插入,我想检索进行插入的用户的最后一个插入的id。@Jason,这是对
mysqli
对象的最后一次查询。