使用WPDB执行SELECT查询无法获取两个日期范围数据如何解决
问题排查与修复方案
你当前代码存在3处核心错误,导致条件查询失效:
$wpdb->prepare调用错误:ARRAY_A是$wpdb->get_results方法用来指定返回关联数组格式的参数,不属于prepare的入参。prepare的作用是参数绑定防SQL注入,你需要先在SQL模板中用占位符代替变量,再把变量作为prepare的后续参数传入,不能直接把变量拼接进SQL语句。- BETWEEN语法错误:标准SQL中
BETWEEN的语法为字段 BETWEEN 值1 AND 值2,不需要额外用括号包裹两个对比值,你的写法属于非法SQL语法。 - 日期值缺少引号:日期属于字符串类型,直接拼接进SQL时没有加单引号包裹,数据库会把
2021-07-04识别为数值计算表达式(即2021减7减4),无法匹配日期字段的存储值。
正确可运行代码
global $wpdb; $start_date = '2021-07-04'; $end_date = '2021-10-04'; $table_name = $wpdb->prefix . 'statistics_revenues'; // 用%s作为字符串占位符,参数交给prepare自动处理转义和加引号 $query = $wpdb->prepare( "SELECT * FROM {$table_name} WHERE DATE(date_created) BETWEEN %s AND %s", $start_date, $end_date ); $query_results = $wpdb->get_results($query, ARRAY_A);
可选性能优化
如果你的date_created字段是datetime/timestamp类型且建有索引,建议避免用DATE()包裹字段,修改查询条件为区间判断,可触发索引提升查询速度:
$query = $wpdb->prepare( "SELECT * FROM {$table_name} WHERE date_created >= %s AND date_created < DATE_ADD(%s, INTERVAL 1 DAY)", $start_date, $end_date );
内容的提问来源于stack exchange,提问作者Tsviel Zaikman
相关产品推荐
相关产品推荐

