我有这个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(用户未登录),也会显示新消息的警报!示出。
我该怎么做才能解决这个问题?
感谢。
答案 0 :(得分:7)
这是你的条件:
if(data == 0) {
这是你的AJAX调用返回的内容:
echo 'No change: 0';
条件评估为false
,因为'No change: 0'
不等于0
。
答案 1 :(得分:4)
你有很多逻辑问题。
如果用户ID为0(未登录),则会终止PHP脚本;没有任何回报。这不与false
相同,它将评估为''
和'' !== 0
。
如果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
或false
),无论如何,您可以在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。请改用PDO或MySQLi。
答案 2 :(得分:2)
如果$uid
为0
,则不会从服务器发送数据。 data
将是emtpy,因此data == 0
将评估为false。试试这个:
if (!data) {
alert("No New Messages");
return;
} else {
count = data;
alert("New Message!");
return;
}
答案 3 :(得分:1)
基本上有六件事可能是问题 - 我能想到:
die();
作为返回值$numRows
和/或$_POST['countOld']
未返回预期
值更改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等开放,但这是另一个问题。