PHP中Uncaught PDOException: SQLSTATE[42S22]列未找到错误求助
解决SQL "Column not found: 1054 Unknown column 'Password'" 错误
这个错误的核心原因很明确:你的SQL查询里引用的列名Password和数据库users表中实际的密码列名称不匹配(SQL在MySQL等数据库中默认是区分大小写的,除非你特意配置了不敏感规则)。
第一步:确认数据库表的实际列名
先搞清楚你的users表中存储密码的列到底叫什么——大概率是全小写的password,也可能是pass、user_password这类别的名称。
你可以通过以下方式验证:
- 用phpMyAdmin打开你的数据库,找到
users表,查看表结构; - 或者执行SQL命令:
这条命令会列出表的所有列,你能直接找到密码对应的准确列名。DESCRIBE users;
第二步:修正SQL查询语句
假设你查到密码列实际是password(全小写),那把代码里的SQL语句修改成和列名完全一致:
原代码:
$stmt = $con->prepare("SELECT Username, Password FROM users WHERE Username = ? AND Password = ?");
修改后:
$stmt = $con->prepare("SELECT Username, password FROM users WHERE Username = ? AND password = ?");
注意:必须保证查询里的列名和数据库表中的列名完全一致,包括大小写、拼写,不能有任何差异。
额外的优化建议(提升安全性和效率)
不需要查询密码列:你只是要验证用户是否存在,没必要把密码查出来,只需要查询用户名或者直接返回一个标记即可,比如:
$stmt = $con->prepare("SELECT 1 FROM users WHERE Username = ? AND password = ?");这样更高效,也避免了不必要的数据暴露。
替换SHA1为更安全的密码处理方式:SHA1已经属于不安全的哈希算法了,PHP官方推荐使用
password_hash()和password_verify()来处理密码:- 注册用户时存储哈希密码:
$hashedPass = password_hash($password, PASSWORD_DEFAULT); - 登录时验证密码:
// 先根据用户名查询数据库里的哈希密码 $stmt = $con->prepare("SELECT password FROM users WHERE Username = ?"); $stmt->execute(array($username)); $user = $stmt->fetch(PDO::FETCH_ASSOC); if($user && password_verify($password, $user['password'])){ // 验证成功 $_SESSION['Username'] = $username; header('Location: dashboard.php'); exit(); }
这种方式会自动处理加盐和哈希算法的更新,安全性更高。
- 注册用户时存储哈希密码:
内容的提问来源于stack exchange,提问作者Alaa MH
相关产品推荐
相关产品推荐

