使用ajax从php获取结果并重新加载页面

使用ajax从php获取结果并重新加载页面,php,jquery,ajax,Php,Jquery,Ajax,所以我已经为此工作了好几个小时了,我读了很多StackOverflow的帖子,但我仍然没有运气 我有一个页面,它有两个部分,这取决于数据库中的int值,取决于在什么时候显示哪个部分 我的目标是让页面查看数据库状态是否已从当前状态更改,然后刷新页面,如果未更改,则只需每隔10秒重新运行一次 我在页面顶部运行PHP,从数据库获取int $online_status = Online_status::find_by_id(1); 然后,我使用HTML将状态加载到jquery可以访问的内容中 &l

所以我已经为此工作了好几个小时了,我读了很多StackOverflow的帖子,但我仍然没有运气

我有一个页面,它有两个部分,这取决于数据库中的int值,取决于在什么时候显示哪个部分

我的目标是让页面查看数据库状态是否已从当前状态更改,然后刷新页面,如果未更改,则只需每隔10秒重新运行一次

我在页面顶部运行PHP,从数据库获取int

 $online_status = Online_status::find_by_id(1);
然后,我使用HTML将状态加载到jquery可以访问的内容中

 <input type="hidden" id="statusID" value="<?php echo $online_status->status; ?>">
<span id="result"></span>
然后转到另一个运行以下代码的PHP页面

 if(isset($_POST['search'])){
    $current_status = $_POST['search'];
    $online_status = Online_status::find_by_id(1);
    if($current_status != $online_status->status){
       echo "<script>location.reload()&semi;</script>";
    }else{
    }
  }
if(isset($\u POST['search'])){
$current_status=$_POST['search'];
$online_status=online_status::按_id查找_(1);
如果($current_status!=$online_status->status){
回显“location.reload()&semi;”;
}否则{
}
}
jquery然后加载到HTML部分,id为“result”,如前所示。我知道这是一个非常糟糕的方法,因此,它在一开始就可以工作,但是你把它留在页面上的时间越长,页面变得越慢,直到它冻结

如果有人能给我指出一个合适的方法,我将非常感激。
谢谢

您的页面正在变慢,因为每次调用
liveCheck
函数时都会创建一个新的间隔。随着时间的推移,您会有许多时间间隔同时运行并向PHP文件发送请求。您可以通过在浏览器中打开开发人员控制台并监视“网络”选项卡来验证此行为

您应该做的是设置一次间隔,并在该间隔内执行
$.ajax
调用。此外,如果当前请求处于挂起状态,最好不要发送新请求,方法是实现一个
布尔值
状态变量,该变量在请求处于挂起状态时为true,在请求完成时为false

您的函数的预期行为似乎是在
$online\u status->status
更改时重新加载页面,对吗?如果是这样,请将您的PHP更改为echo
true
1
(任何真正的内容),并将您的JS重写为:

function liveCheck() {
    if (liveCheckPending == true)
        return;
    liveCheckPending = true;
    var search = $('#statusID').val();
    $.ajax({
         url:'check_live.php',
         data:{search:search},
         type:'POST'
     }).done(function(data){
         if (!data.error)
            location.reload();
     }).always(function(data){
         liveCheckPending = false;
     });
}

var liveCheckPending = false;
setInterval(liveCheck, 10000);

由于每次调用
liveCheck
函数时都会创建一个新的间隔,因此页面速度变慢。随着时间的推移,您会有许多时间间隔同时运行并向PHP文件发送请求。您可以通过在浏览器中打开开发人员控制台并监视“网络”选项卡来验证此行为

您应该做的是设置一次间隔,并在该间隔内执行
$.ajax
调用。此外,如果当前请求处于挂起状态,最好不要发送新请求,方法是实现一个
布尔值
状态变量,该变量在请求处于挂起状态时为true,在请求完成时为false

您的函数的预期行为似乎是在
$online\u status->status
更改时重新加载页面,对吗?如果是这样,请将您的PHP更改为echo
true
1
(任何真正的内容),并将您的JS重写为:

function liveCheck() {
    if (liveCheckPending == true)
        return;
    liveCheckPending = true;
    var search = $('#statusID').val();
    $.ajax({
         url:'check_live.php',
         data:{search:search},
         type:'POST'
     }).done(function(data){
         if (!data.error)
            location.reload();
     }).always(function(data){
         liveCheckPending = false;
     });
}

var liveCheckPending = false;
setInterval(liveCheck, 10000);
js:

php:

js:

php:



尝试调整PHP文件以返回true或false。如果你得到的是真的,你可以从javascript本身重新加载页面,而不是插入一行javascriptI的新脚本标记。我更新了PHP以返回真的,但我不能让ajax只刷新如果它是真的,它要么一直刷新,要么根本不刷新。如果data==truel我尝试过,我让PHP返回真的,我让它回显'true'我让JS if data==true,我让它if data='true'仍然为空回显实际的布尔值,而不是字符串。可以尝试console.log(数据)并共享输出吗?尝试调整PHP文件以返回true或false。如果你得到的是真的,你可以从javascript本身重新加载页面,而不是插入一行javascriptI的新脚本标记。我更新了PHP以返回真的,但我不能让ajax只刷新如果它是真的,它要么一直刷新,要么根本不刷新。如果data==truel我尝试过,我让PHP返回真的,我让它回显'true'我让JS if data==true,我让它if data='true'仍然为空回显实际的布尔值,而不是字符串。你能试试console.log(data)并共享输出吗?我试过运行代码,但什么都没有发生,不管我如何更改状态,它都不会刷新页面。抱歉,修改:data.trim==''更正为data.trim()=''页面仍然不会刷新,奇怪的一个ehi测试代码没有问题,当php回显空字符串时,将刷新当前页面,否则将显示从php获取的html。有关更多信息,您需要打印出从浏览器或浏览器控制台日志中得到的错误。您需要检查来自console的网络请求我刚刚使用了console.log(数据),它正在打印我的整个页面顶部、标题和导航。它是如何获取所有数据的?我试着运行代码,但什么都没有发生,不管我如何更改状态,它都不会刷新页面。抱歉,修改:data.trim==''更正为data.trim()=''页面仍然不会刷新,奇怪的一个ehi测试代码没有问题,当php回显空字符串时,将刷新当前页面,否则将显示从php获取的html。有关更多信息,您需要打印出从浏览器或浏览器控制台日志中得到的错误。您需要检查来自console的网络请求我刚刚使用了console.log(数据),它正在打印我的整个页面顶部、标题和导航。它是如何获得所有这些数据的?我更新了我的代码以匹配您的js,我将我的php更改为返回true,然后使用echo true进行了尝试,页面只是不断地重新加载,除非php条件为true,否则它不应该重新加载。将
if(!data.error)
更改为
if(data)
,然后重试。不过,您已经了解了基本的想法。每
(function(){
    function liveCheck(){
        var search = $('#statusID').val();
        $.ajax({
            url:'check_live.php',
            data:{search:search},
            type:'POST',
            success:function(data){
            if(data.trim() == ''){
                location.reload();
            }else{
                $('#result').html(data);
                window.setTimeout(function(){
                    liveCheck();
                }, 10000); 
            }
            }
        });
    }

    $(function(){
        liveCheck();
    });
})(jQuery)
<?php
if(isset($_POST['search'])){
    $current_status = $_POST['search'];
    $online_status = Online_status::find_by_id(1);
    if($current_status != $online_status->status){
    $data = '';
    }else{
        $data = 'some html';
    }
    echo $data;
}