选中复选框时选择正确的值

gpnt7bae  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(272)

我有一个从和sql表生成的日期列表:

<form action="deleteMilestone.php" method="GET">
        <label class="boldLabel">Project Milestone Dates:</label><br><br>
        <div class="dateContainerLeft">
            <?php
            $result2 = $conn->prepare("SELECT mDate FROM datetable WHERE pId 
                     = '$pId' AND mDate <> '0000-00-00'");
            $result2->execute();
            $rows2 = $result2->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows2 as $row2) {
                $mDate = $row2['mDate'];
                ?>
                <input type="hidden" name="mDate" value="<?php echo $mDate; 
               ?>">
                <input type="checkbox" name="mDate"><?php echo $mDate; ?>
                <br>
                <input type="hidden" name="pId" value="<?php echo $pId; ?>">
            <?php } ?>
            <br><br>
            <button class="buttonMilestone" type="submit" name="milestone" 
                    value="delete">Delete Milestone Date</button>
        </div>
    </form>

我试图删除一个特定的日期,当它被选中时,我遇到的问题是,无论选择哪个日期,传递给delete sql的值总是最后显示的日期。因此,如果有一个包含10个日期的列表,我在运行delete sql时选择了date[5],它将删除date[10],它应该删除date[5]。
以下是delete sql(已更新以防止sql注入):

if(isset($_GET['mDate'])) {
$sql = "DELETE FROM datetable 
    WHERE pId = :pId AND mDate = :mDate";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':pId', $pId);
$stmt->bindParam(':mDate', $mDate);
$stmt->execute();
}
of1yzvn4

of1yzvn41#

mdate 需要是一个数组,此时只传递一个值(最后一个值)。

<input type="checkbox" name="mDate[]">

然后需要使用 IN 而不是简单的等号。
另外,请阅读有关sql注入的内容。

oalqel3c

oalqel3c2#

我不明白为什么存在值为mdate的隐藏输入,因为checkbox元素可以获得value属性。

<input type="checkbox" name="mDate[]" value="<?php echo $mDate; ?>">

它将不显示,并将作为带$\u get['mdate'][0]的字符串访问。另外,如果pid值不同,并且用户无法选择其中一个值,则将始终返回第一个值。因此一种方法是:

<input type="checkbox" name="mDate[]" value="<?php echo $pId.':'.$mDate; ?>">

并访问它

$data = explode(':', $_GET['mDate'][0]);
$pId = $data[0];
$mDate = $data[1];

如果我误解了什么,请纠正我。
祝你好运。

相关问题