【问题标题】:How to delete a row and display updated database without refreshing using ajax如何在不使用ajax刷新的情况下删除一行并显示更新的数据库
【发布时间】:2017-08-05 11:55:16
【问题描述】:

我正在处理的一个项目遇到了挑战,我已尽我所能让它工作但没有成功。任何帮助将不胜感激。 我构建了一个 HTML/Bootstrap 表单,其字段值通过 ajax 函数发送到 mysql 数据库,并在页面上显示更新的数据库而不刷新页面,这部分工作正常。 每行都有一个删除按钮。但是,当我删除任何显示的行时,只会删除我单击的第一行并显示更新的数据库。随后尝试删除任何其他行都不起作用,直到重新加载页面并重复该过程,然后只有第一个删除操作再次起作用。我的挑战是让删除按钮删除一行,立即获取并显示更新的数据库,而无需刷新页面。 这是我的 ajax 调用:

var pry= $("#pry").val();
var sec  = $("#sec").val();
var coll = $("#coll ").val();
var urlId = window.location.search.substring(1);    
var pageId = urlId.split('=')[1];

//Insert into DB
$.ajax({
url: "process.php",
type: "POST",
async: false,
data:
  {
   "done": 1,   
   "pry": pry,  
   "sec": sec,                                      
   "coll": coll,
   "page_id": pageId
   },                                           
    success: function(){
         displayFromDb();   
         clearInputs();
    }
});

//delete from db
$(".my_butn").on("click", function(e){
    e.preventDefault();
    var id = $(this).attr("id");

$.ajax({
    type: "POST",
    url: "delete.php",
    async: false,
    data:
       {                                         
        "pry": pry, 
        "sec": sec,                                     
        "coll": coll,
        "page_id": pageId,
        “id”: id
       },
         success: function(){
           displayFromDb();
         }
      });
    });

//function displayFromDb
     function displayFromDb(){
       $.ajax({
          type: "POST",
          url: "process.php",
          async: false,
          data:
             {                                                                                                                                                        
              "display": 1,                                             
              "page_id": pageId
             },
          success: function(d){                                                                                                              
                $("#tab-display").fadeIn().html(d);
          }
       });
    }

//process.php file
<?php
//Insert to  sql    
  if (isset($_POST["done"])){
    $conn = mysqli_connect('localhost', 'root', '', 'educ');
    $student_id = mysqli_real_escape_string($conn, $_POST['page_id']);
    $pry = mysqli_real_escape_string($conn, $_POST["pry"]);
    $sec = mysqli_real_escape_string($conn, $_POST["sec"]);
    $coll = mysqli_real_escape_string($conn, $_POST["coll"]);

    $sql = mysqli_query($conn, "INSERT INTO students (id, student _id, pry, sec, coll) VALUES (' ', '$student_id ', '$pry', '$sec', '$coll')");
}

//display from sql  
if (isset($_POST['display'])){
    $i=1;
    $sql2 = mysqli_query($conn, "SELECT id, pry, sec, coll FROM students WHERE student_id = '$student_id");
    if ($sql2){
        echo '<table class="table table-striped table-bordered"><thead><tr><th>S/N</th><th>ID</th><th>PRY EDUC</th><th>SEC EDUC</th><th>COLL EDUC</th><th>DEL ROW</th></tr></thead>';

    while ($row = mysqli_fetch_array($sql2, MYSQLI_ASSOC)){
        $id = $row['id'];
        $pry = $row['pry']; 
        $sec = $row['sec'];
        $coll = $row['coll'];
$del = "<button type='button' class='btn btn-danger' id='$id'> X</button>";
echo '<tbody><tr><td>'.$i.'</td><td>'.$id.'</td><td>'.$pry.'</td><td>'.$sec.'</td><td>'.$coll.'</td><td>'.$del.'</td></tr></tbody>';
        $i++;
        }
        echo '</table>';
        }
    }?>

这里还有我的 delete.php 文件

  <?php
        $conn = mysqli_connect('localhost', 'root', '', 'educ');
        $student_id = mysqli_real_escape_string($conn, $_POST['page_id']);
        $pry = mysqli_real_escape_string($conn, $_POST["pry"]);
        $sec = mysqli_real_escape_string($conn, $_POST["sec"]);
        $coll = mysqli_real_escape_string($conn, $_POST["coll"]);
        $id =  $_POST["id"];

        $sql = mysqli_query($conn, "DELETE FROM students WHERE id = '$id' ");
    }
?>

