对于Like条件中包含%、_字符处理

浏览:326 发布日期:2019/01/27 分类:ThinkPHP5专区
众所周知,MySQL的Like里面有两个特殊字符:%、_,
如果用户输入的$keyword中包含%、_,它们会被当成查询条件解析。Db::name('user')->whereLike('name','%' . $keyword .'%')->select();可能带来的风险:
(1)导致查询结果不严谨,无法准确搜索到%和_这两个字符。
(2)如果系统要求字符串只能从开头搜索,用户可以在前面加%绕过限制。

我没有在TP5.1中找到比较好的解决办法,
目前的做法是预先给用户输入的关键字进行转义,%、_、\ 转义成 \%、\_、\\个人觉得设计成这样也许会更好:Db::name('user')->whereLike('name','%?%', $keyword)->select();
// 或者
Db::name('user')->whereLike('name','%' . Db::转义Like($keyword) . '%')->select();
小提示:
在PHP的字符串里,'\\' 表示 \,
在SQL字符串里, '\\' 表示 \,
在SQL的LIKE里面,'\\\\' 表示 \,

如果在PHP的字符串里面拼接SQL中的Like搜索\\,转换过程如下。

PHP字符串 '\\\\\\\\\\\\\\\\' (16个斜线)

SQL中的Like条件字符串 '\\\\\\\\' (8个斜线)

Like值 \\\\ (4个斜线)

值 \\ (2个斜线)
最佳答案
评论( 相关
后面还有条评论,点击查看>>