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

如果你想,看起来,上周的订单......你为什么不简化它?不需要第二个%d,只需输入 0。

$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 周前等获得订单。如果我们与 1(在第二个假设中)比较,我们将%d获得昨天、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 回答