Вопрос по php, mysql – Проблема при попытке использовать IN () в wpdb

9

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

$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 добавлять' вIN('...')

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

Ваш Ответ

4   ответа
11

В WordPress уже есть функция для этого, смотритеesc_sql (), Вот определение этой функции:

Escapes data for use in a MySQL query. Usually you should prepare queries using wpdb::prepare(). Sometimes, spot-escaping is required or useful. One example is preparing an array for use in an IN clause.

Вы можете использовать это так:

$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 . ")"
Мне нравится этот ответ больше, чем принятый ответ из-за его простоты
4

FUNCTION:

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);
}

USAGE:

$arr = array('foo', 'bar', 1, 2, 'foo"bar', "bar'foo");

$query = "SELECT values
FROM table
WHERE column NOT IN (" . escape_array($arr) . ")";

echo $query;

RESULT:

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

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

35

Попробуйте этот код (ИСПРАВЛЕНО):

// 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;
сейчас работает, спасибо большое mgraph
echo $query; reutrnsparis mgraph
@mgraph Попробуйте сейчас, внесли небольшое изменение
Возможно, стоит рассмотреть возможность добавления этого в кодекс или отправки в ядро патча, который позволит вам использовать этот метод для оператора IN.
Обратите внимание, что это, возможно, слишком сложный подход, но он дает вам преимущество, заключающееся в возможности изменять содержимое массива, и код будет соответствующим образом адаптироваться без изменений. Чтобы вы могли заселить$villes с 30 городами, а не только 3, и он все еще будет работать.
-1

prepare Функция также занимаетarray как второй параметр.

Вы можете попробовать конвертировать$villes как это:

Current

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

Change it to

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

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

Я уже пробовал это, но это только передать первый элемент массива mgraph

Похожие вопросы