PHP表单提交后刷新重复插入数据库问题求助
解决PHP表单刷新重复插入数据的问题
嘿,我明白你遇到的这个头疼问题了——每次刷新表单页面就自动重复插入之前的数据,这其实是浏览器的默认行为搞的鬼!
问题原因
当你提交表单时,浏览器会发送一个POST请求给服务器,服务器处理完插入操作后返回当前页面。此时如果你刷新页面,浏览器会重新发送之前的POST请求(甚至会弹出提示问你要不要重复提交),这就导致数据库又执行了一次INSERT操作,新增了重复记录。
下面给你两种最常用的解决方案,都是业界通用的做法:
方案一:POST/REDIRECT/GET 模式(最推荐)
这是解决重复提交问题的标准方案,核心思路是:处理完表单提交后,立即用PHP的header()函数重定向到当前页面(或其他页面),让浏览器发送一个GET请求来加载页面,这样刷新时就不会重复发送POST请求了。
修改后的代码示例:
<?php include 'config.php'; ?> <?php if(isset($_POST['submit'])) { // 1. 获取并处理表单数据 $fname = $_POST['fname']; $lname = $_POST['lname']; // 补全你原来的字段 // 2. 执行数据库插入操作(这里替换成你自己的INSERT代码) // 比如:$sql = "INSERT INTO your_table (fname, lname) VALUES ('$fname', '$lname')"; // mysqli_query($conn, $sql); // 3. 重定向到当前页面,一定要加exit()终止后续代码执行 header("Location: " . htmlspecialchars($_SERVER['PHP_SELF'])); exit(); } ?> <!DOCTYPE html> <html> <head> <style> .error {color: #FF0000;} </style> </head> <body> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> First Name: <input type="text" name="fname"> Last Name: <input type="text" name="lname"> <input type="submit" name="submit" value="Submit"> </form> </body> </html>
方案二:使用表单Token(防止恶意重复提交)
如果需要更严格地防止重复提交(包括用户多次点击提交按钮、恶意脚本提交),可以给表单添加一个唯一的Token标记,提交时验证Token的有效性,验证通过后销毁Token。
代码示例:
<?php session_start(); // 必须开启会话 include 'config.php'; // 生成唯一的表单Token if(!isset($_SESSION['form_token'])) { $_SESSION['form_token'] = bin2hex(random_bytes(32)); // 生成安全的随机字符串 } if(isset($_POST['submit'])) { // 验证Token是否匹配 if(isset($_POST['form_token']) && $_POST['form_token'] === $_SESSION['form_token']) { // 处理表单数据和插入操作 $fname = $_POST['fname']; $lname = $_POST['lname']; // 执行INSERT代码... // 销毁Token,避免重复使用 unset($_SESSION['form_token']); echo "<p>数据提交成功!</p>"; } else { echo "<p class='error'>检测到重复提交,请不要重复操作!</p>"; } } ?> <!DOCTYPE html> <html> <head> <style> .error {color: #FF0000;} </style> </head> <body> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> <!-- 隐藏字段存储Token --> <input type="hidden" name="form_token" value="<?php echo $_SESSION['form_token']; ?>"> First Name: <input type="text" name="fname"> Last Name: <input type="text" name="lname"> <input type="submit" name="submit" value="Submit"> </form> </body> </html>
小提示
- 方案一适合解决普通的刷新重复提交问题,简单易用;
- 方案二更适合需要防止恶意提交的场景,比如用户多次点击提交按钮、爬虫提交等;
- 另外,记得在处理表单数据时做好SQL注入防护,比如使用预处理语句(mysqli_prepare或PDO),不要直接把用户输入拼接到SQL语句里哦!
内容的提问来源于stack exchange,提问作者Daphne
相关产品推荐
相关产品推荐

