我尝试执行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())
作为绑定值时,某处似乎出错了。
有没有办法解决这个问题?
答案 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实际上是您自己的列名