在查询中使用MONTH()时,PDO无法正常工作

时间:2014-08-07 19:41:55

标签: php mysql pdo

我尝试执行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())作为绑定值时,某处似乎出错了。

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

2 个答案:

答案 0 :(得分:2)

此:

$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 );

P.S。还有FélixGagnon-Grenier所说的,你需要在你的参数中使用“:”。

答案 1 :(得分:1)

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

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

原因很合理:传递参数使得它们不需要由mySQL评估(mySQL评估的值是一个很大的安全问题 - sql注入)。事实上,当您的查询被执行时,它会将您的字段与字符 "CURDATE()"进行比较,而不是将该功能的结果进行比较,这就是您想。但!我们必须在一开始就把它放在查询中。

此外,绑定params的方式缺少:

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

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

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

我不知道您的数据库架构,因此monthField实际上是您自己的列名