我正在使用ajax,php,javascript和mysql制作一个简单的网络聊天应用程序。 我在这里尝试做的是避免在1秒的间隔后取出整个数据库(这通常在基本的聊天应用程序中完成),而是我想要获取并显示(通过附加)那些新输入的聊天任何用户都可以进入数据库。
要实现这一点,首先当用户第一次打开聊天屏幕时,整个数据库都会加载到聊天窗口中(此代码片段中未显示),然后我使用变量msgid来获取MSg_ID的最新值(这是我的聊天表中的自动增量主键)通过对'Msg.php'页面的ajax请求,返回所需的msg_id值。
现在使用msgid的这个值,并通过对“Chat3.php”页面的ajax请求,将它与数据库中每秒的Msg_ID的最大值进行比较。 如果Msg_ID的Max值已更改,则返回所需的行。在此之后,我使用相同的早期ajax请求更新'msgid'的值到页面'Msg.php'
页面Msg.php和Chat3.php工作正常,因为我已经对它们进行了彻底的测试。
我的问题是我的代码中存在什么问题,为什么不工作? 我们可以在ajax回调函数中使用ajax请求吗? 还有什么可能是错误的来源? 任何输入都是有价值的:) 如果您在理解代码时遇到任何问题,请发表评论。 '#yyy'和'#zzz'是随机div元素,我用它来测试ajax回调函数的数据值。
如果它有帮助,我甚至可以发布其余的代码。
<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 :(得分:2)
问题是msgid
在您的第一个AJAX请求中,您要设置本地范围内的变量var msgid=data;
。
我认为您在发送数据时尝试在第二个AJAX
请求中访问该变量
url: 'scripts/php/Chat3.php',
data: {dept:dept,msgid:msgid}, // Trying to access the local variable of previous ajax request
修改强>
尝试从第一个var
请求中删除var msgid=data;
中的AJAX
。删除var
将使变量GLOBAL
,虽然它不利于污染全局范围,但你肯定可以暂时尝试这个