jQuery Code无论如何运行

时间:2013-07-12 12:56:42

标签: php jquery sql

我有这个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>

messagecheck.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 个答案:

答案 0 :(得分:7)

这是你的条件:

if(data == 0) {

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

echo 'No change: 0';

条件评估为false,因为'No change: 0'不等于0

答案 1 :(得分:4)

你有很多逻辑问题。

  1. 如果用户ID为0(未登录),则会终止PHP脚本;没有任何回报。这false相同,它将评估为'''' !== 0

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

  3. 无论如何,您都需要重新调整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
    ));
    

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

    $.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

答案 2 :(得分:2)

如果$uid0,则不会从服务器发送数据。 data将是emtpy,因此data == 0将评估为false。试试这个:

if (!data) {
    alert("No New Messages");
    return;
} else {
    count = data;
    alert("New Message!");
    return;
}

答案 3 :(得分:1)

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

  • 在PHP中你回答'没有变化:0'。
  • 您使用die();作为返回值
  • 你两次回复相同的号码。
  • $numRows和/或$_POST['countOld']未返回预期 值
  • 在jQuery中你正在使用==。此运算符计算值
  • 你每秒执行一次jjax代码并且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;
    }

为什么?因为回音'无变化:0'; evaulates为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正在执行异步调用。如果上面的内容完全正常,那么 我会将间隔更改为更大的数字 ,以确保调用本身不会搞砸了。我不确定你需要经常检查一下吗?

当用户ID = 0时

而不是 die() 只是用{发出0 {1}}。 (然后脚本不会失败)

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