【问题标题】:Is mysqlnd necessary for SQLi parameterised queries in PHP?PHP中的SQLi参数化查询是否需要mysqlnd?
【发布时间】:2015-03-01 06:05:23
【问题描述】:

我已经阅读了参数化查询是如何预防 SQL 注入的,但令我惊讶的是,它的实现似乎比我想象的要复杂。

我尝试使用参数化查询在 PHP 中使用 mysqli 执行简单的 SELECT 语句,但我收到了一个致命的 PHP 错误,指出我在尝试检索查询结果时调用了未知方法。谷歌搜索后,它指出我需要安装并启用 mysqlnd 以检索结果。我还发现mysqlnd 应该默认安装在 PHP 5.4 或更高版本上。不过我目前使用的是 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()

【问题讨论】:

  • 我们可以看看你的代码,编辑成问题吗?什么方法不知道?
  • @halfer 添加了代码和错误消息。

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


【解决方案1】:

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

仅适用于 mysqlnd。

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

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

我没有亲自使用过 MySQLi,因为我在 Stack Overflow 上提供了帮助,许多人对 API 感到沮丧。我一直使用 PDO/mysql 并认为没有理由切换。可能值得一试,看看你是否喜欢它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多