仅应通过引用传递变量 - 将 LIMIT 与 bindParam 一起使用时

Posted

技术标签:

【中文标题】仅应通过引用传递变量 - 将 LIMIT 与 bindParam 一起使用时【英文标题】:Only variables should be passed by reference - when using LIMIT with bindParam 【发布时间】:2018-06-19 09:14:24 【问题描述】:

我想将LIMITbindParam 一起使用,所以我构建了这个查询:

$app->get('/contact/get_contacts/contact_number', function (Request $request, Response $response, array $args)

    $query = "SELECT * FROM contact LIMIT :contact_number";
    $sql->bindParam("contact_number", intval($args["contact_number"]), PDO::PARAM_INT);
    $sql->execute();
    $result = $sql->fetchAll();
    return $response->withJson($result);
);

我收到此通知:

只有变量应该通过引用传递

我做错了什么?我正在使用Slim FrameworkPDO

【问题讨论】:

bindParam 的第二个参数应该是一个已经存在的变量,而不是函数的结果。将结果存储在变量中,然后在需要时使用它们。 @vuryss 感谢现在工作,但为什么我不能直接这样做? 删除intval 因为函数需要在某处存储结果。方法的返回值不是您可以存储值的地方。您试图在 intval 的响应中存储一个值,这是无效的操作。 【参考方案1】:

你需要改变:

$sql->bindParam("contact_number", intval($args["contact_number"]), PDO::PARAM_INT);

与,

$sql->bindParam(":contact_number", $args["contact_number"], PDO::PARAM_INT);
我在参数名称前添加了缺少的:。 我已删除 intval 函数调用,如果您仍想使用该函数,请在 bindParam 函数调用之外使用它。

根据函数定义:

public bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

绑定参数是variable by reference (&$variable)。

阅读材料

bindParam

【讨论】:

【参考方案2】:

您正在双重处理数据类型。在明确指定PDO::PARAM_INT 时,您不需要intval。只需删除intval 或查看bindValue 的原因:

$sql->bindValue(":contact_number", intval($args["contact_number"]));

【讨论】:

以上是关于仅应通过引用传递变量 - 将 LIMIT 与 bindParam 一起使用时的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递表达式与通过引用传递变量

第八章 函数幽探

通过引用将值类型变量传递给静态方法线程安全吗?

Python如何通过引用传递变量?

J2SE基础:2.对象的创建与使用

在 QueryRenderer 中传递中继现代变量