2012-09-13 77 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