PHP表单提交MySQL后刷新页面插入空数据问题求助
解决PHP表单刷新页面插入空字段的问题
我来帮你搞定这个问题!你遇到的刷新页面插入空字段的情况,主要是两个原因导致的:
- 代码没有判断请求是否来自表单提交,页面首次加载(GET请求)或者刷新时,都会执行插入语句,但此时
$_POST里没有有效数据,所以插入了空值; - 表单提交后刷新页面,浏览器会重复发送之前的POST请求,这时候表单数据已经不存在了,同样会插入空记录。
下面给你一步步的修复方案:
第一步:添加表单提交判断
先给插入逻辑加个判断,只有当点击了提交按钮(也就是$_POST['sub']存在)的时候,才执行数据库插入操作,避免页面加载时误插入:
<?php $con=mysqli_connect("localhost","root","") or die ("connection fail"); mysqli_select_db($con, 'college') or die ("database error"); // 仅在表单提交时执行插入 if(isset($_POST['sub'])){ $n=$_POST["name"]; $c=$_POST["class"]; $sql="insert into studentsinfo(name,class) values('$n','$c')"; mysqli_query($con,$sql); echo "1 record inserted"; } ?> <html> <head> </head> <body> <form action="" method="post"> Name: <input type="text" name="name" required="required" title="Enter Name"> Class: <input type="text" name="class" required="required"> <input type="submit" value="insert" name="sub"> </form> </body> </html>
第二步:用PRG模式彻底解决重复提交问题
上面的修改能避免页面加载时的误插入,但刷新提交后的页面还是会重复提交。这里推荐用PRG(Post/Redirect/Get)模式:表单提交后,通过header()重定向到当前页面,这样浏览器地址栏变成GET请求,刷新时只会重新加载页面,不会重复提交表单。
修改后的代码:
<?php $con=mysqli_connect("localhost","root","") or die ("connection fail"); mysqli_select_db($con, 'college') or die ("database error"); $message = ''; if(isset($_POST['sub'])){ $n=$_POST["name"]; $c=$_POST["class"]; $sql="insert into studentsinfo(name,class) values('$n','$c')"; if(mysqli_query($con,$sql)){ $message = "1 record inserted"; } else { $message = "Insert failed: " . mysqli_error($con); } // 重定向到当前页面,阻断重复提交 header("Location: " . $_SERVER['PHP_SELF']); exit; } ?> <html> <head> </head> <body> <?php if($message): ?> <p><?php echo $message; ?></p> <?php endif; ?> <form action="" method="post"> Name: <input type="text" name="name" required="required" title="Enter Name"> Class: <input type="text" name="class" required="required"> <input type="submit" value="insert" name="sub"> </form> </body> </html>
第三步:修复SQL注入漏洞(必做!)
你的原代码直接把用户输入拼到SQL语句里,存在严重的SQL注入风险,建议使用mysqli预处理语句来规避这个问题,同时保证代码安全性:
<?php $con=mysqli_connect("localhost","root","") or die ("connection fail"); mysqli_select_db($con, 'college') or die ("database error"); $message = ''; if(isset($_POST['sub'])){ // 使用预处理语句,避免SQL注入 $stmt = mysqli_prepare($con, "INSERT INTO studentsinfo(name, class) VALUES (?, ?)"); mysqli_stmt_bind_param($stmt, "ss", $name, $class); $name = $_POST["name"]; $class = $_POST["class"]; if(mysqli_stmt_execute($stmt)){ $message = "1 record inserted"; } else { $message = "Insert failed: " . mysqli_error($con); } mysqli_stmt_close($stmt); header("Location: " . $_SERVER['PHP_SELF']); exit; } ?> <html> <head> </head> <body> <?php if($message): ?> <p><?php echo $message; ?></p> <?php endif; ?> <form action="" method="post"> Name: <input type="text" name="name" required="required" title="Enter Name"> Class: <input type="text" name="class" required="required"> <input type="submit" value="insert" name="sub"> </form> </body> </html>
这样既彻底解决了刷新插入空字段的问题,又保证了代码的安全性。
内容的提问来源于stack exchange,提问作者Haider Ali
相关产品推荐
相关产品推荐

