簡體   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