у меня есть это:
$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 и посмотреть, работает ли она. Надеюсь, поможет.