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