Php 奇怪的PDO查询结果

Php 奇怪的PDO查询结果,php,pdo,Php,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 mont

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语句打印

选择COUNT(*)作为web\u order JOIN web\u order\u item.od\u id=web\u order.od\u id中的web\u order.p\u供应商('210'、'1107'、'2295'、'2452')和od\u pcode='1008GD'和od\u日期介于'2012-06-13 00:00:00'和'2012-09-13 13:15:36'之间的总计。

如果我自己执行回显查询,则“totals”列的值为1。同时,PDO语句不返回任何内容

任何帮助都将不胜感激

更新: 虽然答案已经贴出来了,但我仍然不明白为什么这不起作用$custList实际上是一个字符串,而不是数组,因为我使用了

$custList = implode(",", $custList);

正如Ken在对您的问题的评论中提到的,您的问题是
:id
绑定,即PDO不允许您将数组绑定为参数。您需要在数组中循环并将各个元素绑定到查询中


通常,我使用一个
foreach
循环来处理这个问题,该循环为数组的每个元素的查询添加一个
,然后我将每个元素与其他准备好的变量以正确的顺序绑定到查询中(因为
是位置的,而不是命名的)。

我看到的是两个大错误: 第一个由@Joe解释,但第二个在这里:

$q->bindValue(":start", $start);
$q->bindValue(":end", $end);
通过传递第三个参数,您忘记了说“这些参数是整数,所以不要引用它们”。 $q->bindValue(“:start”,$start,PDO::PARAM_INT);
$q->bindValue(“:end”,$end,PDO::PARAM_INT)

顺便说一句,我从某人那里听说,可以设置PDO在本地存储准备好的语句,以便进行调试。有人听说过吗?你的问题在(:id)。。。请看一下解决此问题的方法。值绑定与变量插值或复制粘贴不同
:id
表示仅一个值的占位符,而不是多个值的占位符。但是deceze,我使用了内爆函数,因此只有一个字符串I bindYes,因此您按字面意思绑定值
'210'、'1107'、'2295'、'2452'
。您没有绑定四个单独的值
'210'
'1107'
'2295'
'2452'
,而是绑定一个值
'210','1107','2295','2452'
。除非您的数据库中有一个字段包含“'210'、'1107'、'2295'、'2452'”,否则它将与任何内容都不匹配。是的,现在可以了,谢谢。虽然这会降低代码的可读性,但总体而言,这看起来并不好。我使用了内爆函数,所以基本上我没有绑定数组,而是绑定字符串。为什么不起作用呢?这些实际上不是整数,而是代表datesOk的字符串。。。我脑子里有点奇怪,我检查了三次,然后发布了我的答案,你在上面写了:开始和结束在极限关闭,但我错了。我认为“内爆”解决方案是最好的。如果您想要可读性,请将内爆封装在一个名为“toMysqlSet”的函数中,该函数接受一个数组,并在查询中输出您想要的字符串格式。