【问题标题】:isset function submits all buttons inside the while loop PHPisset 函数提交 while 循环 PHP 中的所有按钮
【发布时间】:2020-08-04 06:40:34
【问题描述】:

我遇到了这个问题,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' 功能。

我尝试过的事情:

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

【问题讨论】:

  • “这意味着程序认为我同时按下了所有按钮。” - 不,它没有。在创建 输出 的过程中,您正在显式循环所有记录。首先不应将记录的删除混入其中。您需要以某种方式将要删除的记录的 ID 传递给您的表单。
  • 我建议您阅读可以在互联网上轻松找到的教程。您将能够从那里获得基础知识。

标签: php while-loop submit-button


【解决方案1】:

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

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

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

  1. if($query1-&gt;num_rows &gt; 0) { while($row1 = $query1-&gt;fetch_array()) { ...

您开始循环,循环通过every 记录。注意every

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

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

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

  • 在继续之前,您应该先消化一下,因为这是新程序员的常见错误。请记住,计算机按顺序读取和操作脚本,记住它也会执行EXACTLY 你所要求的,仅此而已。经典的例子是描述制作一杯咖啡。如果我对你说“打开水壶,将咖啡放入杯中,加满水,加牛奶”,你会煮咖啡,但如果你对电脑这么说,你最终会得到,充其量是带着电脑一个水壶寻找一个杯子来放咖啡并告诉你牛奶不是一个数字。

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

如果您确实必须在循环中执行此操作,那么您需要在运行删除之前检查房间的 id 是否与 post 值的 id 相同。

希望这会有所帮助,但请确保您紧急调查并开始使用准备好的陈述 - 2020 年真的没有理由不这样做

【讨论】:

    【解决方案2】:

    在您的代码中,您没有遵循基本结构。使用 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'");
    }
    

    【讨论】:

    • 这里没有ajax 代码,甚至根本没有任何js 代码。
    • 亲爱的@jameson2012 请在匆忙添加评论之前阅读文本。我已经明确联系过他使用 JS 并使用 AJAX 提交。
    • 我确实阅读了文字,但您的回答没有回答 OP 的问题。事实上,你说it's not standard code,所以你鼓励新程序员编程不好,而不是把他们指向积极的方向。您还含糊地提到了一个概念,没有任何指示如何实现它,所以总而言之,我认为这是一个无益的答案
    猜你喜欢
    • 2018-03-19
    • 2017-10-19
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多