2011-10-19 56 views
3

我無法查詢到是使用MySQL和Drupal 7.這是我的模塊代碼不區分大小寫:Drupal的7 - 不區分大小寫的LIKE與db_select

$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_binThis answer表示「唯一特別的是用於比較二進制格式的字符的utf8_bin」。我不知道爲什麼選擇這個排序規則,因爲表中的所有數據都是英文文本。我可能會將排序規則更改爲utf8_general_ci

+0

你有你的代碼中的SQL注入,請參閱:http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain我想你已經設法繞過PDO成功:-) – Johan

+0

即使在二進制排序規則上,LIKE也總是不區分大小寫。 – Johan

+0

這裏如何進行SQL注入?我認爲在'db_select()'中使用'condition()'函數的意義在於它會逃避你的輸入。 –

回答

5

是什麼系的領域?整理應該是前綴* _CI(不區分大小寫)爲前utf8_unicode_ci

+0

'utf8_bin'。這是一個「長文本」。 –

+0

檢查整理是正確的答案。我將所有文本字段從'utf8_bin'改爲'utf8_general_ci',現在改爲$ results-> condition('Department','%'。db_like($ _ GET ['department'])。'%','LIKE') ;'工作正常。 :) –

4

而不是使用condition可以使用where方法來添加自定義WHERE條款:

$results->where('UPPER(Department)'... 
+0

好吧,我沒有得到任何錯誤,但我也沒有得到任何結果。 :/'$ results-> where(「UPPER(Department)LIKE'%:dept%'」,array(':dept'=> db_like($ _ GET ['department']));' –

+1

您需要包裝$ _GET ['department']在strtoupper中,或者你只是用一個普通字符串測試一個大寫字符串 – Clive

+0

Derp,這可能會做伎倆......我認爲你的解決方案也可能工作,雖然改變整理似乎因爲最初的'utf8_bin'沒有任何意義,所以更好的解決方法。使用'condition()'似乎是一個更乾淨的解決方案。 –