在YII应用程序的登录页面上,我已将以下条件用于验证用户:
$criteria->condition = 'uname ILIKE :username OR email_id ILIKE :username';
$criteria->params = array(':username' => $this->username);
如果我将backslah放在用户名文本字段中,则会抛出错误:
CDbCommand failed to execute the SQL statement: SQLSTATE[22025]: Invalid escape sequence: 7 ERROR: LIKE pattern must not end with escape character
我知道在php中有很多方法可以删除斜杠,我想知道在YII中是否有任何方法可以在与查询绑定时转义无效字符。
我可以用不同的方式写上述条件,不会产生任何问题
$criteria->compare('uname',$this->username,true,'OR');
$criteria->compare('email_id',$this->username,true,'OR');
但在这种情况下,它将使用" LIKE"来构建查询。不是" ILIKE"。
这就是为什么我必须正确使用$ criteria-> condition。
答案 0 :(得分:2)
执行不区分大小写的匹配的常用方法是lower(email_id) = lower(:username)
。如果需要索引查找,甚至可以在lower(email_id)
上创建表达式索引。
或者,使用PostgreSQL的citext
类型。
LIKE
和ILIKE
是模式匹配运算符,它们采用通配符表达式,而不仅仅是文字字符串。您输入错误的原因如下:
"pattern\"
是LIKE
表达式中的反斜杠转义下一个字符(将通配符_
或%
转换为文字_
或%
),如果没有下一个字符,那就错了。要了解详情,请参阅pattern matching。
答案 1 :(得分:1)
尝试这种方式,使用addSearchCondition和ILIKE
$criteria->addSearchCondition('uname',$this->username,true,'OR','ILIKE');
$criteria->addSearchCondition('email_id',$this->email_id,true,'OR','ILIKE');