1

実行しようとしている $wpdb クエリがありますが、実行されておらず、エラーもスローされていません。

$followups = 
    $wpdb->get_results(
            $wpdb->prepare(
                "SELECT * FROM orders 
                WHERE status_id = %d
                AND DATEDIFF(CURDATE(), date_waiting_pickup) % 7 = %d",
                array(66, 0)
            )
        );

理由はありますか?ターミナル/ダイレクトMySQLで問題なく動作します。DIFFDATE()機能ですか?

編集:興味深いことに、$wpdb->prepare関数を削除してそのまま$wpdb->get_results()にしておくと、正常に動作します。では、どのように機能するかについて、私が見逃しているものはあります$wpdb->prepare()か?

4

1 に答える 1

0

ご希望の場合は、先週の注文のようです... 単純化してみませんか?%d0 を入れるだけで 2 番目の必要はありません。

$followups = 
    $wpdb->get_results(
            $wpdb->prepare(
                "SELECT * FROM orders 
                WHERE status_id = %d
                AND DATEDIFF(CURDATE(), date_waiting_pickup) % 7 = 0",
                66
            )
        );

更新

@dtj 除算modの余りを示す (%) 演算子を使用しています。(最初の想定)と比較すると0、今日、1 週間前、2 週間前などに注文が入ります。(2 番目の%d) 1 と比較すると、昨日、8 日前などに注文が入ります。

それは本当にあなたが望むものですか?

更新 2 : あなたの編集された質問では、$wpdb->prepare()すべてを削除するとうまくいくと言っています。興味深いことは間違いありませんが、幸いなことにprepare()、整数を扱うだけであれば、実際には必要ありません。つまり、次のことを行います。

$status_id = (int) (is_numeric($status_id) ? $status_id : 0);

$followups = $wpdb->get_results("
    SELECT * FROM orders
    WHERE status_id = $status_id
    AND DATEDIFF(CURDATE(), date_waiting_pickup) % 7 = 0");

安全なクエリを保証し、シンプルさと効率性を向上させます。私の場合、関係がある場合にのみ使用し、示されprepare()ているstringsように常に整数をテストします。

于 2012-12-29T01:13:15.437 に答える