Drupal 7 - case-insensitive LIKE with db_select
使用MySQL和Drupal7,我不能让查询不区分大小写。以下是我的模块代码:
1 2 3 4 5
| $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]: Column not found: 1054 Unknown column 'UPPERDepartment' in 'where clause': SELECT p.* FROM {people_table} p WHERE (UPPERDepartment LIKE :db_condition_placeholder_0 ESCAPE '\\') ORDER BY Name ASC;
所以它好像吃了我的圆括号。我该怎么做一个不区分大小写的LIKE?
编辑:Department列及整表的排序规则为utf8_bin。这个答案说"唯一特别的一个是utf8-bin,它用于比较二进制格式的字符。"我不知道为什么选择了这个排序规则,因为表中的所有数据都是英文文本。我可以把排序规则改为utf8_-general_-ci。
- 您的代码中有一个SQL注入,请参阅:stackoverflow.com/questions/332365/…我想您成功地绕过了PDO:-)
- LIKE总是不区分大小写的btw,即使在二进制排序规则中也是如此。
- 这里如何进行SQL注入?我认为将condition()函数与db_select()一起使用的要点是它将逃避您的输入。
- @Sarahvessels:这里没有SQL注入漏洞。不用担心,PDO和Drupal数据库层会像您怀疑的那样完全保护您。
什么是部门字段的排序?,对于Ex utf8_unicode_ci,它应该带有前缀*_ci(不区分大小写)
- utf8_bin。它是一个longtext。
- 检查排序规则是正确的答案。我把所有文本字段从utf8_bin改为utf8_general_ci,现在$results->condition('Department', '%' . db_like($_GET['department']) . '%', 'LIKE');工作正常。:)
您可以使用where方法添加自定义where子句,而不是使用condition:
1
| $results->where('UPPER(Department)'... |
- 嗯,我没有得到任何错误,但也没有得到任何结果。:/$results->where("UPPER(Department) LIKE '%:dept%'", array(':dept' => db_like($_GET['department'])));。
- 您需要在strtoupper中包装$u get['department'],或者您只是用一个普通字符串测试一个大写字符串。
- 德普,这可能会起到作用…我认为您的解决方案也可能有效,尽管更改排序似乎是更好的解决方案,因为原来的utf8_bin没有任何意义。使用condition()似乎是一种更清洁的解决方案。
- 是的,更改排序规则绝对是正确的方法,那么每次运行LIKE查询时,您就不必再纠结于区分大小写了。