我在一个字符串中有三个值,如下所示:
$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\"')
它不是将字符串写成三个独立的值--它只是一个带有转义双引号的字符串。
我如何在WordPress中正确地实现一个具有多个值的预准备语句?
7条答案
按热度按时间ctzwtxfj1#
请尝试以下代码:
implode()
array_fill()
call_user_func_array()
array_merge()
8fsztsew2#
WordPress已经有了一个用于此目的的函数,请参见esc_sql()。下面是此函数的定义:
对MySQL查询中使用的数据进行转义。通常应使用wpdb::prepare()准备查询。有时,点转义是必需的或有用的。一个示例是准备在IN子句中使用的数组。
您可以像这样使用它:
s4chpxco3#
功能:
用途:
结果:
可能更有效,也可能不更有效,但它是可重用的。
rlcwz9us4#
下面是我为
$wpdb
清理IN (...)
值的方法。1.我使用了一个helper函数,它通过
$wpdb->prepare()
传递列表的每个值,以确保它被正确转义。1.通过
sprintf()
将准备好的值列表插入SQL查询。辅助函数:
样品使用:
vktxenjb5#
第一个是一套现代的非WordPress技术,使用一个mysqli预准备语句,在数组中有未知数量的值。第二个片段将是WordPress的等价物。
让我们假设输入数据的索引数组是不可信的,并且可以从
$_GET['villes']
访问。预准备语句是现代的标准,专业开发人员更喜欢使用旧的/不可信的转义技术。下面的代码片段将返回数组中指定了ville
值之一的行。如果数组没有声明或者为空,它将返回数据库表中的所有行。原生PHP技术:
从这里开始,您可以访问不同
telecopie
值的行(从技术上讲,它是一个可迭代的结果集对象),就像使用简单的foreach()
迭代关联数组的索引数组一样。使用WordPress的helper方法语法更简单,因为变量绑定和查询执行由
get_results()
处理:从这一点上看,
$result
是一个关联数组的索引数组--特别是因为ARRAY_A
。$result
不是第一个原生php代码片段中的结果集对象。这意味着您可以对数据使用经典的循环语言构造函数或全套array_
函数。有用的参考资料:
kuarbcqp6#
我创建了一个小函数,它将从数组中为预处理语句生成占位符,例如
(%s,%d,%f)
,它将根据数组中的每一项准确地知道要使用哪个占位符。考虑问题中的示例,首先需要将值转换为数组:
第一个
qltillow7#
prepare
函数还将array
作为第二个参数。您可以尝试如下转换
$villes
:当前
将其更改为
现在,尝试将
$villes
传递给prepare函数,看看它是否有效。希望它能有所帮助。