【问题标题】:How can I make this query work in D7?我怎样才能使这个查询在 D7 中工作?
【发布时间】:2012-05-03 16:39:05
【问题描述】:

我正在尝试从我的 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 必须是 数组,字符串给定,调用 C:\wamp2\www\site-name\sites\all\themes\simpler\template.php 上线 52 并在 db_query() 中定义(第 2313 行) C:\wamp2\www\site-name\includes\database\database.inc)。

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

正确的语法是什么?

【问题讨论】:

    标签: mysql sql drupal drupal-7


    【解决方案1】:

    正如错误消息所说:“传递给 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();
    

    为了便于阅读而进行了拆分和重新格式化。未经测试,因此请注意拼写错误。

    请注意末尾的-&gt;fetchField() - 这仅适用于只返回一个字段的查询(例如这个字段)。如果您需要获取更多字段或记录,请查看DatabaseStatementInterface 文档。

    【讨论】:

    • 非常感谢,但是当发件人(当前用户)在私人消息中发送消息而收件人尚未回复时,它仍然在整个网站上给了我 2 个非常难看的警告。警告: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 行)。
    • 有关我们正在尝试解决的问题的更多详细信息,请参阅此帖子drupal.org/node/1549540,看看您是否可以帮助我们完成这项工作。
    • @drupalina - 这些错误消息似乎与查询本身无关,并且在您的一般问题/目标范围内看起来像是完全独立的错误。由于 stackoverflow 是关于特定问题的特定答案,因此在这里解决它们几乎超出了您使查询工作的问题的范围。
    • @drupalina - 此外,我什至无法从此处给出的代码或链接的 drupal.org 线程中猜测可能导致这些错误的原因,除了指出它似乎相当低实体系统内的水平误差。您必须使用调试器直接分析您的测试系统,检查传递给 EntityControlle::load() 和 cacheGet() 函数的 $ids 数组,了解它们为什么不符合预期格式以及它们来自何处。
    • 在收件人回复之前,这些错误仅对发件人显示。换句话说,由于这个查询 uid 是未确定的(我们告诉它排除我们,发件人作者,而收件人尚未创作他的回复),这就是导致这些错误的原因。所以我们还需要告诉它如果 iud 为 none,然后将 uid 设置为 Recepient。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多