在WordPress中如何使用带LIKE条件的$wpdb->prepare()函数进行模糊查询?

导语:我们使用$wpdb->prepare()是为了提高安全性,那么有时会遇到需要使用LIKE条件的时候,这时你会发现%s%d和LIKE本身的规则%符号冲突了,那么怎么办?来看看解决办法。

正常的LIKE条件中的%符号

在WordPress中一条正常使用的SQL语句,是这样使用LIKE条件的:

$querystr = "SELECT * FROM `table`  ";
$querystr .="WHERE  name like '例子%' ";
$querystr .="ORDER BY name LIMIT 5";
$results = $wpdb->get_results($querystr);

正常使用$wpdb->prepare()函数

我们来看看正常不用LIKE条件的$wpdb->prepare()函数:

$querystr = "SELECT * FROM `table`  ";
$querystr .="WHERE  name = '%s' ";
$querystr .="ORDER BY name LIMIT 5";
$results = $wpdb->get_results($wpdb->prepare($querystr,$name));

%s的值通过$wpdb->prepare()函数中的变量$name来获得。

在$wpdb->prepare()使用LIKE条件

我们要进行搜索以“例子”开头的所有字符串,正常情况下是这样写的 name like ‘例子%’,但是在$wpdb->prepare()函数中,为了安全,它使用了通配符%s来代替你要查询的变量字符串,那么有些同学会写成 name like ‘%s%’ 。

但这样子是错误的写法,这样的写法是查不出结果来的。

正确的方法是把你的条件变量字符串 和 %符号链接起来,形成一个新的变量字符串,然后再在$wpdb->prepare()函数中使用,例如 $name.’%’。下面是全部的语句。

$name="例子";

$querystr = "SELECT * FROM `table`  ";
$querystr .="WHERE  name like '%s' ";
$querystr .="ORDER BY name LIMIT 5";
$results = $wpdb->get_results($wpdb->prepare($querystr,$name.'%'));

这段语句的重点就是 $name.’%’ 。

如果你要搜索以“例子” 结尾的所有字符串,那就是 ‘%’.$name。

如果你要搜索在任何位置包含“例子”的所有字符串,那就是’%’.$name.’%’。

结束

你明白了吗?%符号应该是$wpdb->prepare()中要替换的变量的一部分,而不是放入查询语句字符串内。

目前在“在WordPress中如何使用带LIKE条件的$wpdb->prepare()函数进行模糊查询?”上有2条评论

  1. 刚刚正好在查询这个问题,找到了你这个网站,但是发现好像不是这样的,WordPress说明是这样的
    【Literal percentage signs (%) in the query string must be written as %%. Percentage wildcards (for example, to use in LIKE syntax) must be passed via a substitution argument containing the complete LIKE string, these cannot be inserted directly in the query string. Also see wpdb::esc_like().】
    第一句应该就是说的这个问题,%应该写作%%

    1. 你不能只看看文档,而是也自己写代码测试一下,我这个文章是自己写代码的过程中遇到问题后,发现这么写才能解决我的问题,所以,我把心得分享给大家。

发表评论

邮箱地址不会被公开。 必填项已用*标注