Drupal没有从DB中读取正确的值

时间:2010-04-08 14:12:15

标签: php jquery database drupal caching

这是我目前的问题。我正在使用chat module,我正在构建一个模块,通过AJAX通知用户他们已被邀请参加聊天。邀请表的当前表结构如下所示:

|-------------------------------------------------------------------------|
|  CCID  |  NID  |  INVITER_UID  | INVITEE_UID  |  NOTIFIED  |  ACCEPTED  |
|-------------------------------------------------------------------------|
|  int   |  int  |     int       |     int      |  (0 or 1)  |  (0 or 1)  |
|-------------------------------------------------------------------------|

我正在使用JQuery的periodical updater插件不断轮询服务器以检查邀请。当找到邀请时,我将通知从0设置为1.但是,我的问题是定期更新程序。当我第一次看到有邀请时,我通知用户,并将通知设置为1.在下一个选择中,我之前得到相同的结果,就像更新不起作用一样。但是,当我检查数据库时,我可以看到它工作得很好。就像查询正在查询缓存一样,但我无法弄明白。

我的定期更新程序代码如下:

window.onload = function() {


var uid = $('a#chat_uid').html();

$.PeriodicalUpdater(
    '/steelylib/sites/all/modules/_chat_whos_online/ajax/ajax.php',     //url to service
    {
       method: 'get',           //send data via...
       data: {uid: uid},        //data to send
       minTimeout: '1000',      //min time before server is polled (milli-sec.)
       maxTimeout: '20000',     //max time before server is polled (milli-sec.)
       multiplyer: '1.5',       //multiply against curretn poll time every time constant     data is returned
       type: 'text',            //type of data recieved (response type)
       maxCalls: 0,             //max calls to make (0=unlimited)
       autoStop: 0              //max calls with constant data (0=unlimited/disabled)

    },
    function(data)              //callback function
    {
        alert( data ); //for now, until i get it working
    }
);

}



我的ajax调用代码如下:

<?php

#bootstrap Drupal, and call function, passing current user's uid.

function _create_chat_node_check_invites($uid)
{    
    cache_clear_all('chatroom_chat_list', 'cache');
    $query = "SELECT * FROM {chatroom_chat_invite} WHERE notified=0 AND invitee_uid=%d     and accepted=0";
    $query_results = db_query( $query, $uid );
    $json = '{"invites":[';
    while( $row = db_fetch_object($query_results) )
    {
      var_dump($row);
        global $base_url;
        $url = $base_url . '/content/privatechat' . $uid .'-' . $row->inviter_uid;

        $inviter = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->inviter_uid ) );
        $invitee = db_fetch_object( db_query( "SELECT name FROM {users} WHERE uid = %d", $row->invitee_uid ) );

      #reset table
      $query = "UPDATE {chatroom_chat_invite} "
                ."SET notified=1 "
                ."WHERE inviter_uid=%d AND invitee_uid=%d";
      db_query( $query, $row->inviter_uid, $row->invitee_uid );

        $json .= '[';
        $json .= '"' . $url . '",';
        $json .= '"' .  ($inviter->name) . '",';
        $json .= '"' . ($invitee->name) . '"' ;
        $json .= '],';
    }
    $json = substr($json, 0, -1);
    $json .= ']}';

    return $json;
}
?>

我无法弄清楚出了什么问题,非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

浏览器可能正在缓存GET调用。尝试将cache-buster值添加到AJAX请求的URL(当前时间效果很好),以便每次都强制重新加载。

答案 1 :(得分:0)

嗯,已经有一段时间了,我终于弄明白了我的问题,但我意识到,如果其他人找到这个页面并想要一个答案,那么他们就不走运了。所以这就是问题所在。

正确的AJAX调用的处理程序使用Drupal函数,我不得不引导Drupal(上面使用但未显示)。但是,当我引导Drupal时,我做了一个完整的bootstrap。这导致聊天模块调用检查邀请的钩子。我没有意识到这是被调用的,因为在正常使用中,没有任何通知我...无论如何,钩子是为了检查通知并提醒用户(不知何故......我不知道怎么做)以及何时它选中后,它会将通知标志设置为true。

因此,在调用我的AJAX处理程序时,邀请已被设置为ChatRoom模块通知。所以,我的解决方案只是部分引导程序。引导程序的代码如下。我在其他人的网站上找到了该脚本,但我不确定它是什么。无论如何......这是代码:

<?php
    #bootstrap drupal to get access to drupal functions
    define('STRIP_LEN', -41); #length of path to use (strip off stuff like /sites/all/...)
    $base_url =  substr(getcwd(), 0, STRIP_LEN);
    chdir($base_url);
    global $base_url;

    $base_root = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';

    $base_url = $base_root .= '://' . preg_replace('/[^a-z0-9-:._]/i', '', $_SERVER['HTTP_HOST']);

    if( $dir = trim( dirname( $_SERVER['SCRIPT_NAME'] ), '\,/' ) )
    {
        $base_path = "/$dir";
        $base_url .= $base_path;
    }
    $base_url = substr($base_url, 0, STRIP_LEN);


    require_once './includes/bootstrap.inc';
    require_once './includes/common.inc';

    drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

    require_once drupal_get_path('module', '_chat_whos_online') . '/_chat_whos_online.inc';

    #END BOOTSTRAPPING
?>