2012-09-11 75 views
0

即时通讯使用类似的脚本描述在这里:long-polling info from mysql not working 在我的网站,它的工作,但是,当我刷新页面或点击不同的链接,我得到一个错误提醒+网站开始严重滞后,有人能告诉我这是什么原因?ajax与mysql的长轮询

我的代码:

$oldIDq = mysql_query("SELECT * FROM messages ORDER BY id DESC LIMIT 1"); 
while($oldrow = mysql_fetch_array($oldIDq)){ 
$oldID = $oldrow['id'];  
} 

$func = ' 
var oldID = '.$oldID.'; 

function wait() { 
$.ajax({ 
    type: "GET", 
    url: "../scripts/msg_scripts/msg.php?oldid=" + oldID, 
    async: true, 
    cache: false, 

    success: function (data){ 
    var json = eval(\'(\' + data + \')\'); 

    if (json[\'msg_content\'] != "") { 
     alert("new meassage added"); 
    } 

    oldID = json[\'oldID\']; 
    setTimeout(\'wait()\',1000); 
    }, 

    error: function(XMLHttpRequest, textStatus, errorThrown){ 
     alert("error: " + textStatus + "(" + errorThrown + ")"); 
     setTimeout(\'wait()\',15000); 
    } 

}); 
} 

$(document).ready(function(){ 

    wait(); 
}); 
'; 

服务器:

<?php 
    session_start(); 
    $connect = mysql_connect ("localhost", "root", "") 

or die ("couldnt connect"); 
mysql_select_db ("***") or die ("not found"); //if db was not found die 
mysql_query("SET NAMES 'utf8'"); 

$oldID = $_GET['oldid']; 
$result = mysql_query("SELECT id FROM messages ORDER BY id DESC LIMIT 1"); 
while($row = mysql_fetch_array($result)) 
{ 
    $last_msg_id = $row['id']; 
} 
while($last_msg_id <= $oldID) 
{ 
    usleep(1000); 
    clearstatcache(); 
    $result = mysql_query("SELECT id FROM messages ORDER BY id DESC LIMIT 1"); 
    while($row = mysql_fetch_array($result)) 
    { 
     $last_msg_id = $row['id']; 
    } 
} 
$response = array(); 
$response['msg'] = 'new'; 
$response['oldID'] = $last_msg_id; 
echo json_encode($response); 
?> 
+0

@ moonwave99 - 我同意。 –

+0

aaaargh!帮帮我! eval ===邪恶使用JSON.parse(jsonString)instaid!而且你甚至不需要解析!如果你添加'dataType:'json''参数,jquery可以为你做到这一点! – VDP

+0

谢谢你,我会试试:) – durian

回答

0

proplem在这里$ _GET [ 'OLDID']当你点击另一个链接或刷新页面没有它的变量$ OLDID将是空的,SQL将失败。 和js函数保持调用自己没有任何更改每次错误适应和ajax将继续调用保持失败这将导致无限循环,将挂起您的网站,我想如果你检查它在萤火虫你会看到发生的事情。

现在,如果你的意思是希望它有帮助

+0

和我能做些什么来解决这个问题? – durian

+1

你可以检查oldid是否为null如果返回-1 并且在js中检查如果responce = -1取消wait()调用 – AboQutiesh

+0

所以在服务器端:$ oldID = $ _GET ['oldid']; if($ oldID ==“”){$ oldID == -1}?和js? – durian