0

我有这个 jQuery 代码,它只是假设在数据库中找到记录时显示新消息的警报。

index.html(jQuery 代码)

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>

<script>

$(document).ready(function(){
    var count = 0;
    setInterval(function() {
        $.post("messagecheck.php", { countOld: count },
        function(data){
            if(data == 0) {
                alert("No New Messages");
                return;
         } else {
                count = data; // This will change the count for each run, you could store this in div with .data() ...
                alert("New Message!");
                return;        
         }
            });
        }, 1000);
    });
</script>

消息检查.php

<?php

    if($uid == 0) {
        die(); // not logged in
    } else {
        $sql = 'SELECT messagecount FROM Users WHERE uid = $uid AND messagecount >= 1';
        $result = mysql_query($sql);         
        if(!$result) {
            // Kill SQL and return error
        } else {
            // We will be sending an Old Count via POST
            $numRows = mysql_num_rows($result);
            echo $numRows;
            if( $numRows == $_POST['countOld']) {
                // No change
                echo 'No change: 0';    
            } else 
                echo $numRows;
        }
    }

?>

即使 $uid 为 0(用户未登录),新消息的警报!显示。

我能做些什么来解决这个问题?

谢谢。

4

4 回答 4

7

这是你的条件:

if(data == 0) {

这是您的 AJAX 调用返回的内容:

echo 'No change: 0';

条件计算结果为false因为'No change: 0'不等于0

于 2013-07-12T12:58:14.237 回答
4

你有很多逻辑问题。

  1. 如果用户 ID 为 0(未登录),那么您将终止 PHP 脚本;什么都没有返回。这与 不同false它将评估为'''' !== 0

  2. 如果 SQL 语句失败,同样的问题。

无论如何,您都需要重构 PHP 脚本以返回一致的结果。像这样的东西:

<?php
$new_messages = false;

if ($uid > 0) {
    $sql = 'SELECT messagecount FROM Users WHERE uid = ? AND messagecount >= 1';

    $stmt = $db->prepare($sql);
    $stmt->execute(array($uid));
    $row = $stmt->fetchObject();

    if (is_object($row) && intval($row->messagecount) !== intval($_POST['countOld'])) {
        $new_messages = true;
    }
}

header('Content-Type: application/json');

print json_encode(array(
    'new_messages' => $new_messages
));

无论如何,这将返回一个布尔 (true或) 值,然后您可以在 JavaScript 中对其进行测试:false

$.post('messagecheck.php', { countOld: count }, function(result) {
    if (result && result.new_messages) {
        if (result.new_messages === true) {
            alert('You have a new message.');
        }
    }
});

此外,不要使用mysql_函数,根据 PHP.net 手册页上的警告,它们已被弃用:http: //php.net/manual/en/function.mysql-query.php。请改用PDOMySQLi

于 2013-07-12T13:09:51.847 回答
2

如果$uid0,则服务器不会发送任何数据。data将是空的,因此data == 0将评估为假。尝试这个:

if (!data) {
    alert("No New Messages");
    return;
} else {
    count = data;
    alert("New Message!");
    return;
}
于 2013-07-12T13:01:44.660 回答
1

基本上有六件事可能是问题 - 我能想到:

  • 在 PHP 中,您正在回显“No change: 0”。
  • 您正在die();用作返回值
  • 你重复了两次相同的数字。
  • $numRows和/或$_POST['countOld']不返回预期值
  • 在 jQuery 中,您使用 ==。此运算符评估一个值
  • 您每秒执行一次 ajax 代码,而 jQuery 正在执行异步调用

更改部分PHP:

   } else {
        // We will be sending an Old Count via POST
        $numRows = mysql_num_rows($result);
        echo $numRows;
        if( $numRows == $_POST['countOld']) {
            // No change
            echo 'No change: 0';    
        } else 
            echo $numRows;
    }

至:

   } else {
        // We will be sending an Old Count via POST
        $numRows = mysql_num_rows($result);
        //Before you hade echo $numRows. This would make numRows echo out twice
        //because it's echoed it down below also
        if( $numRows == $_POST['countOld']) {
            // No change
            echo 0; //Echo out 0.    
        } else 
            echo $numRows;
    }

为什么?因为 echo 'No change: 0'; 评估为 false 并且没有值 0。

在 jQuery (javascript) 中 -使用 typeof 检查实际值,如下所示:

<script>  
    $(document).ready(function(){
        var count = 0;
        setInterval(function() {
            $.post("messagecheck.php", { countOld: count },
            function(data){
                if(typeof data == 0) {
                    alert("No New Messages");
                    return;
             } else {
                    count = data; // This will change the count for each run, you could store this in div with .data() ...
                    alert("New Message!");
                    return;        
             }
                });
            }, 1000);
        });
    </script>

记录/检查$numRows 和 $_POST['countOld'] 的值,看看你是否得到了你所期望的。

您每秒执行一次 ajax 代码,而 jQuery 正在执行异步调用。如果上面做的一切看起来都很好,我会将间隔更改为更大的数字,以确保调用本身不会把事情搞砸。我不确定您是否必须经常检查一次?

die()当 userid = 0 时不使用,只需echo '0';。(那么脚本不会失败)

当然 -如果你绝对不需要,不要使用 mysql_ - functions*,因为它们已被弃用。在你的情况下,它对 sql-injections 等开放,但这是另一个问题。

于 2013-07-12T15:04:01.713 回答