2015-10-06 23 views
0

使用db_select進行選擇並且當數據庫列碰巧是reserved mysql word(在這種情況下爲when)會導致錯誤。當列名是一個mysql關鍵字時db_select

表:

+-----------------------------------+------------+--------+ 
|    sort_id    | when | user | 
+-----------------------------------+------------+--------+ 
| 1         | 1448270950 | 123 | 
| 3         | 1448270955 |  12 | 
| 50        | 1448270959 |  45 | 
+-----------------------------------+------------+--------+ 

標準drupal7選擇使用db_select

$query = db_select('naughty_table', 'd') 
    ->fields('d', array('sort_id', 'when', 'user')) 
    ->condition('user', $uid) 
    ->limit($limit) 
    ->execute(); 

命名when列在這裏就是問題所在。

我知道我可以寫使用普通的SQL查詢:

db_query("SELECT sort_id, user, `when` FROM {naughty_table} WHERE user = :user", array(":user" => $user_id)); 

應該被一個辦法來解決這個使用常規db_select?

+0

你應該避免使用關鍵字作爲表名,但也許它的工作原理,如果你試試這個:環繞在與反引號'\'' – swidmann

+0

使用反引號'\''HTTP ://dba.stackexchange.com/questions/23129/benefits-of-using-backtick-in-mysql-queries – chris85

+0

當然,我總是避免當我創建自己的表,但在這種情況下,這就是我所擁有的 – pavlovich

回答

0

where()應改用替代:

$query = db_select('my_table', 'd') 
    ->fields('d', array('sort_id', '`when`', 'user')) 
    ->condition('user', '123') 
    ->where('`when` = :timestamp', array(':timestamp' => 1448160590)) 
    ->execute(); 
0

您的查詢應該是這樣的:

$query = db_select('naughty_table', 'd') 
    ->fields('d', array('`sort_id`', '`when`', '`user`')); 
    ->condition('`user`', $uid) 
    ->limit($limit) 
    ->execute(); 

注重圍繞着田野的反引號。事實上,phpMyAdmin總是使用這些反引號來避免遇到保留字問題。儘管如此,避免在表中命名爲保留字的字段總是一個好主意(我知道你沒有創建它,但只是一個音符)。

+0

您確定db_select是否允許反引號? – pavlovich

+0

我不是100%確定,但技術上它應該,因爲反引號在技術上是無害的。 – itoctopus

+0

在這種情況下,我恐怕它似乎沒有工作 – pavlovich

相關問題