从数据库mysql php

时间:2017-11-06 19:18:32

标签: javascript php jquery mysql

所以我有一个使用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">&times;</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,

如果用户关闭任何随机警报,我需要删除,而不是按顺序

谢谢!

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