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' 函数而一次按下所有删除按钮。
我尝试过的事情:
- 将 isset 中的 $query2 行替换为
echo $idroom;
,输出为 room1room2room3
。这意味着程序认为我同时按下了所有按钮。
在您的代码中,您没有遵循基本结构。使用 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'");
}
这段代码有很多问题,尤其是它非常不安全并且容易受到注入攻击。在继续之前,您应该阅读准备好的语句。教程和答案都没有尽头,所以我不会在这里介绍它们。为了帮助新程序员(不久前我还是新手),我会指出我认为这里出了什么问题:
$query1 = $con->query("SELECT * FROM room");
这是运行每次脚本运行s。这是需要意识到的关键。如果您加载页面,或者如果您提交 post 删除,这总是会发生。这导致:
if($query1->num_rows > 0) { while($row1 = $query1->fetch_array()) { ...
您开始循环,遍历 every
记录。注意 every
.
因此对于每条记录,您然后检查:
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 年确实没有理由不这样做
我遇到了这个问题,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' 函数而一次按下所有删除按钮。
我尝试过的事情:
- 将 isset 中的 $query2 行替换为
echo $idroom;
,输出为room1room2room3
。这意味着程序认为我同时按下了所有按钮。
在您的代码中,您没有遵循基本结构。使用 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'");
}
这段代码有很多问题,尤其是它非常不安全并且容易受到注入攻击。在继续之前,您应该阅读准备好的语句。教程和答案都没有尽头,所以我不会在这里介绍它们。为了帮助新程序员(不久前我还是新手),我会指出我认为这里出了什么问题:
$query1 = $con->query("SELECT * FROM room");
这是运行每次脚本运行s。这是需要意识到的关键。如果您加载页面,或者如果您提交 post 删除,这总是会发生。这导致:
if($query1->num_rows > 0) { while($row1 = $query1->fetch_array()) { ...
您开始循环,遍历 every
记录。注意 every
.
因此对于每条记录,您然后检查:
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 年确实没有理由不这样做