我有一个从和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运行时选择日期[5],则删除日期[10],它应该删除日期[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();
}
答案 0 :(得分:0)
mdate
需要是一个数组,此时你只传递一个值(最后一个)。
<input type="checkbox" name="mDate[]">
然后,您需要使用IN
而不是简单的等号来重写查询。
另请阅读SQL injection。
答案 1 :(得分:0)
我不明白为什么存在mDate值的隐藏输入,因为checkbox元素可以获取值属性。
<input type="checkbox" name="mDate[]" value="<?php echo $mDate; ?>">
将不会显示,并将以$ _GET [&#39; mDate&#39;] [0]作为字符串进行访问。 此外,如果pId值不同并且用户无法选择其中一个,则将始终返回第一个值。 所以一种方法是:
<input type="checkbox" name="mDate[]" value="<?php echo $pId.':'.$mDate; ?>">
并访问它
$data = explode(':', $_GET['mDate'][0]);
$pId = $data[0];
$mDate = $data[1];
如果我错过了解某事,请纠正我。
祝你好运。