WordPress 预准备语句与 IN() 条件

我在一个字符串中有三个值,如下所示:

$villes = '"paris","fes","rabat"';

当我把它输入到一个准备好的语句中时,就像这样:

$sql    = 'SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN(%s)';
$query  = $wpdb->prepare($sql, $villes);

echo $query;显示:

SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN('\"CHAPELLE VIVIERS \",\"LE MANS \",\"QUEND\"')

它不是将字符串编写为三个单独的值 - 它只是一个带有双引号转义的字符串。

如何在WordPress中正确实现具有多个值的预准备语句?


答案 1

试试这个代码:

// Create an array of the values to use in the list
$villes = array("paris", "fes", "rabat");    

// Generate the SQL statement.
// The number of %s items is based on the length of the $villes array
$sql = "
  SELECT DISTINCT telecopie
  FROM `comptage_fax`
  WHERE `ville` IN(".implode(', ', array_fill(0, count($villes), '%s')).")
";

// Call $wpdb->prepare passing the values of the array as separate arguments
$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $villes));

echo $query;

答案 2

WordPress已经有一个用于此目的的功能,请参阅esc_sql()。以下是此函数的定义:

转义数据以在 MySQL 查询中使用。通常你应该使用wpdb::p repare()准备查询。有时,点逃逸是必需的或有用的。一个示例是准备一个数组以在 IN 子句中使用。

你可以这样使用它:

$villes = ["paris", "fes", "rabat"];
$villes = array_map(function($v) {
    return "'" . esc_sql($v) . "'";
}, $villes);
$villes = implode(',', $villes);
$query = "SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN (" . $villes . ")"

推荐