在mysql准备好之前,在div中加载一个php页面而不加载div

时间:2018-05-04 10:08:49

标签: php jquery mysql

一切正常,但我所做的事情有时候“重新载入”已删除的行(不是总是)。它太快还是以某种方式缓存?当我刷新页面时,我可以看到该行被删除,但是如何在列表更新之前阻止列表显示?

如果我使用load或post并将已发布的变量包含在已加载的文件中或单独的文件中,然后加载文件,仍然是同样的问题。如果我在函数中添加一个警报,那么它总是正常工作,所以这就是为什么我认为它太快了。

我还试图“取消设置”到partlist.php的链接,然后从函数中的数据库中获取它,但它仍然不会始终显示更新的版本,直到我刷新页面,这就是为什么我怀疑缓存版本

脚本:

$(".taBort").click(function(){  

    var r = confirm("Do you want to delete the row?");
    if (r == true) {

        var taBortid= $(this).val();

        $.post("delete.php", {

            taBortRad:  "Ta bort",          
            taBortid:   taBortid
            success:    function (data) {

                lista();

            }

        });

    }

});

我处理此页面所有更新的php文件:

if(isset($_POST['taBortRad'])){

    $taBortid=$_POST['taBortid'];

    $sql = "DELETE FROM parts WHERE id='$taBortid'";
    mysqli_query($conn,$sql);

}

加载部分列表在“lista”div中的php文件的函数

function lista(edit){

    $("#lista").load(partlist.php,{

        edit: edit //Just a variable I use, not active here

    });

}

1 个答案:

答案 0 :(得分:0)

我不明白,delete.php正在删除行和partList.php正在做什么? 我认为你必须以这种方式使用一个promise,一个延迟对象,并且在php中你必须使用一个有区别的OK KO,如果删除正常或KO ... javascript但我没有测试下的代码但是如果我明白这个问题的方法,测试行是否被删除你也可以使用mysqli_affected_rows()如果1,否则KO:

        $(".taBort").click(function(){  
            var r = confirm("Do you want to delete the row?");
            if (r == true) {
                var taBortid= $(this).val();
                $.when(deleteRow(taBortid)).then(function(controllo){
                    if (controllo == 'OK'){
                        lista();
                    }
                    if(controllo == 'KO'){
                        alert('Error in delete row');
                    }
                });
            }
        }); 
        function deleteRow(taBortid){
            return $.ajax({
                type:'POST',
                url : 'delete.php',
                data : { taBortRad:  "Ta bort",          
                         taBortid:   taBortid}
                dataType : 'html',  
            }).then(function(answer){

                if (answer == 'OK'){
                    controllo = 'OK';
                }else{                          
                    controllo = 'KO';        
                }   
                 return controllo;              
            }).fail(function(){
                alert('Error of comunication');
            });             
        }

PHP delete.php

        if(isset($_POST['taBortRad'])){

            $taBortid=$_POST['taBortid'];
            $conn = new mysqli('YOUR CONNECTION PARAMS');

            $sql = $conn->prepare("DELETE FROM parts WHERE id= ?");
            $sql->bind_param('i', $taBortid);
            if ($sql->execute()){
                print 'OK';
            }
            else{
                print 'KO';
            }

        }

更新,抱歉我的英文: Hy Fredrik,我认为你的问题只是延迟,同步或异步,我试着从你的问题开始解释你:"但是如何在列表更新之前阻止列表显示?" 你的代码有一个正确的想法,但错误的语法我解释了为什么,你要删除一行,然后删除行重新加载表,我想因为我没有看到partList.php,一个新的选择和模板按钮,这个选择和模板在文件partList.php是不是? 因此,在第一次执行delete.php中的所有代码时,只有在完成解析才能执行delete.php文件后,执行partList.php ...是不是?但是你的代码没有这样做。 好吧,你没有考虑的是第一点解析javascript的执行时间和php解析的执行时间,当你写$ .post ...成功..你正在做一个ajax调用但是当javascript解析输入时在电话会议的成功??? 不是当所有的PHP代码都执行但只是在php delete.php的第一行...所以当php的解析运行文件delete.php的第一行同时javascript解析调用lista ()函数,为了理解我们,javascript解析是在调用lista()函数之前,php解析正在执行连接并执行delete.php中的所有代码。因为在你的代码中没有任何内容对javascript解析WAIT,直到我说你执行partList.php,你需要deferred,或async:false,但是因为我们必须使用延迟对象,所以不推荐使用async false。 我的代码说的是(但我的代码也存在不完善之处)

    $.when(deleteRow(taBortid)).then(function(controllo){...

构造when->然后说什么时候执行promise deletedRow并且函数回调是在做了什么之后返回CONTROLLO,在这种情况下,promise是OK KO(或者更好的是promise是deleteRow而函数controllo是回调,但尝试用这种方式用简单的单词理解...嘿javascript我保证你好或KO;)),但是当javascript代码收到OK或KO?之后解析php已执行所有代码才能打印OK或者打印KO ......实际上在我的代码中存在一个不完美的原因,因为

      if($sql->execute) print OK 

如果删除查询不顺利,也会一直执行,例如没有删除行,这样会更好

    if($sql->execute){
          $numbersRowDeleted = $sql->affected_rows;
          if($numbersRowDeleted >0){
            print 'OK';//ROW IS DELETED
          }
          else{
           print 'NODELETED';//BUT THIS NODELETD MUST BE MANAGED ALSO IN THE JAVASCRIPT FUNCTION AND AFTER IN THE THEN if (answer == 'NODELETED'){controllo no deleted etc...}
          }
    }

你也可以写

      $.when(call1(),call2()...).then(function(controllo1,controllo2...){})

构造when->然后已经过时的同步和异步调用,写两个调用1和2所有两个调用将在异步执行但是将被管理答案/承诺因此不再需要同步,因为javascript解析将等待答案,例如调用1回答DOTHIS并在执行javascript脚本后调用2个答案DOTHIS2,或者调用1回答DOANOTHERTHING并调用2个答案DOANOTHERTHING2然后javascript执行您想要的另一个代码但是调用1中的所有两个php文件和2是异步的。 延期对象非常重要.... 试试我的代码....再见 我希望这可以解释一些问题,但我试图快速解释,而不是以精确的方式解释,例如使用.resolve()方法或promise()方法......也可以在这里看一下,也许他比我更好解释......: )

http://michaelsoriano.com/working-with-jquerys-ajax-promises-and-deferred-objects/