2015-07-03 205 views
2

我正在使用ajax,php,javascript和mysql製作一個簡單的網絡聊天應用程序。 我在這裏要做的是避免在1秒的時間間隔(通常在基本聊天應用程序中完成)獲取整個數據庫,而是想要獲取並顯示(通過附加)也是新近的聊天記錄由任何用戶輸入到數據庫中。這段jQuery Ajax代碼是否正確?

爲了實現這個功能,首先當用戶第一次打開聊天窗口時,整個數據庫被加載到聊天窗口中(此代碼片段中未顯示),然後我使用變量msgid來獲取MSg_ID的最新值(這是我的聊天表中的自動遞增主鍵)通過ajax請求到頁面'Msg.php',該頁面返回所需的msg_id值。

現在使用此值的msgid並通過對頁面'Chat3.php'的ajax請求將其與數據庫中每秒鐘的Msg_ID的最大值進行比較。 如果Msg_ID的最大值已更改,則返回所需的行。在此之後,我使用與頁面'Msg.php'相同的較早的ajax請求更新'msgid'的值。我已經徹底測試了它們,Msg.php和Chat3.php頁面正常工作。

我的問題在這裏是我的代碼是什麼問題,爲什麼不工作? 我們可以在ajax回調函數中使用ajax請求嗎? 還有什麼可能是錯誤的可能來源? 任何輸入將是有價值的:) 如果您在理解代碼時有任何問題,請發表評論。 '#yyy'和'#zzz'是我用來測試ajax回調函數的數據值的隨機div元素。

我甚至可以發佈其他代碼,如果有幫助。

<script type"text/javascript"> 
     $(document).ready(function() { 
     var dept = '<?php echo $deptId; ?>'; 

     $.ajax({ 
       url: 'scripts/php/Msg.php', 
       data: {dept:dept}, 
       success: function(data) { 
        $('#yyy').html(data);//this displays the correct value 
       var msgid=data; 
      } 
     }); 

     var interval = setInterval(function() { 
     $.ajax({ 
       url: 'scripts/php/Chat3.php', 
       data: {dept:dept,msgid:msgid}, 
       success: function(data) { 
        if(data!='bad'){  
         //$('#messages').prepend(data); 
         $('#zzz').html(data);//does not display any value although Chat3.php is returning the correct value. 
         //below ajax request to update the value of msgid 
         $.ajax({ 
         url: 'scripts/php/Msg.php', 
         data: {dept:dept}, 
         success: function(data) { 
         var msgid=data; 
         $('#zzz').html(data); //not displaying anything although above one is was displaying 
         } 
         }); 
        } 
       } 
     }); 

    }, 1000); 
    }); 
    </script> 

這裏是我的Msg.php

<?php 
    require '../../includes/database/connect.db.php'; 
    function get_msg($dept){ 

    $query= "SELECT Msg_ID,Sender, Message ,Time_stamp FROM chat WHERE Dept_ID='$dept' ORDER BY Msg_ID DESC" ; 
    $run=mysql_query($query); 

    $messages =array(); 
    while($message=mysql_fetch_assoc($run)){ 
     $messages[] =array('msgid'=>$message['Msg_ID'], 
         'sender'=>$message['Sender'], 
          'message'=>$message['Message'], 
         'time_stamp'=>$message['Time_stamp']); 
    } 
    return $messages; 
} 
$dept=$_GET['dept']; 
$messages = get_msg($dept); 

    $x=count($messages); 
if($x){ 
      foreach($messages as $message) { 
       if($x==count($messages)){ 
       echo $message['msgid']; 
      } 
     $x--; 
    } 
    }  
?> 

這裏是我的Chat3.php

<?php 
    require '../../includes/database/connect.db.php'; 
    function get_msg($dept,$msgid){ 
    $query1= "SELECT MAX(Msg_ID) as msg_id FROM chat" ; 
    $run1=mysql_query($query1); 
    $row = mysql_fetch_assoc($run1); 
     $result =$row['msg_id']; 

     $messages =array(); 
     if($result>$msgid) 
     { 
     $query= "SELECT Sender, Message ,Time_stamp FROM chat WHERE Dept_ID='$dept' AND Msg_ID>'$msgid' ORDER BY Msg_ID DESC" ; 
     $run=mysql_query($query); 

     while($message=mysql_fetch_assoc($run)){ 
     $messages[] =array('sender'=>$message['Sender'], 
          'message'=>$message['Message'], 
         'time_stamp'=>$message['Time_stamp']); 
     } 
     return $messages; 
    } 
    else 
    { 
     return $messages; 
    } 
    } 

    $dept=$_GET['dept']; 
    $msgid=$_GET['msgid']; 
    $messages = get_msg($dept,$msgid); 

    if(count($messages)){ 
     foreach($messages as $message) { 
      echo '<strong>'.$message['sender'].' Sent</strong><br>'; 
      echo $message['message'].' <i><small><div  align="right">'.$message['time_stamp'].'</i></small></div>'; 
     } 

    }  
    else { 
    echo 'bad'; 
    } 
?> 
+0

如果Msg.php和Chat3.php工作正常,其他錯誤是什麼你收到了嗎? – Abhinav

+0

沒有錯誤產生,它只是在回調函數中顯示'data'元素,就好像它沒有收到它或什麼,並且我已經完全檢查了我的Msg.php和Chat3。php –

+0

只是爲了通知,您所做的ajax請求類型是GET類型,因爲沒有其他聲明,所以如果您要獲取發佈數據,則必須在對象中設置類型:'POST'。 – Djip

回答

2

的問題是msgid

在你的第一個AJAX請求您設置在本地範圍內的變量var msgid=data;

我認爲你是在試圖訪問該變量在第二AJAX請求而發送的DATAS

url: 'scripts/php/Chat3.php', 
data: {dept:dept,msgid:msgid}, // Trying to access the local variable of previous ajax request 

編輯:

嘗試在你的第一個AJAX要求去除var msgid=data;var。刪除var將使變量GLOBAL,雖然它不好污染全球範圍,但你絕對可以試試這個暫時

+0

是的,做了訣竅:)我不知道JavaScript也有像C++和其他語言的範圍的局部性 –

+0

'JS'確實有範圍:) – Abhinav