Yii中LIKE模糊查询需转义%和_,否则导致误匹配;默认反斜杠为转义符但MySQL可能忽略,须验证ESCAPE有效性;推荐bindValue绑定转义字符,Yii1.1可用addSearchCondition,Yii2.x需预处理关键词并禁用自动ESCAPE。

在Yii框架中用模型执行LIKE模糊查询时,若搜索内容本身含百分号%或下划线_,不加转义会导致误匹配甚至SQL语法错误——比如查字符串“进度:25%完成”,直接写like '%25%'会把所有含“25”的记录都捞出来。
确认数据库驱动与转义字符默认值
Yii 1.x和2.x默认使用反斜杠作为ESCAPE字符,但MySQL驱动实际可能忽略该设置;PostgreSQL和SQL Server则严格依赖ESCAPE子句。必须先验证当前连接是否生效:【执行SELECT 'a_b' LIKE 'a_b' ESCAPE ''; 返回false才说明转义有效】。
若返回true,说明当前数据库未启用转义机制,必须显式指定ESCAPE或改用参数绑定方式。
方法一:用bindValue手动绑定转义字符(推荐)
第一步:在查询中显式写出ESCAPE子句,并用占位符代替转义字符:
->where("name LIKE :pattern ESCAPE :escape_char")
第二步:绑定两个参数,注意escape_char必须是单字符且不能是通配符本身:
->bindValue(':pattern', '%25%%')→bindValue(':escape_char', '')
这一步必须用bindValue而非bindParam,否则PDO可能不识别转义字符;若用createCommand()拼接字符串,则需双重转义——PHP里写'\\'才能传给SQL一个反斜杠。
方法二:用addSearchCondition自动处理(仅限Yii 1.1)
调用$criteria->addSearchCondition('name', $keyword, true, 'AND', '\'),第三个参数true表示启用LIKE,第四个参数可设逻辑关系,第五个参数即转义字符。
注意:此方法只存在于CActiveRecord的CDBCriteria中,Yii 2.x已移除,强行调用会抛出Call to undefined method错误。
方法三:预处理关键词再注入(兼容性最强)
对原始关键词做两件事:先把%和_替换成带转义前缀的版本,再套上%通配符:
$safeKeyword = str_replace(['%', '_'], ['%', '_'], $rawKeyword);
$query->andWhere(['like', 'name', "%{$safeKeyword}%", false]);
最后这个false参数至关重要——它告诉Yii不要自动加ESCAPE子句,否则会生成LIKE '%%%' ESCAPE '\' 这种重复转义的非法SQL。


















