You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = ?");

注意:必须保证查询里的列名和数据库表中的列名完全一致,包括大小写、拼写,不能有任何差异。

额外的优化建议(提升安全性和效率)

  1. 不需要查询密码列:你只是要验证用户是否存在,没必要把密码查出来,只需要查询用户名或者直接返回一个标记即可,比如:

    $stmt = $con->prepare("SELECT 1 FROM users WHERE Username = ? AND password = ?");
    

    这样更高效,也避免了不必要的数据暴露。

  2. 替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:30