1

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'

エコーされたクエリを単独で実行すると、「合計」列の値が 1 になります。同時に、PDO ステートメントは何も返しません。

どんな助けでも大歓迎です。

更新: 回答が投稿されましたが、これが機能しなかった理由はまだわかりません。$custList は実際には配列ではなく文字列です。

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

2 に答える 2

3

ケンがあなたの質問のコメントで述べたように、あなたの問題は:idバインディングです。つまり、PDO では配列をパラメーターとしてバインドすることはできません。配列をループして、個々の要素をクエリにバインドする必要があります。

一般に、配列の各要素のクエリにforeacha を追加するループでこれを処理し、各要素を他の準備された変数を使用して正しい順序でクエリにバインドします (名前ではなく位置であるため)。??

于 2012-09-13T13:05:14.290 に答える
0

私が見ているのは2つの大きなエラーです:最初は@Joeによって説明されていますが、2番目はここにあります:

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

3 番目の引数を渡して、「これらのパラメーターは整数なので、引用しないでください」と言うのを忘れました。$q->bindValue(":start", $start,PDO::PARAM_INT); $q->bindValue(":end", $end,PDO::PARAM_INT);

于 2012-09-13T16:53:43.800 に答える