Проблема при попытке использования IN () в wpdb

у меня есть это:

$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\"') 

$wpdb том, что $wpdb add ' in IN('...')

может кто-то помочь, спасибо

Попробуйте этот код (FIXED):

 // 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; 
  • implode()
  • array_fill()
  • call_user_func_array()
  • array_merge()

Для этой цели WordPress уже имеет функцию, см. Esc_sql () . Вот определение этой функции:

Сбрасывает данные для использования в запросе MySQL. Обычно вы должны готовить запросы, используя wpdb :: prepare (). Иногда, спот-экранирование требуется или полезно. Одним из примеров является подготовка массива для использования в предложении 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 . ")" 

НАЗНАЧЕНИЕ:

 function escape_array($arr){ global $wpdb; $escaped = array(); foreach($arr as $k => $v){ if(is_numeric($v)) $escaped[] = $wpdb->prepare('%d', $v); else $escaped[] = $wpdb->prepare('%s', $v); } return implode(',', $escaped); } 

ПРИМЕНЕНИЕ:

 $arr = array('foo', 'bar', 1, 2, 'foo"bar', "bar'foo"); $query = "SELECT values FROM table WHERE column NOT IN (" . escape_array($arr) . ")"; echo $query; 

РЕЗУЛЬТАТ:

 SELECT values FROM table WHERE column NOT IN ('foo','bar',1,2,'foo\"bar','bar\'foo') 

Может или не может быть более эффективным, однако он может использоваться повторно.

Функция prepare также принимает в качестве второго параметра array .

Вы можете попробовать конвертировать $villes следующим образом:

Текущий

 <?php $villes = '"paris","fes","rabat"'; ? 

Измените его на

 <?php $villes = array("paris","fes","rabat"); ?> 

Теперь попробуйте передать $villes для функции func и посмотреть, работает ли она. Надеюсь, поможет.