PHP向MySQL保存用户输入时页面加载即插入空行问题排查
问题排查与修复方案
嘿,我一眼就看出问题所在了——你的PHP插入逻辑没有判断表单是否提交,所以每次页面加载(包括第一次打开页面的时候)都会执行INSERT语句,这时候$_POST['username']和$_POST['password']是空的,自然就插入空行到数据库里了。除此之外,代码还有几个可以优化的地方,我一步步给你说:
核心问题分析
- 当用户第一次访问页面时,是GET请求,
$_POST数组里没有任何表单数据,但你的代码直接执行了INSERT操作,导致空值插入。 - 你重复创建了3次数据库连接(
mysqli_connect调用了3次),这完全是多余的,既浪费资源又没必要。 - 虽然用了
mysqli_real_escape_string,但直接拼接SQL语句还是有SQL注入风险,更安全的方式是用预处理语句。
修复后的完整代码
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "dbname"; // 只创建一次数据库连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 关键:只在表单提交时执行插入逻辑 if (isset($_POST['submit'])) { // 获取并过滤表单数据 $uName = trim($_POST['username']); $pass = trim($_POST['password']); // 先简单验证数据不为空 if (!empty($uName) && !empty($pass)) { // 使用预处理语句,避免SQL注入 $sql = "INSERT INTO users (username, password) VALUES (?, ?)"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $uName, $pass); if ($stmt->execute()) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $stmt->close(); } else { echo "请输入用户名和密码!"; } } $conn->close(); ?> <!DOCTYPE html> <html> <body> <form action="index.php" method="post"> <input type="text" name="username" placeholder="用户名"> <br><br> <input type="password" name="password" placeholder="密码"> <br><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
修复要点说明
- 判断表单提交:用
isset($_POST['submit'])来检测用户是否点击了提交按钮,只有此时才执行插入逻辑。 - 复用数据库连接:只创建一次连接,全程使用这个连接对象。
- 预处理语句:用
prepare()和bind_param()来绑定参数,彻底避免SQL注入,比单纯转义字符串更安全。 - 数据验证:增加了简单的非空验证,避免用户提交空内容。
这样修改后,只有当用户填写表单并点击提交按钮时,才会执行插入操作,不会再出现页面加载就插入空行的问题了!
内容的提问来源于stack exchange,提问作者Bachoo
相关产品推荐
相关产品推荐

