使用PHP预处理SQL语句实现注册功能无法插入记录问题求助
代码问题排查及修复
核心问题列表
- 用户名检查的预处理语句只调用了
prepare(),没有执行execute(),导致fetch()拿不到任何数据,while循环全程不执行,所以没有任何输出 - PDO的
bindParam()用法错误,该方法每次只能绑定1个参数,不能同时传入3个变量做参数 - 用户名校验逻辑错误:全表遍历查询用户名会导致重复插入、输出逻辑混乱,应该直接带条件查询匹配的用户名,不需要全表遍历
- 缺少错误捕获配置,PDO默认静默错误,所以语法/执行出错也没有提示
- 密码使用
md5()加密不安全,属于已淘汰的加密方案
修正后代码
<?php include 'config.php'; // 开启PDO错误提示,方便排查问题 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 直接带条件查询是否存在重复用户名,不需要全表查 $check = $con->prepare("SELECT username FROM users WHERE username = ?"); $check->execute([$_POST['username']]); $exists = $check->rowCount(); if ($exists > 0) { echo -1; } else { $sql = $con->prepare("INSERT INTO users(name,username,password) VALUES(?,?,?)"); $name = $_POST['name']; $username = $_POST['username']; // 替换md5为更安全的password_hash $password = password_hash($_POST['password'], PASSWORD_DEFAULT); // 直接给execute传参数数组,不需要单独bindParam $sql->execute([$name, $username, $password]); echo 1; } ?>
补充说明
- 后续做登录校验时,对应使用
password_verify()方法验证密码即可 - 可以增加$_POST参数非空校验,避免传入空值导致插入失败
内容的提问来源于stack exchange,提问作者Safina Siddique
相关产品推荐
相关产品推荐

