所以我有一个使用bootstrap警报创建的通知页面。 这是一个片段,每个通知都是来自数据库行的回显
<div class="container" >
<?php
$fetch = $conn->query("SELECT * FROM notifications");
while($row = $fetch->fetch_assoc()) {
$id = ''.$row["id"].'';
$notification = ''.$row["notifications"].'';
?>
<div class="alert alert-warning alert-dismissable ">
<a href="#" class="close" data-dismiss="alert" aria-label="close" id="close">
<form action='deletenotifications.php' method='post' id='myform' >
<input type='hidden' name='id' id='id' value="<?php echo $id ?>" />
<span type="submit">×</span>
</form></a>
<?php echo $notification; ?>
</div>
<?php } ?>
</div>
用户在按X时需要删除通知,因此也要从数据库中删除,因此隐藏的表单包含要使用jquery AJAX方法发送到操作deletenotication.php的警报的id
<script type="text/javascript">
$('#close').click(function(){
$.post(
$('#myform').attr('action'),
$('#myform :input').serializeArray(),
);
});
</script>
这是deletenotification.php片段
$id = $_POST['id'];
$sqlf = $conn->query("SELECT * from notifications");
while($rown = $sqlf->fetch_assoc()){
$idbase = ''.$rown['id'].'';
if($id == $idbase){
$sql = $conn->query("DELETE FROM notifications WHERE id=$id");
}
}
它正在从数据库中删除,但仅当警报按顺序关闭,并且只删除了一个警报时,为了删除后续警报,需要刷新页面。
关闭警报2,3和4不会删除行,除非删除通知1,
如果用户关闭任何随机警报,我需要删除,而不是按顺序
谢谢!
答案 0 :(得分:0)
您不需要遍历所有结果只是为了通过其ID删除特定行。这会花费您两个查询而不是一个查询,如果数据库中有大量通知,则第一个查询可能成本高昂。相反,您可以按ID删除,就像这样。
if ( ! empty( $_POST['id'] ) && (int) $_POST['id'] ) {
$id = (int) $_POST['id'];
$conn->query("DELETE FROM notifications WHERE id=$id");
}
在上面的示例中,为了安全起见,我将ID转换为整数。但实际上,您应该查看您在那里使用的数据库类,而是使用prepared statement。
旁边:我注意到有几行像这样一行有两个单引号。你不需要所有这些。它们仅在您连接时才有用。或者,如果您要定义字符串文字。
$id = ''.$row["id"].'';
相反,只需为其指定ID值即可。
$id = $row['id'];
在响应从数据库中删除行的请求之前,使用和验证CSRF令牌也是一个好主意;即,确保此请求是合法的。也许你已经在其他地方这样做了,但我想提醒你,以防万一。
请参阅:https://en.wikipedia.org/wiki/Cross-site_request_forgery