如何使用复选框删除带有php和mysql的行

How can I use checkboxes to delete rows with php and mysql

提问人:Crespum 提问时间:1/4/2023 更新时间:1/4/2023 访问量:121

问:

我创建了一个包含数据库信息的表,并尝试创建复选框以便能够更轻松地删除行,但有些东西无法正常工作。

我有一个带有表单的按钮:

<form action="delete-register.php" method="post">
   <button type="button" class="btn btn-primary"><span class="fe fe-file-plus fe-12 mr-2"></span>New</button>
   <button type="submit" name="delete" class="btn btn-secondary"><span class="fe fe-trash fe-12 mr-2"></span>Delete</button>
</form>

我有带有复选框的行:

<form action="delete-register.php" method="post">
  <td>
     <div class="custom-control custom-checkbox">
       <input type="checkbox" class="custom-control-input" id="<?php echo $row['id']; ?>" name="selected[]" value="<?php echo $row['id']; ?>">
       <label class="custom-control-label" for="<?php echo $row['id']; ?>"></label>
     </div>
  </td>
</form>

还有delete-register.php:

if (isset($_POST['delete'])) {
  if (isset($_POST['selected'])) {
    foreach ($_POST['selected'] as $id) {
      $query = "DELETE FROM registers WHERE id = $id";
      mysqli_query($conn, $query);
    }

    header('Location: registers.php');
    exit;
  }
}

问题是“selected”始终为 null,因此不会从数据库中删除任何内容。 我该如何解决这个问题?

php html mysql mysqli

评论

0赞 Ken Lee 1/4/2023
(1) 你在同一页上有两份表格是真的吗?(两个动作都是)(2) 选中复选框后,单击第一份表格中的提交按钮试图删除记录,这是真的吗?delete-register.php
0赞 Crespum 1/4/2023
您好 Ken Lee,感谢您的留言。是的,这是真的。
1赞 Don't Panic 1/4/2023
这回答了你的问题吗?通过使用 PHP 选中复选框来删除多行
2赞 tadman 1/4/2023
警告:使用时,应使用参数化查询并bind_param将任何数据添加到查询中。不要使用字符串插值或串联来实现此目的,因为您已经创建了严重的 SQL 注入错误切勿将 或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。mysqli$_POST$_GET
0赞 tadman 1/4/2023
🐘如果你刚刚开始使用 PHP 并想要构建应用程序,我强烈建议您查看各种开发框架,看看是否能找到适合您的风格和需求的框架。它们有多种口味,从轻盈的 Fat-Free Framework 到更全面的 Laravel 等。这些提供了具体的示例,以及如何编写代码和组织项目文件的指导。

答:

0赞 Ken Lee 1/4/2023 #1

请注意,提交的数据将在以下范围内<form>....</form>

由于您有两个表单,因此当您单击第一个表单中的提交按钮时,它不会将第二个表单的数据发送到服务器。

因此,请将第二张表格更改为:

<form action="delete-register.php" method="post">

      <div class="custom-control custom-checkbox">
       <input type="checkbox" class="custom-control-input" id="<?php echo $row['id']; ?>" name="selected[]" value="<?php echo $row['id']; ?>">
       <label class="custom-control-label" for="<?php echo $row['id']; ?>"></label>
     </div>

<input type=submit name=delete>

</form>

[附加说明]

如果您想坚持使用第一个表单来触发删除操作,那么请:

  1. 在第 1 个窗体中,将删除从“提交”更改为“按钮”
  2. 将 OnClick 事件添加到此删除按钮,以便触发第二个表单的提交
  3. 确保您在第二个表单中有一个称为“删除”的隐藏字段,因为您指定在 PHP 脚本中包含此字段
  4. 您可能已经注意到,我在第二份表格中添加了表格,以便于通过表格 1 触发提交id=form2

所以这是修改后的代码:

<form method="post">
   <button type="button" class="btn btn-primary"><span class="fe fe-file-plus fe-12 mr-2"></span>New</button>

   <button type="button" name="delete" class="btn btn-secondary"
onclick='document.getElementById("form2").submit()';
   ><span class="fe fe-trash fe-12 mr-2"></span>Delete</button>

</form>



<form id=form2 action="delete-register.php" method="post">

   <div class="custom-control custom-checkbox">
       <input type="checkbox" class="custom-control-input" id="<?php echo $row['id']; ?>" name="selected[]" value="<?php echo $row['id']; ?>">
       <label class="custom-control-label" for="<?php echo $row['id']; ?>"></label>
     </div>

<input type=hidden name=delete value="delete">

</form>

评论

0赞 Crespum 1/4/2023
是的,我有一个第二形式的循环。我不知道这种对 2 种形式的干扰,谢谢。如果我添加一个新条目,它将由于循环而创建多个条目。我是否无法使用我在第一个表单上创建的“删除”按钮?我想使用它,因为它在页面的另一个角落。
0赞 Ken Lee 1/4/2023
请参阅我修订后的答案中的“附加备注”,以做您想做的事
0赞 Crespum 1/4/2023
我尝试并结果:如果我选择第一行中的复选框,它会删除,但如果我选择第一行以外的另一个不会删除。
0赞 Ken Lee 1/4/2023
它应该可以工作 - 请尝试此沙盒:createchhk.com/SOanswers/testSO4Jan2023.php(例如选择 2 和 3,然后单击删除,看看会发生什么)
0赞 Crespum 1/4/2023
沙盒运行良好。