2012-05-03 4 views
3

Я пытаюсь переписать этот запрос к базе данных из строки 52 моего 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); 

в стандарты 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 фрагмента кода, который показывает фотографии пользователя в Private Messages модуль, и делает его похожим на Facebook или другой социальной сети. Здесь вы можете увидеть полный фрагмент. Поскольку личные сообщения имеют унифицированное значение $ участников (или поток сообщений), этот запрос БД в основном пытается изолировать последнего автора, кроме текущего пользователя.

Каков правильный синтаксис?

ответ

6

Как говорится в сообщении об ошибке: «Аргумент 2, переданный в db_query(), должен быть массивом ...».

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

Спасибо большое, но он по-прежнему дает мне 2 очень уродливых предупреждения по всему сайту, когда в частных сообщениях отправитель (текущий пользователь) отправил сообщение, а получатель еще не ответил. Предупреждение: array_flip() [function.array-flip]: может только перебрасывать значения STRING и INTEGER! в DrupalDefaultEntityController-> load() (строка 178 из C: \ wamp2 \ www \ testsite7 \ includes \ entity.inc). Предупреждение: array_flip() [function.array-flip]: может только перебрасывать значения STRING и INTEGER! в DrupalDefaultEntityController-> cacheGet() (строка 354 из C: \ wamp2 \ www \ testsite7 \ includes \ entity.inc). – drupalina

+0

Для получения дополнительной информации о проблеме, которую мы пытаемся решить, см. Это сообщение http://drupal.org/node/1549540 и посмотрите, можете ли вы помочь нам в этом. – drupalina

+0

@drupalina - эти сообщения об ошибках, похоже, не связаны с самим запросом и выглядят как отдельные отдельные ошибки в рамках общей задачи/цели. Поскольку stackoverflow касается конкретных ответов на конкретные вопросы, их устранение здесь в значительной степени выходит за рамки вашего вопроса о том, как заставить запрос работать. –

Смежные вопросы