在PHP聊天应用程序中,status='0'
使用unread message
而status='1'
使用read messages
进行通知。如果用户在auto-fetch messages
脚本中收到新消息,我需要chat.php
。我正在使用ajax来获取自动消息,但不能正常工作。
Ajax脚本:
$(document).ready(function() {
// check once in five seconds
setInterval(function() {
$.get('chat.php', {
do: 'new_messages'
}, function(response)
{
if(response == 1) {
window.location.reload();
}
});
}, 5000);
});
php脚本:
if(isset($_GET['do']) && $_GET['do'] == 'new_messages') {
require('conn.php');
$sql = "SELECT status from chat where tothe='$email' order by id desc";
$result = mysqli_query($con, $sql);
if($row = mysqli_fetch_array($result)){
return $there_are_new_messages;
}
if($there_are_new_messages) {
echo 1; exit;
}
}
请帮帮我。
答案 0 :(得分:1)
很抱歉,你的代码格式很糟糕,但我把它清理干净了。一旦这样做,它就更具可读性,事情开始变得有意义。
$(document).ready(function() {
// check once in five seconds
setInterval(function() {
$.get('chat.php', {do: 'new_messages'}, function(response){
if(response == 1) {
window.location.reload();
}
});
}, 5000);
});
if(isset($_GET['do']) && $_GET['do'] == 'new_messages') {
require('conn.php');
$sql = "SELECT status from chat where tothe='$email' order by id desc";
$result = mysqli_query($con, $sql);
if($row = mysqli_fetch_array($result)){
return $there_are_new_messages;
}
if($there_are_new_messages) {
echo 1;
exit;
}
}
根据您发布的代码。
此变量无处可见$there_are_new_messages
。这个未知变量对于您拥有的代码非常重要。没有它:
- you return nothing
- the second (fall back) if condition fails.
让我们假设1
。
如果第一个if条件成功,则会找到结果。您将返回此变量,或者我们正在猜测1
。现在在秋季回来,如果,它是条件,1是真的那么很好,那么我们回应一个硬编码1.所以我们返回1为1,如果失败我们回应1为倒退。基本上相同的值是"返回" (更多关于后者)
现在让我们假设0
。
如果第一个if条件成功,则会找到结果。您将返回此变量,或者我们正在猜测0
。现在在倒退时,如果是条件,那么0不是真的,所以if条件不能通过而且没有任何回应。所以在这两种情况下我们都会返回一个假值,或者我的意思是返回/输出的值类似。
这些只是作为该变量的猜测,更重要的是它包含的值不包含在问题中。
对我来说逻辑上这个返回值似乎是错误的。问题是,是否有新消息是(返回?)否(返回1)。对我来说1意味着真实,0意味着错误。也许你在问多少新消息?那么它在逻辑上是有意义的,但似乎并非如此,因为没有返回计数值。这只是一个意见,所以从表面看它。
此外:
return $there_are_new_messages;
我们不能将东西归还给客户。我们必须输出它们。或者换句话说echo
所以这个回报没有效果。
$sql = "SELECT status from chat where tothe='$email' order by id desc";
同样$email
未定义,因此这个SQL注定要失败。更不用说你只是在查询中坚持它而不考虑安全性。因此,这可能会对您的数据库产生SQLInjection攻击。即使你认为这个值是安全的,我仍然会使用预备语句。使用它们不会丢失任何东西,如果您稍后更改代码,则不必担心它现在是否不安全。您可以更改设置$email
的位置,它可能会对安全性产生影响,您可能不记得此查询未正确清理等...
最后:
我会尝试修复它,但不知道$there_are_new_messages
应该是什么,并给出我想称之为variable confusion
的内容,也就是说我不知道这些变量代表什么,它们以混乱的方式使用。我无能为力,但解释我所看到的错误。
当然,我可以把一些解决方案拼凑起来,这可能是也可能不是你想要的,但我认为最好指出事情正在分崩离析然后试图做出假设。例如,$email
未定义。它来自哪里,你如何得到它。它是页面上的输入,是从DB中的用户记录中提取的,是否是$ _SESSION数据的一部分。我无从得知,因为我无法给出合理的答案。
PS。不要采取任何错误的方式。通常,我被告知,我可以像居高临下一样离开,或者像我说话一样。这不是意图,我只是直言不讳。每个人都会犯错误编码,每个人都必须通过反复试验来学习。
祝你好运。
答案 1 :(得分:0)
试试这个。我认为你不需要使用回报。
if(isset($_GET['do']) && $_GET['do'] == 'new_messages') {
require('conn.php');
$sql = "SELECT status from chat where tothe='$email' order by id desc";
$result = mysqli_query($con, $sql);
if($row = mysqli_fetch_array($result)){
echo $row["status"];
} else {
echo 1;
}
exit;
}
我不知道为什么你在没有声明的情况下使用$there_are_new_messages
,无论如何,如果你想使用$there_are_new_messages
你可以这样使用。
if(isset($_GET['do']) && $_GET['do'] == 'new_messages') {
require('conn.php');
$sql = "SELECT status from chat where tothe='$email' order by id desc";
$result = mysqli_query($con, $sql);
$there_are_new_messages = false;
if($row = mysqli_fetch_array($result)){
$there_are_new_messages = $row["status"];
}
if($there_are_new_messages){
echo 0;
} else {
echo 1;
}
exit;
}