WordPress中MySql $wpdb预编译使用in语句的推荐方式
2022-06-15
WordPress中MySql $wpdb预编译使用in语句,习惯性把过滤数据列表当作一个长字符串,结果只返回第一个,也不报错。
错误示例
global $wpdb;
$data = "'a','b','c'";
$wpdb->query($wpdb->prepare(
"SELECT * FROM table_test WHERE name in (%s)"
, $data));
正确做法
global $wpdb;
// 用于限制过滤的数据列表
$data = array("a", "b", "c");
// 基础组合
$sql = "
SELECT DISTINCT telecopie
FROM `table_test`
WHERE `name` IN(".implode(', ', array_fill(0, count($data), '%s')).")
";
// 调用预编译语句
$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $data));
// 执行命令
$wpdb->query($query);
从例子中看出,本质是要将过滤数据列表一个个拼接,不能把它当作一个整体处理。
(%s, %s, %s ...), $s1, $s2, $s2 ...
不只针对WordPress,通用sql语句同样如此,根据具体需求,要手动拼接出原始预编译语句。
参考资料
https://stackoverflow.com/questions/10634058/wordpress-prepared-statement-with-in-condition
(版权归cpury.com所有,转载请注明出处。)