Php 使用setInterval循环浏览div列表,每x秒刷新一次数据

Php 使用setInterval循环浏览div列表,每x秒刷新一次数据,php,jquery,mysql,ajax,setinterval,Php,Jquery,Mysql,Ajax,Setinterval,我有一个包含用户帖子/消息列表的页面。当一篇文章被喜欢时,我希望它能反映在所有其他用户身上,根据我的研究,setInterval可以通过刷新特定内容几秒钟来完成这项工作。目前,我在循环浏览所有用户消息和显示最新的喜欢数方面遇到了问题。所发生的事情是,显示的数字在不断变化,并在单个帖子的所有值之间循环。示例:如果我在三个不同的帖子上分别有1、0和2个喜欢,则第一篇帖子的数字将变为1、0和2,而不是仅显示“1”。谈到AJAX,我算是个初学者 这是我的密码: Jquery/Ajax function

我有一个包含用户帖子/消息列表的页面。当一篇文章被喜欢时,我希望它能反映在所有其他用户身上,根据我的研究,setInterval可以通过刷新特定内容几秒钟来完成这项工作。目前,我在循环浏览所有用户消息和显示最新的喜欢数方面遇到了问题。所发生的事情是,显示的数字在不断变化,并在单个帖子的所有值之间循环。示例:如果我在三个不同的帖子上分别有1、0和2个喜欢,则第一篇帖子的数字将变为1、0和2,而不是仅显示“1”。谈到AJAX,我算是个初学者

这是我的密码:

Jquery/Ajax

function refreshPostLikes() {
setInterval(function() {
$(".posts .id").each(function() {  //get id for each post
var postid = $(this).attr("value"); 
updatePostLikes(postid);  //pass the postid variable
});
}, 1000);
}


function updatePostLikes(postid) {
$.ajax({
url: "/main/refresh-post-like.php",
type: "post",
data: {postid: postid},  //send data to php file
success: function(data) {
$(".posts .like").html(data);  //output number of likes
}
});
}
PHP查询

<?php
require_once('../connection.php');

$postID = $_POST['postid'];

$likeCountQuery = "select count(*) as total_likes from posts_likes WHERE like_status=1 AND post_id=".$postID;  //query number of posts with a like
$likeQueryResult = mysqli_query($conn, $likeCountQuery);

while($likeNumber = mysqli_fetch_assoc($likeQueryResult)) {
$likes = $likeNumber['total_likes'];

if($likes != 0) {
echo $likes;
}
else {
echo '';
}
}
?>

仍然不确定这是最好的方法,但代码不起作用的原因是在代码的成功部分更新HTML时忽略了postid

function updatePostLikes(postid) {
$.ajax({
url: "/main/refresh-post-like.php",
type: "post",
data: {postid: postid},  //send data to php file
success: function(data) {
$(".posts .like").html(data);  //output number of likes
}
});
}
使用此命令
$(.posts.like”).html(数据)//输出喜欢的数量

您正在更新使用相同值指定这些类的所有div。 将postid设置为div的id,并将命令更改为

$(“#posted”).html(数据)//输出喜欢的数量

是不断变化和循环通过所有的值为一个单一的 职位

发生这种情况是因为没有需要更新的帖子引用。您现在要做的是遍历所有具有“.posts.id”类的元素,因此更新将应用于所有帖子,而不是单个帖子。您应该修改函数,使其仅更新该帖子(尝试在html中向其传递唯一id)

其中N是您的帖子的id。(例如posted)

然后使用以下命令更新该值

function updatePostLikes(postid) {
    $.ajax({
        url: "/main/refresh-post-like.php",
        type: "post",
        data: {
            postid: postid
        }, //send data to php file
        success: function(data) {
            //$(".posts .like").html(data); //output number of likes
            $("#post-"+postid).html(data); // in this way we're get the right post
        }
    });
}

function refreshPostLikes() {
    $(".posts .id").each(function() { //get id for each post
        var postid = $(this).attr("value");
        updatePostLikes(postid); //pass the postid variable
    });

    setTimeout(refreshPostLikes, 1000); //Check every sec if there are update
}

setTimeout(updateChat, 1000); //Start the check 



#我想一想,你是否真的需要这项功能,以及你是否想实现它。您可能很容易终止服务器(每秒钟为每个用户检查页面上的所有帖子)#2。你能确认你的ajax调用得到了正确的计数吗#3
$(.posts.like”).html(数据)替换与该选择器匹配的所有元素的HTML,您需要找到适合您的ID的元素send@Lapskaus有没有别的办法?或者干脆不做会更好吗#2、是的#3、怎么做?我尝试用$(“.posts.like”)添加.each(),但它似乎仍然不起作用。如果喜欢某篇文章,最好换一种方式,捕捉该事件并更新计数器。@RST,是的,我为喜欢该文章的用户提供了这方面的内容。但是,我希望喜欢的内容能够实时显示给其他用户,因此我使用了setinterval来刷新该部分。我认为对每个div执行一个请求不是一个好主意。收集它们并执行一个请求,然后根据该响应进行更新/填充。
<?php
require_once ('../connection.php');

$postID = $_POST['postid']; //Escape this value before use inside the query see linked question

// NEVER TRUST USER INPUT
//$likeCountQuery it could be used for perform a SQL Injection NEVER TRUST USER INPUT
//NEVER !!!
$likeCountQuery = "SELECT COUNT(*) AS total_likes FROM posts_likes WHERE like_status=1 AND post_id=".$postID;  //query number of posts with a like
$likeQueryResult = mysqli_query($conn, $likeCountQuery);

while ($likeNumber = mysqli_fetch_assoc($likeQueryResult))
{
    $likes = $likeNumber['total_likes'];

    if ($likes != 0)
    {
        echo $likes;
    }
    else
    {
        echo '';
    }
}
?>