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'
inin(“…”)
有人能帮忙吗,谢谢试试下面的代码(已修复):
该函数还将数组
作为第二个参数
您可以尝试这样转换$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函数