好吧,PDO最薄弱的地方是无法调试它,因为准备语句实际上存储在服务器端。我花了整整一天的时间来解决我根本无法理解的问题。因此,这里的例子:奇怪的PDO查询结果
//the query itself
//Did other customers from the list buy the same style in last 3 months?
$end = date("Y-m-d H:i:s");
$start = strtotime("-3 month", strtotime($end));
$start = date('Y-m-d 00:00:00', $start);
$q = $db->prepare('SELECT COUNT(*) as totals FROM web_order
JOIN web_order_item ON web_order_item.od_id = web_order.od_id
WHERE web_order.p_vendor IN (:id)
AND od_pcode = :pcode
AND od_date BETWEEN :start AND :end
');
$q->bindValue(":pcode", '1008GD');
$q->bindValue(":id", $custList);
$q->bindValue(":start", $start);
$q->bindValue(":end", $end);
$q->execute();
echo "SELECT COUNT(*) as totals FROM web_order
JOIN web_order_item ON web_order_item.od_id = web_order.od_id
WHERE web_order.p_vendor IN ($custList)
AND od_pcode = '1008GD'
AND od_date BETWEEN '$start' AND '$end'";
$res = $q->fetchAll();
die(print_r($res));
这里来搞笑位 - print_r($res)
打印的空数组。
Array ([0] => Array ([totals] => 0 [0] => 0))
虽然具有完全相同的查询打印
SELECT COUNT(*) as totals FROM web_order JOIN web_order_item ON web_order_item.od_id = web_order.od_id WHERE web_order.p_vendor IN ('210','1107','2295','2452') AND od_pcode = '1008GD' AND od_date BETWEEN '2012-06-13 00:00:00' AND '2012-09-13 13:15:36'
如果我本身执行呼应查询我得到回音声明“总计”一栏为1的值。与此同时,PDO语句不会返回任何内容。
任何帮助将不胜感激。
更新: 虽然答案已发布,但我仍然不明白为什么这不起作用。 $ CUSTLIST实际上是一个字符串,而不是一个数组,因为我用
$custList = implode(",", $custList);
顺便说一句,我听到有人可以设置PDO来在本地存储准备好的语句用于调试目的。有没有人听说过? –
你的问题是在IN(:ID)...看看http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition针对此问题的方法 – Ken
值绑定与变量插值或复制粘贴不同。 ':id'表示一个* 1 *值的占位符,而不是多个值。 – deceze