Drupal 7 - 不区分大小写的 LIKE 与 db_select
Posted
技术标签:
【中文标题】Drupal 7 - 不区分大小写的 LIKE 与 db_select【英文标题】:Drupal 7 - case-insensitive LIKE with db_select 【发布时间】: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 注入,请参阅:***.com/questions/332365/… 我猜您已经成功绕过 PDO :-)LIKE
总是不区分大小写 BTW,即使在二进制排序规则中也是如此。
这里怎么有SQL注入?我认为将condition()
函数与db_select()
一起使用的意义在于它会逃避您的输入。
@SarahVessels:这里没有 SQL 注入漏洞,不用担心,PDO 和 Drupal 数据库层如您所想的那样为您提供全面保护
【参考方案1】:
Department 字段的排序规则是什么?,它应该带有前缀 *_ci(不区分大小写)用于 ex utf8_unicode_ci
【讨论】:
utf8_bin
。这是longtext
。
检查排序规则是正确的答案。我将所有文本字段从utf8_bin
更改为utf8_general_ci
,现在$results->condition('Department', '%' . db_like($_GET['department']) . '%', 'LIKE');
工作正常。 :)【参考方案2】:
您可以使用where
方法来添加自定义WHERE
子句,而不是使用condition
:
$results->where('UPPER(Department)'...
【讨论】:
好吧,我没有得到任何错误,但我也没有得到任何结果。 :/$results->where("UPPER(Department) LIKE '%:dept%'", array(':dept' => db_like($_GET['department'])));
您需要将 $_GET['department'] 包装在 strtoupper 中,否则您只是用普通字符串测试大写字符串
Derp,这可能会奏效...我认为您的解决方案可能也有效,尽管更改排序规则似乎是一个更好的解决方法,因为原来的 utf8_bin
没有意义。使用condition()
似乎是一个更清洁的解决方案。
是的,更改排序规则绝对是正确的方法,这样您就不必在每次运行LIKE
查询时都搞砸区分大小写了【参考方案3】:
要在 drupal 7 中搜索不区分大小写的操作
$query->where('UPPER(Department) LIKE :dept', array('dept' => '%'.db_like($keyword).'%'));
$result = $query->execute();
【讨论】:
以上是关于Drupal 7 - 不区分大小写的 LIKE 与 db_select的主要内容,如果未能解决你的问题,请参考以下文章