由于ajax调试起来非常麻烦,所以我们应该把前后端分开测试,代码如下:

后端代码:(comentbyajax.php)

<?php
require_once './dbcon.php';
set_time_limit(0);
//echo json_encode(array('content'=>'aaaaaa'));exit; ①
$rec = $_COOKIE['username'];
$sql = "select * from msg where rec='$rec' and isread=0 limit 1";//防止取到多条数据没能及时显示
//echo json_encode(array('content'=>$sql));exit;②
while (true){
	$rs = mysql_query($sql, $conn);	
	$row = mysql_fetch_assoc($rs, $conn);	//注意:此处特意写错,正确的为mysql_fetch_assoc($rs)③
	if(!empty($row)){
		echo json_encode($row);
		break;
	}
	sleep(1);
}
?>

前端代码:(custom.php)

<?php
if(empty($_COOKIE['username']))
setcookie('username', 'user'.rand(10000,99999));
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>在线用户端</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script type='text/javascript'>
$(function(){//长轮询(注:该函数在页面加载完成后自动执行)
	var setting = {
			url:'comentbyajax.php',
			dataType:'json',
			type:'post',
			success:function(res){④
				var cont = '<p>客服对你说:<br/>'+res.content+'</p><br/>';
				$('#msgzone').append(cont);
			}
	};
	$.ajax(setting);
});

function xunwen(){
	var cont = $('textarea:first').val();
	$.post('sendmsg.php',{rec:'admin',content:cont},function(res){
		if(res == 'ok'){
			var wen = '<p>你对客服说:<br/>'+cont+'</p>';
			$('#msgzone').append(wen);
		}
	});
}
</script>
<style type="text/css">
#msgzone{
	border: 1px solid gray;
	width:400px;
	height:200px;
	overflow:scroll;
}
</style>
</head>
<body>
	<h2>coment反向ajax技术---在线客服系统---之用户端</h2>
	<h3>原理:ajax+长连接+轮询(长轮询),获取实时内容,并更新到父页面</h3>
	<div id='msgzone'></div><!-- 聊天信息区域 -->
	<textarea></textarea>
	<input type='button' value='咨问' onclick='xunwen();'/>
</body>
</html>

问题描述:执行custom.php文件时出现comentbyajax.php不能正确返回信息给custom.php。

排查:此时排查的过程我们要分步骤查找(即分别在comentbyajax.php和custom.php查找)

首先在comentbyajax.php文件中添加echo json_encode(array('content'=>'aaaaaa'));exit;调试语句保存(如①处所示),然后执行custom.php文件,看④处是否能正确输出信息,如果能则表明custom.php写法正确,接下来重点排查comentbyajax.php,怀疑是否在拼接sql字符串中出错,然后再添加echo json_encode(array('content'=>$sql));exit;调试语句保存(如②处所示),然后拷贝④处得到的信息并粘贴到mysql命令窗口执行,如图所示:

发现语句正确执行并返回信息,干脆狠下心来单独执行comentbyajax.php文件,所以将代码修改为:

<?php
require_once './dbcon.php';
set_time_limit(0);

//echo json_encode(array('content'=>'aaaaaa'));exit;

$rec = $_COOKIE['username'];
$sql = "select * from msg where rec='$rec' and isread=0 limit 1";//防止取到多条数据没能及时显示
//echo json_encode(array('content'=>$sql));exit;
//while (true){
	$rs = mysql_query($sql, $conn);	
	$row = mysql_fetch_assoc($rs, $conn);	
	if(!empty($row)){
		echo json_encode($row);
		//break;
	}
	sleep(1);
//}
?>

再去执行它,发现输出错误信息:

此时很明显mysql_fetch_assoc()写错了。

解决:由于comentbyajax.php文件中的③处错将mysql_fetch_assoc($rs)写成了mysql_fetch_assoc($rs, $conn),该语句造成了php执行时出错的同时也没有返回任何信息给④处。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