嗯,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 ) )
虽然具有完全相同查询的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 ('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'
如果我自己执行回显查询,我会得到'totals'列,其值为1.同时,PDO语句不返回任何内容。
任何帮助将不胜感激。
更新 虽然答案已经公布,但我仍然不明白为什么这不起作用。 $ custList实际上是一个字符串,而不是一个数组,因为我使用了
$custList = implode(",", $custList);
答案 0 :(得分:3)
正如Ken在您的问题评论中提到的,您的问题是:id
绑定,即PDO不允许您将数组绑定为参数。您需要遍历数组并将各个元素绑定到查询中。
通常,我使用foreach
循环处理此问题,该循环为查询中的每个元素添加?
,然后我以正确的顺序将每个元素绑定到查询中其他准备好的变量(因为?
是位置的,而不是命名的)。
答案 1 :(得分:0)
我看到的是两个大错误: 首先由@Joe解释,但第二个是在这里:
$q->bindValue(":start", $start);
$q->bindValue(":end", $end);
你忘了说“那些参数是整数所以不要引用它们”通过传递第三个参数。 $ q-> bindValue(“:start”,$ start,PDO :: PARAM_INT); $ q-> bindValue(“:end”,$ end,PDO :: PARAM_INT);