为什么查询只删除最后一行?

时间:2019-07-08 09:32:07

标签: php html

<?php
$query= mysqli_query($link, "SELECT * FROM Messages");
while ($row=mysqli_fetch_assoc($query)){
  $MID= $row['mesgID'];
?>
<br><br><br><center><caption><?php echo "The <strong>".$row['type']."</strong> ID: ".$row['mesgID']; ?></caption></center>
<center><table border='4'; style="border-color:darkblue;">
<tr>
    <td style="width:70%; text-align:left;"><?php echo "<strong>From: </strong>".$row['email']."<br><strong>About: </strong>".$row['areaCode']; ?></td>
</tr>
    <tr>
        <td style="width:70%; text-align:center;"><?php echo "<strong>Message content</strong><br><br>".$row['message']."<br>"; ?></td>
    </tr>
</table></center>

 <form action="ContactCleanersManagementStaffSide.php" method="post">
<center>
  <input class="button button3" type="submit" name="<?php echo $MID; ?>"value="DELETE" id="submit"/></center>
    </form>
<br><br>
<?php
}


if(isset($_POST[$MID])){

    $query = mysqli_query($link, "DELETE FROM Messages WHERE mesgID='$MID'");
}

    ?>

我为每个按钮创建一个具有唯一名称的“删除”按钮,但是当我单击任何一个按钮(最后一个按钮除外)时,它都不会删除,但是当我单击经纬度按钮时,它会被成功删除。

2 个答案:

答案 0 :(得分:3)

我会要求您创建一个包含idname的隐藏文件,而不是使用name="mesgID"作为按钮的value="<?php echo $row['mesgID']; ?>"属性,如下所示:

<?php

    $query= mysqli_query($link, "SELECT * FROM Messages");
    while ($row=mysqli_fetch_assoc($query)){
?>
    <br>
    <br>
    <br>
    <center>
        <caption><?php echo "The <strong>".$row['type']."</strong> ID: ".$row['mesgID']; ?></caption>
    </center>
    <center>
        <table border='4'; style="border-color:darkblue;">
            <tr>
                <td style="width:70%; text-align:left;">
                    <?php echo "<strong>From: </strong>".$row['email']."<br><strong>About: </strong>".$row['areaCode']; ?>
                </td>
            </tr>
            <tr>
                <td style="width:70%; text-align:center;">
                    <?php echo "<strong>Message content</strong><br><br>".$row['message']."<br>"; ?>
                </td>
            </tr>
        </table>
    </center>

    <form method="post">
        <input type="hidden" name="mesgID" value="<?php echo $row['mesgID']; ?>">
        <center>
            <input class="button button3" type="submit" name="Delete" value="DELETE" id="submit"/>
        </center>
    </form>
    <br>
    <br>
<?php }

    if(isset($_POST['mesgID'])){
        $query=mysqli_query($link, "DELETE FROM Messages WHERE mesgID=".$_POST['mesgID']);
    }
?>

注意:-当前代码已对SQL INJECTION公开,因此请使用prepared statements

  

其他说明:SQL注入的“快速”修复程序[仅 ]强制将数字ID值的类型强制转换为整数。

$query=mysqli_query($link, "DELETE FROM Messages WHERE mesgID=".(int)$_POST['mesgID']);

以上是 的替代,用于升级到参数化查询。

参考文献:-

mysqli::prepare

PDO::prepare

答案 1 :(得分:1)

  1. 直接从POST中接收到的ID插入语句(创建SQL注入漏洞,您可以在https://www.acunetix.com/websitesecurity/sql-injection/上了解SQLi)是一个坏主意

  2. 在选择并回显所有消息之前,我将检查是否传递了id并执行delete查询,因​​为即使删除了消息,您仍将始终包括该消息(因为此后将其删除)。

  3. p>
  4. 您应该添加一个名为“ messageId”的隐藏输入字段,并将id作为值传递,然后再添加提交按钮以使用隐藏值提交表单-

<form method="post">
        <input type="hidden" name="messageId" value="<?= $row['mesgID']; ?>">
        <center>
            <input class="button button3" type="submit" value="DELETE" id="submit"/>
        </center>
</form>

在代码的开头,通过

接收POSTed的'messageId'变量
if (isset($_POST['messageId'])){
    $stmt = $conn->prepare("DELETE FROM Messages WHERE mesgID = ?");
    $stmt->bind_param("i", $_POST['messageId']);
    $stmt->execute();
}