【问题标题】:PDO: Pass a MySQL function to bindValue/bindParamPDO:将 MySQL 函数传递给 bindValue/bindParam
【发布时间】:2012-01-03 03:32:10
【问题描述】:

是否可以使用bindValue() 插入 MySQL 函数?我下面的代码只是输出为字符串'NOW()',而不是函数NOW()(不带引号)。

$sthandler->bindValue(1, 'NOW()');

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    没有。查询参数仅替代单个常量值。例如,数字常量或文字字符串或日期。

    其他任何东西——列名、表名、SQL 关键字、函数、表达式——在解析时都必须在 SQL 字符串中。


    你的评论:

    您应该明白,参数只是为了方便将额外的字符串插入到您的 SQL 中。 PREPARE 类似于 Java 或 C# 的编译阶段,而 EXECUTE 类似于运行已编译的代码。

    准备时间是 RDBMS 进行语法检查以及验证引用的时间。如果你命名一个不存在的表,或者调用一个不存在的函数,它一定会报错。

    您不能将表名或函数调用作为参数传递,因为这样 RDBMS 将无法在准备时验证这些引用。您不应使用查询参数来更改语句的语法,或引入无效的表或函数。

    所以参数占位符必须是不可约的句法元素,绝不是无效引用,即单个文字值——数字或字符串。

    【讨论】:

    • 所以你说的是我可以传递函数的唯一方法是通过实际的字符串。没有可能的例外?
    • 唯一可能的例外(您不应该使用)是将包含函数调用的字符串评估为 sql。本质上,您使用eval() for MySql
    【解决方案2】:

    不,因为准备好的语句中的占位符会自动转义。因此,在您的情况下,它会看到它是一个字符串,并且(至少)将它放在引号'NOW()' 中。现在它也只是 mysql 的一个字符串。您可以使用 PHP 设置当前日期时间

    $sthandler->bindValue(1, date('c'));
    

    【讨论】:

    • +1 很好的解决方法,它适用于我为参数描述的限制。不传递函数标识符,而是获取应用程序空间中等效函数返回的值,然后传递该值。此解决方法适用于 OP 的示例,因为它是一个常量表达式,而不是依赖于数据的表达式。
    猜你喜欢
    • 2014-07-28
    • 2011-04-13
    • 1970-01-01
    • 2013-02-15
    • 2014-08-20
    • 1970-01-01
    • 2012-02-04
    • 2023-03-28
    • 2011-01-11
    相关资源
    最近更新 更多