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

时间:2010-12-15 01:07:59

标签: php mysqli prepared-statement

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

这部分插入就好了。

$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];
}

当我在准备好的陈述开始之前获得我的脚本时,这是有效的。我唯一改变的是添加Prepared语句来插入数据,我的数据库连接如下:

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

我是一个使用php的菜鸟,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:4)

您可能有一个根本的误解:当您切换到mysqli时,您的mysql_*功能将不再使用相同的连接。

LAST_INSERT_ID()适用于每个连接。

您必须使用与主查询相同的库/连接进行查询,或者@zerkms指出,使用$conn->insert_id

答案 1 :(得分:1)