PHP更新邮箱时出现Undefined variable: pass报错其他表单正常如何修复
报错原因
你提交更新请求时,PHP处理脚本中校验当前密码的查询逻辑写错了查询条件:
- 你使用了表单提交的新邮箱
$user_email作为查询条件去数据库捞用户密码,当你修改邮箱时,提交的是还没存入数据库的新邮箱,这条查询匹配不到任何用户记录,while循环不会执行,$pass变量从未被赋值,调用时自然会报未定义错误。 - 你不修改邮箱时,提交的
$user_email还是数据库中已存在的旧邮箱,能匹配到记录给$pass赋值,所以不会报错。
修复方法
把PHP处理脚本里的查询SQL的WHERE条件改成用表单隐藏域传递的原始邮箱$binder查询即可,$binder存储的是用户修改前的原有邮箱,一定能匹配到当前用户的记录:
// 把原来的$sql = "SELECT * FROM users WHERE user_email = '$user_email' "; // 改成下面的写法 $sql = "SELECT * FROM users WHERE user_email = '$binder' ";
同时建议在while循环前初始化$pass变量,避免极端情况下的未定义报错:
$pass = ''; while($row = $query->fetch_array()){ $pass = $row['password']; }
额外优化建议
- 你当前查询用户的SQL没有做参数绑定,存在SQL注入风险,建议和后面的更新逻辑一样用prepare预处理语句处理。
- md5加密方式已经被破解,不要用于密码存储,改用PHP官方提供的
password_hash()存密码、password_verify()校验密码。 - 查询后增加判断逻辑,如果匹配不到用户记录直接返回错误提示,不要继续执行后续校验逻辑。
内容的提问来源于stack exchange,提问作者Kaido Bagua
相关产品推荐
相关产品推荐

