PHP更新数据库用户表后邮箱字段被删除问题排查
核心错误原因
邮箱数据被清空的直接原因是取值逻辑错误:
- 表单提交的新邮箱存储在超全局变量
$_POST['m_email']中,但你的UPDATE语句错误读取了$_SESSION['m_email'] - 登录SESSION中默认不会存储表单提交的
m_email值,PHP读取不存在的SESSION键时会返回空值,拼入SQL后就会把对应字段更新为空,表现为数据被删除 - 现有代码还存在两个严重隐患:虽然调用了PDO的
prepare方法,但未做参数绑定,直接拼接变量到SQL存在SQL注入风险;使用name字段作为更新匹配条件,遇到重名用户会批量更新错误数据。
修复步骤
- 调整取值逻辑,从
$_POST中读取表单提交的邮箱,增加格式校验 - 正确使用PDO参数绑定,禁止直接拼接变量到SQL语句
- 将UPDATE的WHERE匹配条件替换为用户唯一标识(通常是登录时存入SESSION的
user_id),避免更新错数据
修复后的后端代码参考:
session_start(); require_once('database.php'); if (isset($_POST['modify-profile'])) { // 读取并校验邮箱格式 $newEmail = trim($_POST['m_email']); if (!filter_var($newEmail, FILTER_VALIDATE_EMAIL)) { header('Location: ../profile.php?err=email_format_error'); exit; } // 预处理+参数绑定执行更新,用user_id做匹配条件 $query = "UPDATE users SET email = :email WHERE user_id = :user_id"; $stmt = $pdo->prepare($query); $stmt->bindValue(':email', $newEmail); $stmt->bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_INT); $stmt->execute(); // 可选:同步更新SESSION中存储的邮箱,避免页面读取旧值 $_SESSION['email'] = $newEmail; header('Location: ../profile.php?success=email_update_ok'); exit; } else { echo "ERROR"; }
原有表单代码无需大改,可根据需求增加错误/成功提示的展示逻辑。
额外排查点
- 确认数据库
users表的email字段类型为varchar,长度设置不低于255,避免过长邮箱被截断 - 确认登录逻辑中已将当前登录用户的唯一
user_id存入SESSION,否则WHERE条件无法匹配到目标用户 - 测试阶段可在执行
execute后打印$stmt->rowCount(),返回值为1即代表成功更新了1条对应用户数据
内容的提问来源于stack exchange,提问作者Petruz21
相关产品推荐
相关产品推荐

