Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尝试在wpdb中使用IN()时出现问题_Php_Mysql_Wordpress - Fatal编程技术网

Php 尝试在wpdb中使用IN()时出现问题

Php 尝试在wpdb中使用IN()时出现问题,php,mysql,wordpress,Php,Mysql,Wordpress,我有这个: $villes = '"paris","fes","rabat"'; $sql = 'SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN(%s)'; $query = $wpdb->prepare($sql, $villes); 当我执行echo$查询时我得到: SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN('\"C

我有这个:

$villes = '"paris","fes","rabat"';
$sql    = 'SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN(%s)';
$query  = $wpdb->prepare($sql, $villes);
当我执行
echo$查询时我得到:

SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN('\"CHAPELLE VIVIERS \",\"LE MANS \",\"QUEND\"')
我遇到的问题是,
$wpdb
add
'
in
in(“…”)

有人能帮忙吗,谢谢

试试下面的代码(已修复):

该函数还将
数组
作为第二个参数

您可以尝试这样转换
$villes

$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 . ")"
当前

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

功能:

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')
用法:

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')
结果:

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')

效率可能会更高,也可能不会更高,但它是可重用的。

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

转义数据以用于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 . ")"

我已经尝试过了,但它只传递了arrayNote的第一个元素,这可以说是一种过于复杂的方法,但它的优点是可以改变数组的内容,代码将相应地进行调整,而无需修改。所以你可以用30个城镇而不是3个来填充<代码> $VILLe/COD>,它仍然可以工作。可能想考虑把这个添加到代码中或者提交一个补丁到核心,这样你就可以使用这个方法来进行IN语句。其中
ville
在(“.intlode(',”,array_fill(0,count($villes),'%s'))和
table_name.name
='%s'谢谢你的代码,它帮助了我所需要的:)这是我的解决方案:现在,如果你的数组是
$prepare
$wpdb->prepare($sql,$ville)中的最后一项,你可以使用扩展来使代码更干净一点;我更喜欢这个答案,而不是公认的答案,因为它很简单。我喜欢这个答案。充分利用WordPress函数