2012-05-03 42 views
3

我想從我的template.php D6網站如何使這個查詢在D7中工作?

$uid = db_query('SELECT pm.author FROM {pm_message} pm INNER JOIN {pm_index} pmi ON pmi.mid = pm.mid AND pmi.thread_id = %d WHERE pm.author <> %d ORDER BY pm.timestamp DESC LIMIT 1', $thread['thread_id'], $user->uid); 

線52到D7標準重寫這個數據庫查詢。

但它一直給我

Recoverable fatal error: Argument 2 passed to db_query() must be an array, string given, called in C:\wamp2\www\site-name\sites\all\themes\simpler\template.php on line 52 and defined in db_query() (line 2313 of C:\wamp2\www\site-name\includes\database\database.inc).

這DB查詢是一個template.php文件片斷顯示了悄悄話模塊用戶照片的一部分,使它看起來像Facebook或其他社交網站。你可以在這裏看到完整的片段。由於私人消息具有統一的值$參與者(或消息線程),因此該數據庫查詢基本上試圖隔離除當前用戶以外的最後作者。

什麼是正確的語法?

回答

6

如錯誤消息所示:'傳遞給db_query()的參數2必須是數組...'。

Drupal 7的切換數據庫層使用PDO,所以佔位符置換db_query()改變了一點 - 嘗試:

$query = 'SELECT pm.author FROM {pm_message} pm' 
    . ' INNER JOIN {pm_index} pmi ON pmi.mid = pm.mid AND pmi.thread_id = :thread_id' 
    . ' WHERE pm.author <> :uid' 
    . ' ORDER BY pm.timestamp DESC LIMIT 1'; 
$args = array(
    ':thread_id' => $thread['thread_id'], 
    ':uid' => $user->uid, 
); 
$uid = db_query($query, $args)->fetchField(); 

分裂和重新格式化爲可讀性。未經測試,所以要小心輸入錯誤。

注意最後的->fetchField() - 這隻適用於只返回一個字段的查詢(比如這個)。如果您需要獲取更多字段或記錄,請查看DatabaseStatementInterface文檔。

+0

非常感謝,但是在發送者(當前用戶)發送消息並且Recepient尚未回覆的私人消息中,它仍然給我整個站點2個非常難看的警告。 Warning:array_flip()[function.array-flip]:只能翻轉STRING和INTEGER的值!在DrupalDefaultEntityController-> load()(C:\ wamp2 \ www \ testsite7 \ includes \ entity.inc中的第178行)中。 警告:array_flip()[function.array-flip]:只能翻轉STRING和INTEGER值!在DrupalDefaultEntityController-> cacheGet()(C:\ wamp2 \ www \ testsite7 \ includes \ entity.inc的第354行)中。 – drupalina

+0

有關我們正在嘗試解決的問題的更多詳細信息,請參閱此帖子http://drupal.org/node/1549540,看看您是否可以幫助我們實現這一目標。 – drupalina

+0

@drupalina - 這些錯誤消息似乎與查詢本身沒有關係,並且看起來像是在您的一般問題/目標範圍內的完全單獨的錯誤。由於stackoverflow是關於特定問題的特定答案,所以在這裏解決它們幾乎超出了查詢工作的範圍。 –