我已经尝试了两天了,但是没有成功。它只执行了一次,但是在初始加载后无法继续更新。函数不会自动更新。也不会在30秒后重新启动。代码对我来说似乎很好,但显然有一些知识差距,我有关于长轮询这是导致这不工作。如果有人有时间我'如果你能仔细检查一下,告诉我哪里做错了,我将不胜感激。任何帮助都是感激的,谢谢。
JavaScript/jQuery语言
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET', url: 'http://localhost:8888/mysite/execs/vote_count.php', data: dataString, async: true, cache: false, success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
}, dataType: "json", complete: poll, timeout: 30000 });
};
$(".post").each(function(){
poll($(this).attr("id"));
});
PHP(搜索引擎)
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'votedown'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$downvotes = $stmt->rowCount();
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'voteup'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$upvotes = $stmt->rowCount();
$arr = array("downvotes"=>$downvotes,"upvotes"=>$upvotes);
echo json_encode($arr);
$dbh = null;
?>
2条答案
按热度按时间0md85ypi1#
我认为你的主要问题在于你的假设是完整的:poll将使用从当前调用传入的参数pid。请尝试此操作。
尽管如此,如果你有很多帖子要检查更新,你可以考虑把这些调用捆绑起来,每30秒在每个页面调用一次(并返回一个帖子更新数组),而不是每30秒在每个页面调用一次。
编辑:添加了提到的超时。第一次就把它漏掉了。
czfnxgou2#
我认为一旦你收到回复,浏览器就不会也不应该保持连接打开。而且这在很大程度上取决于你使用的浏览器和你发送的头。
我不是一个PHP的家伙,但头部应该包含
Connection: Keep-alive to keep the connection open
。我做的各种测试也证明了这点。