网站自动提取消息到PHP聊天应用程序无法正常工作

时间:2018-04-01 05:06:19

标签: javascript php mysql ajax

在PHP聊天应用程序中,status='0'使用unread messagestatus='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;
 } 
} 

请帮帮我。

2 个答案:

答案 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;
}