首次使用PHP PDO无报错但Test1输出缺失问题排查
问题排查与解决方案
刚帮你梳理了这段PHP PDO注册代码的问题,终于搞清楚为啥看不到Test1输出啦!
首先,代码没有语法报错但卡在Test1之前,核心原因是你已经排查到的数据库列名不匹配——你的INSERT语句里用到了数据库users表中不存在的列(比如语句里的hash字段,如果表中没有这个列),而默认PDO的错误模式是静默失败,不会主动抛出错误,导致$stmt->execute();执行失败后代码直接停在这里,根本走不到后面的echo "Test1";。
额外需要修正的代码问题
除了列名的问题,你的代码还有个明显的语法错误,也会导致INSERT执行失败:
bindParam的用法完全错了!你写的$stmt->bindParam("ssssss", $firstname, $lastname, $username, $email, $password, $hash);不符合PDO的语法规范,bindParam需要逐个绑定参数,或者直接在execute()里传入参数数组。
给你两种正确的写法:
写法1:逐个绑定参数
$stmt = $db->prepare('INSERT INTO users(firstname, lastname, username, email, password, hash) VALUES (?, ?, ?, ?, ?, ?)'); // 注意:这里要传入加密后的$encryptpass,不是原$password! $stmt->bindParam(1, $firstname, PDO::PARAM_STR); $stmt->bindParam(2, $lastname, PDO::PARAM_STR); $stmt->bindParam(3, $username, PDO::PARAM_STR); $stmt->bindParam(4, $email, PDO::PARAM_STR); $stmt->bindParam(5, $encryptpass, PDO::PARAM_STR); $stmt->bindParam(6, $hash, PDO::PARAM_STR); $stmt->execute();
写法2:直接传入参数数组(更简洁)
$stmt = $db->prepare('INSERT INTO users(firstname, lastname, username, email, password, hash) VALUES (?, ?, ?, ?, ?, ?)'); // 同样要传入加密后的$encryptpass $stmt->execute([$firstname, $lastname, $username, $email, $encryptpass, $hash]);
另外还发现个小bug:你代码里INSERT的password字段,应该用加密后的$encryptpass,而不是原$password,不然数据库里存的就是未加密的明文密码(哪怕你用了md5,这里变量传错了)。
建议开启PDO错误提示
为了以后更快定位问题,建议在初始化PDO连接时开启异常错误模式,这样SQL执行失败时会直接抛出错误信息,不用再盲目排查:
$db = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
内容的提问来源于stack exchange,提问作者Jackson Hogan
相关产品推荐
相关产品推荐

