2012-09-13 150 views
1

好吧,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); 
+0

順便說一句,我聽到有人可以設置PDO來在本地存儲準備好的語句用於調試目的。有沒有人聽說過? –

+1

你的問題是在IN(:ID)...看看http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition針對此問題的方法 – Ken

+0

值綁定與變量插值或複製粘貼不同。 ':id'表示一個* 1 *值的佔位符,而不是多個值。 – deceze

回答

3

肯在你的問題中提到的意見,你的問題是:id結合,即,PDO不允許你綁定的數組作爲參數。您需要遍歷數組並將各個元素綁定到查詢中。

一般來說,我處理這個與foreach循環,增加了一個?到查詢爲陣列的每個元素,那麼我結合每個元件到正確的順序與其它製備的變量查詢(因爲?是位置,而不是命名)。

+0

是的,現在可以使用,謝謝。雖然這會使代碼不易讀,總體來看這看起來不太好。我使用implode函數,所以基本上我沒有綁定數組,但我綁定了一個字符串。爲什麼它不工作? –

0

我看到的是兩個大錯誤: 首先由@Joe解釋,但第二個是在這裏:

$q->bindValue(":start", $start); 
$q->bindValue(":end", $end); 

你忘了說,通過傳遞「這些參數是整數,所以不要說出來了」第三個論據。 $ q-> bindValue(「:start」,$ start,PDO :: PARAM_INT); $ q-> bindValue(「:end」,$ end,PDO :: PARAM_INT);

+0

這些實際上不是整數,但代表日期的字符串 –

+0

好的......我腦子裏有些奇怪的東西,在發佈我的回答之前,我檢查了三次:start和end在LIMIT close,但我錯了。 我認爲「內爆」解決方案是最好的。如果您想要可讀性,請將implode包裝到名爲「toMysqlSet」的函數中,該函數接受一個數組並輸出一個字符串formate,只要您需要查詢即可。 – artragis