页面刷新时SQLite重复插入空数据问题求助
解决页面刷新插入空记录的问题
核心原因
你的PHP代码没有判断请求是否来自表单的POST提交,只要页面加载(包括刷新)就会执行插入逻辑,而刷新时没有POST数据,所以插入空记录。另外代码里还有几处细节错误会导致功能异常,一起修正。
具体修复步骤
1. 给PHP代码添加POST请求判断
只有当表单通过POST提交时,才执行数据库插入操作,同时优化代码安全性:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 仅处理表单提交的POST请求 try { // 打开数据库并开启错误调试模式 $db = new PDO('sqlite:db/users.db'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 校验必填字段(和前端required对应) if (empty($_POST["firstname"]) || empty($_POST["country"])) { die("必填字段不能为空"); } // 注意:表单里textarea的name是Adress,这里要对应拼写 $firstname = $_POST["firstname"]; $Address = $_POST["Adress"]; $country = $_POST["country"]; // 使用预处理语句避免SQL注入风险 $stmt = $db->prepare("INSERT INTO details (firstname, Address, country) VALUES (:firstname, :address, :country)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':address', $Address); $stmt->bindParam(':country', $country); $stmt->execute(); $db = NULL; // 提交后重定向,彻底避免刷新重复提交 header("Location: " . $_SERVER['PHP_SELF']); exit(); } catch(PDOException $e) { print 'Exception : ' .$e->getMessage(); } } ?>
2. 修正表单中的错误
- 输入框的
name"firstname"改为name="firstname",否则PHP无法获取该字段值 - 下拉选择框的默认选项
Choose添加value="",确保required属性能正确触发校验
修正后的表单代码:
<form id="register_form" method="post" role="form" action=""> <input autofocus="" id="firstname" name="firstname" placeholder="First Name" type="text" required /> <textarea id="Address" name="Adress" placeholder="No Address" rows="3" cols="30"></textarea> <select id="country" name="country" required> <option selected value="">Choose</option> <option value="10">Germany</option> <option value="11">Poland</option> <option value="12">United Kingdom</option> </select> <button type="submit">Submit My New Entry</button> </form>
3. 关键优化说明
- POST请求校验:通过
$_SERVER['REQUEST_METHOD'] === 'POST'确保只有表单提交时才执行插入,页面刷新(GET请求)不会触发逻辑 - 重定向防重复提交:插入成功后跳转到当前页面,刷新时只会加载GET请求,不会重复插入
- 预处理语句:避免直接拼接SQL变量带来的注入风险,同时兼容特殊字符输入
- 表单细节修正:修复name属性拼写和下拉选项值,保证前端校验和后端取值一致
内容的提问来源于stack exchange,提问作者Szabolcs Horvath
相关产品推荐
相关产品推荐

