WordPress中MySql $wpdb预编译使用in语句的推荐方式

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所有,转载请注明出处。)