所以我有一个使用引导警报创建的通知页面。 这是一个片段,每个通知都是来自数据库一行的回显
<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 方法将包含警报 id 的隐藏表单发送到操作 deletenotication.php
<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,
我需要如果用户关闭任何要删除的随机警报,而不是按顺序
谢谢!
最佳答案
您不需要遍历所有结果,只需按 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 token 也是一个好主意;即,确保该请求是合法的。也许您已经在其他地方这样做了,但我想警告您以防万一。
关于javascript - 从数据库 mysql php 删除引导警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144182/