【问题标题】:some query statement not working with db_query(Drupal)某些查询语句不适用于 db_query(Drupal)
【发布时间】:2010-09-05 13:57:23
【问题描述】:

为什么某些在 mysql 中有效的查询不适用于 db_query?比如——

" SELECT * FROM {tb1},{tb2}WHERE {tb1}.vid=%d " (当然我在mysql环境中测试时用实际的vid值替换%d)

“从 {tb1} 内连接 {tb2} 中选择 f1,f2,...,f10 在 {tb1}.vid = {tb2}.vid WHERE {tb1}.vid = %d AND {tb2}.vid = %d

虽然我在 mysql 环境中为这两个语句返回了 1 条记录,但 db_query 根本没有返回任何内容。知道我犯了什么错误吗?值得一提的是,我使用的是 IIS 7.5、Mysql 5.5、php 5.2.12 ****UPDATE**** db_query/db_fetch_object 工作得很好。只是 hook_view 没有被调用。因此,结果是不显示任何数据。给您添麻烦了。

更新

function mymodule_load($node){
   $query = 'SELECT f1,f2,...,f10 FROM {tb1} INNER JOIN {tb2} ON {tb1}.vid = {tb2}.vid WHERE {tb1}.vid = %d AND {tb2}.vid = %d';

   $result = db_query($query,$node->vid);//If I use db_query($query,$node->vid,$node->vid), drupal doesn't invoke hook_view

   drupal_set_message($node->vid,"status"); //for testing purpose
   return db_fetch_object($result);
}

function mymodule_view($node, $teaser = FALSE, $page = FALSE){
    $node = node_prepare($node, $teaser); // get it ready for display

    $f1 = check_markup($node->f1);
     ..............
    $f10 = check_markup($node->f10);

    // Add theme stuff here
    $node->content['mycontent'] = array(
       '#value' => theme('defaultskin', $f1,...,$f10),
       '#weight' => 1,
    );


    return $node;
}

function mymodule_theme(){

    return array(
        'defaultskin' => array(
            'template' => 'node-defaultskin',
            'arguments' => array(               
                'f1' => NULL,
                ......
                'f10' => NULL,
            ),
        ),
    );
}

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

    你试过了吗……

    db_query("从 {tb1} tb1 中选择 f1,f2,...,f10
    内连接 {tb2} tb2 ON tb1.vid = tb2.vid
    WHERE tb1.vid = %d AND tb2.vid = %d", $vid, $vid);

    【讨论】:

    • 我试过了。它仍然不起作用。奇怪的是,如果我为 WHERE 子句提供两个条件,例如上面的 db_query 中只有一个占位符参数,drupal 会调用 hook_view,尽管 $node 对象中没有填充实际数据;只是空了。当我传递两个占位符参数只是为了对应 sql 语句中占位符的数量时,drupal 不再调用 hook_view。对于一个带有一个占位符参数的 WHERE 子句条件,情况相同。我已经更新了我的帖子,以便您清楚地了解我在说什么。
    【解决方案2】:

    你的 hook_load 实现有点错误。

    /**
     * Implementation of hook_load().
     */
    function module_load($node) {
      $additions = db_fetch_object(db_query('f1,f2,...,f10 FROM {tb1} 
                                             INNER JOIN {tb2} ON {tb1}.vid = {tb2}.vid
                                             WHERE {tb1}.vid = %d', $node->vid)); //
    
      return $additions;
    }
    

    您不应该返回节点,而是要添加到节点的添加。此外,您不需要两个 where 子句,因为您加入了 vid。

    您的问题可能是查询正在运行,但您在挂钩中返回了错误的内容。

    您还可以在example module 中查看它的使用示例。

    【讨论】:

    • 我正在使用 db_fetch_object 来获取实际数据。
    • 您好谷歌,感谢您的回复。我的 hook_load 不返回 $node。它从 db_fetch_object 返回对象。我在对 Kidrobot 回复的评论回复中提到了“WHERE”子句的奇怪问题。
    • 我收回我的上述评论。我测试并发现 db_query/db_fetch_object 没有错。他们工作得很好。我没有结果的结论来自于 hook_view 没有被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2020-10-21
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多