PDO数据库连接异常:表单提交数据未入库且无报错提示
问题根因与修复方案
核心错误点
- DSN配置缺失等号:数据库连接的DSN字符串中
dbname后缺少赋值等号,实际没有指定要操作的数据库,写入操作自然无法执行。原代码写法为"mysql:host=".DB_HOST.";dbname".DB_NAME,此处dbname直接拼接了数据库名,没有加=,属于基础语法错误。 - 重复实例化PDO且未开启错误模式:插入数据的代码中重复创建了PDO连接对象,新的对象没有配置
PDO::ERRMODE_EXCEPTION错误模式,导致SQL执行出错时不会抛出异常提示,因此你看不到任何错误信息。你已经在config.php里创建过$conn连接对象,完全不需要重复创建。 - 缺少异常捕获逻辑:插入操作没有包裹try catch块,即便开启了错误模式,执行出错时也没有输出错误信息的逻辑。
修复后的代码
数据库连接文件(config.php)
<?php define("DB_HOST",'localhost'); define('DB_USER',"root"); define("DB_PASS",""); define("DB_NAME","test2"); try { // 修正dbname后缺失的等号 $conn = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS ); $conn->setAttribute(PDO::ATTR_ERRMODE ,PDO::ERRMODE_EXCEPTION); // 额外设置字符集,避免中文乱码问题 $conn->exec("set names utf8mb4"); } catch (PDOException $e) { die("数据库连接失败:".$e->getMessage()); }
数据插入逻辑文件
<?php require 'config.php'; if($_SERVER['REQUEST_METHOD'] == "POST") { if(isset($_POST['username']) && isset($_POST['password'])) { $user = trim($_POST["username"]); $pass = trim($_POST['password']); if(!empty($user) && !empty($pass)) { try { $sql = "INSERT INTO userinfo (user, pass) VALUES(:username, :password)"; // 直接复用config.php中已创建的$conn连接,无需重复实例化 $query = $conn->prepare($sql); $query->bindParam(':username', $user, PDO::PARAM_STR); $query->bindParam(':password', $pass, PDO::PARAM_STR); if($query->execute()) { echo "数据插入成功"; } else { echo "数据插入失败"; } } catch (PDOException $e) { echo "SQL执行错误:".$e->getMessage(); } } else { echo "用户名或密码不能为空"; } } else { echo "提交参数缺失"; } }
额外排查建议
- 确认
test2数据库中存在userinfo表,且表字段user、pass的字段类型、长度和你插入的内容匹配,没有其他未赋值的非空约束字段。 - 确认
root账号对test2库有写入权限。
内容的提问来源于stack exchange,提问作者abolfazl ebrahimi
相关产品推荐
相关产品推荐

