如果用户输入的$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个斜线)
最佳答案