2 回答
TA贡献1871条经验 获得超8个赞
这段代码有很多问题,尤其是它非常不安全并且容易受到注入。在继续之前,您应该阅读准备好的陈述。对此的教程和答案无穷无尽,因此我不会在这里介绍它们。为了帮助新程序员(不久前我还是个新程序员),我将指出我认为这里出现的问题:
$query1 = $con->query("SELECT * FROM room");
每次脚本运行时都会运行它。这是需要认识到的关键事情。如果您加载页面,或者提交帖子删除,这种情况总会发生。这导致:
if($query1->num_rows > 0) { while($row1 = $query1->fetch_array()) { ...
您开始循环,循环播放every
记录。注意every
.
因此,对于每条记录,您都需要检查:
if(isset($_POST['delete'])) {...
这就是您的记录被删除的地方,也是 CBroe 在他的评论中所指出的。您相信(我认为)您检查了该个人记录的删除,但您只是检查isset($_POST['delete'])
并且这样做是为了EVERY
记录。请记住,该POST
变量一直存在,直到脚本结束或删除为止。因此,通过单击“删除”并提交该_POST
值,您可以为循环中的每个记录传递此条件。
在进一步讨论之前,您应该先消化一下这一点,因为这是新程序员的常见错误。请记住,计算机按顺序读取并执行脚本,记住它也会按照
EXACTLY
您的要求执行,仅此而已。典型的例子是描述泡一杯咖啡。如果我对你说“打开水壶,将咖啡放入杯子,加满水,加牛奶”,你就会煮出一杯咖啡,但如果你对电脑说这句话,你最终最多只会穿着一台电脑一个水壶正在寻找一个杯子来放咖啡并告诉你牛奶不是一个数字。
所以解决办法。好吧,我不会为你写它,有不同的选择。您应该将某种标识符传递给特定于您想要的记录的帖子,然后您需要检查例如 isset POST[delete] && isset(POST['room_id'])
。然后,您需要决定执行此操作的最佳位置,在脚本的开头,在不同的脚本中,可能不在循环内(这很少是优秀编程的标志)。如果您要删除一条记录,您可能应该在为其创建输出之前执行此操作。(为什么收集一条记录然后删除它,这样有效吗?)。
如果您确实必须在循环内执行此操作,那么您需要在运行删除之前进行某种检查,以确保房间的 id 与帖子值的 id 相同。
希望这对您有所帮助,但请确保您作为紧急事项研究并开始使用准备好的陈述 - 2020 年确实没有理由不这样做
TA贡献1801条经验 获得超8个赞
在您的代码中,您没有遵循基本结构。使用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'");
}
- 2 回答
- 0 关注
- 96 浏览
添加回答
举报