3

template.php D6 サイトの 52 行目からこのデータベース クエリを書き直そうとしています。

  $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規格に。

しかし、それは私に与え続けます

回復可能な致命的なエラー: db_query() に渡される引数 2 は、指定された文字列の配列である必要があり、52 行目の C:\wamp2\www\site-name\sites\all\themes\simpler\template.php で呼び出され、db_query で定義されます() (C:\wamp2\www\site-name\includes\database\database.inc の 2313 行目)。

この DB クエリは、プライベート メッセージ モジュールでユーザーの写真を表示する template.php スニペットの一部であり、Facebook や他のソーシャル ネットワーキング サイトのように見せます。ここで完全なスニペットを見ることができます。Private Messages には統一された値 $participants (またはメッセージ スレッド) があるため、この DB クエリは基本的に、現在のユーザーを除く最後の作成者を分離しようとしています。

正しい構文は何ですか?

4

1 に答える 1

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()- これは、正確に 1 つのフィールドを返すクエリ (このようなもの) でのみ機能します。さらにフィールドまたはレコードを取得する必要がある場合は、DatabaseStatementInterfaceのドキュメントを参照してください。

于 2012-05-04T00:26:53.737 に答える