php - CDbCriteria 参数绑定(bind)

标签 php postgresql yii

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

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

"pattern\"

LIKE 表达式中的反斜杠转义下一个字符(将通配符 _% 转换为文字 _ %),因此如果没有下一个字符,则会出错。要了解更多信息,请参阅 pattern matching .

关于php - CDbCriteria 参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24568833/

相关文章:

php yii框架直接通过模型填充CActiveform dropdownlist数据?

php - 如果仅将有效的 UTF-8 编码字符串作为参数给出 str_replace 是否可以安全地用于 UTF-8 编码字符串?

php - 从mysql字符串返回特定数据

php - 如何使用 APIController 在 CakePHP 中插入数据?

sql - 像数据库行的引用计数或共享指针之类的东西?

sql - 如何将SQLite3脚本转换成PostgreSQL可以理解的脚本?

yii - 如何更改默认登录操作

mysql - Yii - 使用 MySQL AS 子句字段

php - MySQL 连接无法在 AWS EC2 上运行

postgresql - 使用 postgresql 的标签、字幕、记录和小计