我已经了解了参数化查询如何成为防止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()
答案 0 :(得分:0)
如果您查看get_result
的手册,确实说它需要mysqlnd
扩展名:
仅适用于mysqlnd。
如果您只想从SELECT
查询中获取结果,可以使用输出参数绑定,其基础为bind_result
。这似乎不需要额外的扩展。
在PHP manual here中有一些关于如何执行此操作的示例。我想get_result
的好处是你可以读取列而不绑定它们。您应该能够在php.ini
中启用它 - 可能默认情况下已注释掉了吗?
我没有像我所见过的那样亲自使用MySQLi,从帮助Stack Overflow,许多人对API感到沮丧。我一直使用PDO / mysql,没有理由切换。可能值得尝试一下,看看你是否喜欢它。