【问题标题】:PDO not working when using MONTH() in query在查询中使用 MONTH() 时 PDO 不起作用
【发布时间】:2014-08-07 19:41:54
【问题描述】:

我正在尝试执行 PDO 查询,但它返回零结果。但是当我在 MySQL 中运行查询时,它会返回两行。仅当我在 PDO 查询中添加 MONTN(column) 时才会出现此问题。

我在 PHP 中拥有的是这样的:

$sql = 'SELECT * FROM payment WHERE  `user_id` = :userid_53e3d3275e364  AND  MONTH(pay_date) = :monthpaydate_53e3d3275e373  ORDER BY `pay_date` DESC';

$bindings = array ( 'userid_53e3d3275e364' => 8, 
                    'monthpaydate_53e3d3275e373' => 'MONTH(CURDATE())' );


$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $bindings );
$result = $stmt->fetchAll ( \PDO::FETCH_CLASS, $class, $ctorArgs );

此代码$result 为空。

当我手动将绑定值粘贴到查询中并在 phpMyAdmin 中运行它时,我会返回两条记录(这是我所期望的):

SELECT * 
FROM payment
WHERE  `user_id` = 8
AND MONTH(pay_date) = MONTH(CURDATE()) 
ORDER BY `pay_date` DESC

当我在没有MONTH(CURDATE()) 的情况下运行上述 PDO 代码时,PDO 也会返回记录:

$sql = 'SELECT * FROM payment WHERE  `user_id` = :userid_53e3d3275e364 ORDER BY `pay_date` DESC';
$bindings = array ( 'userid_53e3d3275e364' => 8 );

$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $bindings );
$result = $stmt->fetchAll ( \PDO::FETCH_CLASS, $class, $ctorArgs );

但由于某种原因,当我将 MONTH(CURDATE()) 作为绑定值时,某处似乎出了问题。

有没有办法解决这个问题?

【问题讨论】:

  • 您不能将表达式与函数调用绑定到参数。它将作为字符串“传输”。但是这个表达式不需要使用参数。只需在查询中使用它。

标签: php mysql pdo


【解决方案1】:

这个:

$bindings = array ( 'userid_53e3d3275e364' => 8, 
                    'monthpaydate_53e3d3275e373' => 'MONTH(CURDATE())' );

它不是那样工作的。 PDO 无法绑定 mysql 函数。它只能绑定硬数据。

你不应该绑定它。而是将其放在您的查询中。

$sql = 'SELECT * FROM payment WHERE  `user_id` = :userid_53e3d3275e364  AND  MONTH(pay_date) =  MONTH(CURDATE())  ORDER BY `pay_date` DESC';

$bindings = array ( ':userid_53e3d3275e364' => 8 );

附:也正如 Félix Gagnon-Grenier 所说,您需要在参数中使用“:”。

【讨论】:

    【解决方案2】:

    CURDATE()NOW() 之类的内容必须出现在查询中,而不是值中:

    $sql = 'SELECT * FROM payment WHERE  `user_id` = :userid_53e3d3275e364  AND  MONTH(CURDATE()) = :monthpaydate_53e3d3275e373  ORDER BY `pay_date` DESC';
    

    这样做的原因很合乎逻辑:参数被传递,因此它们不需要由 mySQL 评估(由 mySQL 评估的值是一个很大的安全问题 - sql 注入)。因此,事实上,当您的查询被实际执行时,它会将您的字段与 characters "CURDATE()" 进行比较,而不是与函数的 result 进行比较,这正是您想要的。但!我们只需在一开始就将其放入查询中。

    而且,你绑定参数的方式缺少:

    $bindings = array ( ':userid_53e3d3275e364' => 8, 
                        ':monthpaydate_53e3d3275e373' => 'MONTH(CURDATE())' );
    

    但我必须说我不明白这个MONTH(CURDATE()) = :monthpaydate_53e3d3275e373

    你确定不是monthField = MONTH(CURDATE()) ??

    我不知道你的数据库架构,所以 monthField 实际上是你自己的列名

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2014-12-09
      • 2014-07-09
      • 1970-01-01
      • 2013-03-15
      • 2018-11-28
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多