【问题讨论】:

  • 您的删除查询包含一个勾号;仅此一项就会引发错误,并且有一个杂散的大括号。
  • 感谢@Fred-ii-。原始查询不包含该错误,它是在复制我的代码时发生的。
  • 由于各种原因,在 AJAX 请求中使用 async: false 不是一个好主意 - 请参阅此 post
  • 感谢@Dhruv。但这可能是我遇到这个问题的原因吗?我必须进行哪些适当的更改才能删除 async: false 请?

标签: php jquery mysql ajax


【解决方案1】:

一种简单的方法....

更改 1:
delete.php中,可以在执行DELETE查询后添加如下代码:

echo mysqli_affected_rows($conn); 
die;

这意味着 AJAX 调用将接收 echoed 的任何值。现在,如果没有删除任何行,mysqli_affected_rows() 将返回 0,如果有错误则返回 -1,这可以在 $.ajax()success 部分进行检查,以便将适当的消息传递给用户。

一旦您检查了删除的行数 > 0,就可以安全地删除与按钮对应的 &lt;tr&gt;。请检查以下代码 sn-p 可能有助于实现此目的。你只需要将这段代码包装在success : function(delete_count){ .... }

更改 2:

$(".my-del-btn").on("click", function(){
  // AJAX call, success: function(delete_count)
  //if(delete_count > 0){
      $(this).parents().closest("tr").fadeOut(1000)
      .promise().done(function(){
          $(this).parents().closest("tr").remove();
      });
  //}
  //else{
  //    console.log("Error in deleting id = " + id);
  //}

});
<head>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.0/css/bootstrap.css" 
      rel="stylesheet" type="text/css">

<link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" 
      rel="stylesheet" type="text/css">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.0/js/bootstrap.min.js"></script>
</head>
<body>
<table class="table table-striped table-bordered">
  <thead>
    <tr>
      <th>ID</th>
      <th>DEL ROW</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td> 1 </td>
      <td> 
          <button type='button' class='btn btn-danger my-del-btn'>DELETE</button> 
      </td>
    </tr>
    <tr>
      <td> 2 </td>
      <td> 
          <button type='button' class='btn btn-danger my-del-btn'>DELETE</button> 
      </td>
    </tr>
    <tr>
      <td> 3 </td>
      <td> 
          <button type='button' class='btn btn-danger my-del-btn'>DELETE</button> 
      </td>
    </tr>
</table>
</body>

一些重要说明:

  • 正如上面 cmets 中链接的帖子所表明的那样,拥有async: false 在某种程度上对应用程序是有害的(除了它在 jQuery 1.8 之后被弃用)。

  • 请查看并考虑实施 MySQLi Prepared Statements 以保护您的 PHP 代码免受 SQL Injection Attacks 的攻击。

【讨论】:

  • 非常感谢@Dhuv Saxena。我很感激你的时间。我按照您建议的方式实现了您的代码,但事情就是这样。我的意思是,输入值后,它会显示一个更新的数据库。然后我的第一个删除操作工作并显示一个更新的数据库,但是,随后的删除不起作用,直到我重新加载页面,添加另一行,然后我只能再次删除一行。
  • @banky 请问第二次删除的具体错误是什么?它是否在控制台中显示任何内容?如果不是,您是否在数据库中输入新数据后以某种方式重新创建整个表? (在这种情况下,click 事件绑定的按钮可能会从 DOM 中删除,而新的按钮可能不会再次映射)。也有可能解决此问题,但请多了解一些有关该错误的信息会有所帮助。
  • 感谢您的帮助@Dhuv。我很感激。控制台上没有显示错误,只有 200 OK。在表单中输入数据后,我没有重新创建整个表格,而是创建了一个新的 tr,它有自己的动态 del 按钮。然后数据库会更新并显示在 d 浏览器上的适当 Div 上。第一次删除尝试工作正常,点击的 tr 被删除。但是,单击另一个删除按钮,在页面刷新之前没有任何效果。
  • 我明白了。这又是一个可比的情况。 DOM 中新添加的按钮没有与之关联的click 事件。因此,如果您一开始在表中有 5 行,您就可以在不刷新所有 5 行的情况下执行删除操作,但不能对之后添加的行执行删除操作。修复程序应将 $(".my-del-btn").on("click", function(){ .... } 更改为 $("body").on("click", ".my-del-btn", function(){ .... }
  • 我认为新添加的按钮确实有与之关联的点击事件。如果表格中有5行,我只能删除一行而不刷新页面,而不是全部。然后刷新页面,添加另一个,然后只有一行被再次删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多