PHP中的SQLi参数化查询是否需要mysqlnd?

时间:2015-01-02 23:41:25

标签: php web-applications mysqli dynamic-queries mysqlnd

我已经了解了参数化查询如何成为防止SQL注入的方法,但令我惊讶的是,实现起来似乎比我想象的要复杂得多。

我在PHP中使用mysqli尝试了一个简单的SELECT语句,使用参数化查询,我收到一个致命的PHP错误,说明我在尝试检索查询结果时调用了一个未知方法。谷歌搜索后,它表明我需要安装mysqlnd并启用它来检索结果。我还发现默认情况下应该在PHP 5.4或更高版本上安装mysqlnd。我目前正在使用5.4.3,所以我希望它可以工作。

首先,我需要 mysqlnd来使用参数化查询,还是只有更高级的用户和查询才需要这样做?有没有mysqlnd可以使用的方法来检索结果?其次,如果我确实需要它,我如何在我的PHP中启用它?

PHP:

$stmt = $con->prepare("SELECT some_id FROM some_table WHERE name = ? AND user_id = '$user_id'");
$stmt->bind_param('s', $name);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with result
}

错误:

  

PHP致命错误:调用未定义的方法mysqli_stmt :: get_result()

1 个答案:

答案 0 :(得分:0)

如果您查看get_result的手册,确实说它需要mysqlnd扩展名:

  

仅适用于mysqlnd。

如果您只想从SELECT查询中获取结果,可以使用输出参数绑定,其基础为bind_result。这似乎不需要额外的扩展。

PHP manual here中有一些关于如何执行此操作的示例。我想get_result的好处是你可以读取列而不绑定它们。您应该能够在php.ini中启用它 - 可能默认情况下已注释掉了吗?

我没有像我所见过的那样亲自使用MySQLi,从帮助Stack Overflow,许多人对API感到沮丧。我一直使用PDO / mysql,没有理由切换。可能值得尝试一下,看看你是否喜欢它。