【发布时间】:2011-12-11 07:17:46
【问题描述】:
我无法使用 MySQL 和 Drupal 7 使查询不区分大小写。这是我的模块代码:
$results = db_select('people_table', 'p')->fields('p');
if (array_key_exists('department', $_GET)) {
$results->condition('Department', '%' . db_like($_GET['department']) . '%', 'LIKE');
}
return $results->orderBy('Name', 'ASC')->execute();
在 URL 中使用?department=Chemistry,我得到三个结果。在 URL 中使用?department=chemistry,我没有得到任何结果。当我尝试$results->condition('UPPER(Department)'... 时,我收到此错误:
PDOException: SQLSTATE[42S22]: 找不到列: 1054 'where 子句'中的未知列'UPPERDepartment': SELECT p.* FROM {people_table} p WHERE (UPPERDepartment LIKE :db_condition_placeholder_0 ESCAPE '\\') 按名称排序升序;
所以看起来它吃掉了我的括号。我怎样才能做到不区分大小写的LIKE?
编辑:Department 列以及整个表的排序规则是 utf8_bin。 This answer 说“唯一特殊的是 utf8_bin,它用于比较二进制格式的字符。”我不知道为什么选择这个排序规则,因为表中的所有数据都是英文文本。我可能只是将排序规则更改为utf8_general_ci。
【问题讨论】:
-
您的代码中有 SQL 注入,请参阅:stackoverflow.com/questions/332365/… 我猜您已经成功绕过 PDO :-)
-
LIKE总是不区分大小写 BTW,即使在二进制排序规则中也是如此。 -
这里怎么有SQL注入?我认为将
condition()函数与db_select()一起使用的意义在于它会逃避您的输入。 -
@SarahVessels:这里没有 SQL 注入漏洞,不用担心,PDO 和 Drupal 数据库层如您所想的那样为您提供全面保护
标签: php mysql drupal drupal-7 case-insensitive