繁体   English   中英

isset function 提交 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'");
        }
    }
}

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

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

我尝试过的事情:

  • 将 isset 中的 $query2 行替换为echo $idroom; output 是room1room2room3 这意味着程序认为我一次按下了所有按钮。

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

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

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

  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按照您的要求执行,仅此而已。 经典的例子是描述制作一杯咖啡。 如果我对你说“打开水壶,往杯子里放咖啡,加水,加牛奶”,你就会煮咖啡,但如果你对电脑说,你最多只能让电脑戴上一个水壶在寻找一个杯子来装咖啡并告诉你牛奶不是一个数字。

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

如果您真的必须在循环内执行此操作,那么在运行删除之前,您需要某种检查房间的 ID 是否与发布值的 ID 相同。

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

在您的代码中,您没有遵循基本结构。 使用JS编辑/删除的点击事件,并使用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'");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM