好吧,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