【问题标题】:Drupal 7 - case-insensitive LIKE with db_selectDrupal 7 - 不区分大小写的 LIKE 与 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_binThis 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


【解决方案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();

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2019-04-30
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多