isset 函数提交 while 循环内的所有按钮 PHP

isset function submits all buttons inside the while loop PHP

我遇到了这个问题,while 循环内的提交按钮重新执行了 while 循环。

PHP:

$query1 = $con->query("SELECT * FROM room");
if($query1->num_rows > 0) {
    while($row1 = $query1->fetch_array()) {
        $idroom = $row1['idroom'];

        echo "<tr>";
        echo "<td> $idroom </td>";
        echo "<td> <form method='POST'> <input type='submit' name='delete' value='DELETE'> </form></td>";
        echo "</tr>";

        if(isset($_POST['delete'])) {
            $query2 = $con->query("DELETE FROM room WHERE idroom='$idroom'");
        }
    }
}

table: [1]: https://i.stack.imgur.com/dujps.png

问题是,当我单击删除按钮时,它只会删除所有房间,而不是我要删除的房间。我相信程序认为我是因为 'isset' 函数而一次按下所有删除按钮。

我尝试过的事情:

在您的代码中,您没有遵循基本结构。使用 JS 用于 edit/delete 的点击事件,并使用 ajax 调用执行操作。

根据您的粘贴,这是针对您的代码的一种解决方案,它不是标准代码,但可以帮助您解决问题。

$query1 = $con->query("SELECT * FROM room");
if($query1->num_rows > 0) {
    while($row1 = $query1->fetch_array()) {
        $idroom = $row1['idroom'];

        $tr = "<tr>";
        $tr .= "<td> $idroom </td>";
        $tr .= "<td><form method='POST'>";
        $tr .= "<input type='hidden' name='room_id' value='".$idroom."'>";
        $tr .= "<input type='submit' name='delete' value='DELETE'> </form></td>";
        $tr .= "</tr>";

        echo $tr;
    }
}

if(isset($_POST['delete'])) {
  $roomId = $_POST['room_id'];
  $query2 = $con->query("DELETE FROM room WHERE idroom='$roomId'");
}

这段代码有很多问题,尤其是它非常不安全并且容易受到注入攻击。在继续之前,您应该阅读准备好的语句。教程和答案都没有尽头,所以我不会在这里介绍它们。为了帮助新程序员(不久前我还是新手),我会指出我认为这里出了什么问题:

  1. $query1 = $con->query("SELECT * FROM room");

这是运行每次脚本运行s。这是需要意识到的关键。如果您加载页面,或者如果您提交 post 删除,这总是会发生。这导致:

  1. if($query1->num_rows > 0) { while($row1 = $query1->fetch_array()) { ...

您开始循环,遍历 every 记录。注意 every.

因此对于每条记录,您然后检查:

  1. if(isset($_POST['delete'])) {...

这是您的记录被删除的地方,也是 CBroe 在他的评论中所指的地方。你相信(我认为)你检查了这个个人记录的删除但是你只检查 isset($_POST['delete']) 并且你这样做是为了 EVERY 记录。请记住,POST 变量一直存在到脚本结束或被删除。因此,通过单击删除并提交 _POST 值,您可以为循环中的每条记录传递此条件。

  • 你应该先消化一下再继续,因为这是新程序员常犯的错误。请记住,计算机会按顺序读取和执行脚本,请记住它也会执行 EXACTLY 您要求的操作,仅此而已。经典的例子是描述制作一杯咖啡。如果我对你说 'put the kettle on, put coffee in the cup, fill up with water, add milk' 你会煮咖啡,但如果你对电脑说那话,你最多只能让电脑带着水壶找杯子放咖啡,然后告诉你牛奶是不是数字。

所以解决方案。好吧,我不会为你写,有不同的选择。您应该将某种标识符传递给特定于您想要的记录的 post ,然后您需要检查它,例如 isset POST[delete] && isset(POST['room_id'])。然后您需要决定执行此操作的最佳位置,在脚本的开头,在不同的脚本中,可能不在循环内(这很少是优秀编程的标志)。如果你要删除一条记录,你应该在为它创建输出之前就这样做。 (为什么收集一条记录然后删除它,这样效率高吗?)。

如果您真的必须在循环中执行此操作,那么您需要某种检查房间的 ID 是否与 post 值的 ID 相同,然后再 运行 删除.

希望这对您有所帮助,但请确保您在紧急情况下研究并开始使用准备好的语句 - 在 2020 年确实没有理由不这样做