开发笔记|PHP+AJAX前后端交互调试的关键注意事项
由于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执行时出错的同时也没有返回任何信息给④处。

浙公网安备 33010602011771号