CDbCriteria参数绑定

时间:2014-07-04 07:26:24

标签: php postgresql yii

在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。

2 个答案:

答案 0 :(得分:2)

执行不区分大小写的匹配的常用方法是lower(email_id) = lower(:username)。如果需要索引查找,甚至可以在lower(email_id)上创建表达式索引。

或者,使用PostgreSQL的citext类型。

LIKEILIKE模式匹配运算符,它们采用通配符表达式,而不仅仅是文字字符串。您输入错误的原因如下:

"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');