Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止刷新时重复DB插入?_Php_Mysql_Database - Fatal编程技术网

Php 如何防止刷新时重复DB插入?

Php 如何防止刷新时重复DB插入?,php,mysql,database,Php,Mysql,Database,我对PHP非常陌生。我试图在这里找到一个符合我的代码的答案,但没有找到任何答案 当我按F5键时,表单的最后一次插入会在数据库中重复。如何在不重定向到其他页面的情况下阻止它 我看到了一些关于$_会话的答案,但我不知道如何使用它。 我想有一些解释与更正代码,谢谢你 另外,数据库连接在另一个文件中,如果你需要它来回答我,我会把它放在这里 这是我的密码: addToMembersList.php <DOCTYPE html5> <html> <head>

我对PHP非常陌生。我试图在这里找到一个符合我的代码的答案,但没有找到任何答案

当我按F5键时,表单的最后一次插入会在数据库中重复。如何在不重定向到其他页面的情况下阻止它

我看到了一些关于$_会话的答案,但我不知道如何使用它。 我想有一些解释与更正代码,谢谢你

另外,数据库连接在另一个文件中,如果你需要它来回答我,我会把它放在这里

这是我的密码:

addToMembersList.php

<DOCTYPE html5>
<html>
  <head>
    <?php
      include_once "db_connect.php";

      $member=mysqli_query($mysqli,"select * from members");
    ?>
    <style>
      table,tr,td{
        border: 1px solid black;
        border-collapse: collapse;
      }
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td><b>First name</b></td>
        <td><b>Last name</b></td>
        <td><b>Email</b></td>
        <td><b>Website</b></td>
        <td><b>Comment</b></td>
        <td><b>Gender</b></td>
      </tr>
      <?php
        if($member){
          while($row = $member->fetch_assoc()){ ?>
            <tr>
              <td><?php echo $row['first_name'];?></td>
              <td><?php echo $row['last_name'];?></td>
              <td><?php echo $row['email'];?></td>
              <td><?php echo '<a href="'.$row['website'].'">'.$row['website'].'</a>';?></td>
              <td><?php echo $row['comment'];?></td>
              <td><?php echo $row['gender'];?></td>
              <td><button type="submit" onclick="deleteMember.php" value="$row['id']">Delete</button></td>
            </tr>
          <?php }
        }?>
    </table>
  </body>
</html>



$query = "insert into members (first_name, last_name, email, website, comment, gender) values ('%s', '%s', '%s', '%s', '%s', '%s')";
      $query = sprintf($query,$_POST['fName'], $_POST['lName'], $_POST['email'], $_POST['website'], $_POST['comment'], $_POST[$gender_select]);
      $result = $mysqli ->query($query);
    }
  }

?>
index.php

<DOCTYPE html5>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script>
      function loadmembersList(response,textStatus,jqXHR){
        request = $.ajax({
        url:"memberListRequest.php",
        type:"get"
        })
        request.done(function(response,textStatus,jqXHR){
          $("#member_list").html(response);
        });
      }
      $( document ).ready(loadmembersList);
    </script>
  </head>
  <body>
    <form action="", method="POST">
      First name:<input type="text" name="fName">
      <br>
      Last name:<input type="text" name="lName">
      <br>
      Email:<input type="text" name="email">
      <br>
      Website:<input type="text" name="website">
      <br>
      Comment:<input type="textarea" name="comment" placeholder="your text here">
      <br>
      Gender:<input type="radio" name="Male"> Male <input type="radio" 
name="Female"> Female <input type="radio" name="Other"> Other
      <br>
      <input type="submit">
    </form>
    <div id="member_list"></div>
  </body>
</html>

常见的解决方案是使用post重定向get模式。从用户收集数据的表单发布到执行db操作的脚本,然后响应302重定向到显示结果的页面。这样做的缺点是,至少需要连续两次往返服务器才能导航到下一页

正如其他人所注意到的,您的代码受到影响,但鉴于您描述的行为,它也容易受到影响。csrf令牌可用于检测重复提交

设置合适的主键/唯一索引并忽略重复提交将阻止创建重复记录

当用户使用javascript点击submit按钮时,也可以在表单内设置一个标志。然后,只有在参数中设置了该标志的情况下才执行插入-但是不要忘记为禁用javascript的情况制定计划

另一种解决方案是在ajax请求中发送数据服务器端,而不是作为页面导航事件


可能还有更多的解决方案。

首先,缺少一个解决方案!为了它。现在,如果你想避免重复,有太多的方法来解决这个问题,你可以用谷歌搜索。有很多结果,我100%肯定。解决办法是不要让客户坐在那一页上。向一个单独的状态/确认页面发出302。你为什么试图避免?我的意思是你会有类似if isset$\u POST['lName']的代码,或者类似的代码来测试表单是否已提交。这段代码每次都会运行。请注意,如果您使用一个来实现这一点,那么您可以遵循一些模式来将代码组织到适当的模型、视图和控制器上下文中。这里有很多令人困惑的问题,HTML、PHP、SQL和JavaScript都混在一起。框架有很多种形式,从真正的精益型到功能异常全的型,中间有很多点。我强烈建议你至少试一次。