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 行)。

此数据库查询是 template.php 片段的一部分,该片段在私人消息模块中显示用户图片,并使其看起来像 Facebook 或其他社交网站。你可以在这里看到完整的片段。因为私人消息有一个统一的价值 $participants (或消息线程)这个数据库查询基本上是试图隔离除当前用户之外的最后一个作者。

什么是正确的语法?

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()最后的 - 这仅适用于只返回一个字段的查询(如这个)。如果您需要获取更多字段或记录,请查看DatabaseStatementInterface文档。

于 2012-05-04T00:26:53.737 回答