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的主要内容,如果未能解决你的问题,请参考以下文章

FuelPHP的orm和mysql不区分大小写`like`

如何使 LIKE 表现得不区分大小写?

LIKE运算符是否与MSSQL Server区分大小写?

MySQL LIKE 区分大小写,但我不希望它是 [重复]

如何使用 LIKE 通配符在列中搜索(不区分大小写)?

Firestore 数据库查询,忽略大小写(不区分大小写)和 like 子句。 [复制]