导语:我们使用$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说明是这样的
【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().】
第一句应该就是说的这个问题,%应该写作%%
你不能只看看文档,而是也自己写代码测试一下,我这个文章是自己写代码的过程中遇到问题后,发现这么写才能解决我的问题,所以,我把心得分享给大家。