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

PHP登录功能报错:Call to a member function prepare() on null 求助

问题分析与解决方案

嘿,我一眼就揪出问题所在啦!你遇到的 Fatal error: Uncaught Error: Call to a member function prepare() on null 错误,核心原因是你的User类构造函数定义错误,导致数据库连接对象$pdo根本没被正确赋值给类属性,调用prepare()时自然会出现“在空值上调用方法”的问题。

1. 最关键的错误:构造函数命名写错了

PHP里类的构造函数必须是两个下划线的__construct,但你代码里写成了_construct(只有一个下划线):

// 错误写法
function _construct($pdo) {
    $this->pdo = $pdo;
}

这个函数不会被PHP识别为构造函数,所以当你实例化User类时,$this->pdo始终是null,调用prepare()肯定报错。

修正方法

把构造函数改成正确的双下划线版本:

// 正确写法
function __construct($pdo) {
    $this->pdo = $pdo;
}

2. 额外提醒:密码处理的安全隐患(非当前报错原因,但必须改)

你的代码里直接用md5($password)处理密码,这是非常不安全的!MD5是早已被破解的哈希算法,建议用PHP内置的password_hash()和password_verify()来处理:

  • 注册用户时:用password_hash($password, PASSWORD_DEFAULT)生成安全的哈希值存储
  • 登录验证时:用password_verify($password, $存储的哈希值)来比对,而非直接哈希输入密码再匹配

修改后的login方法示例:

public function login($email, $password) {
    $stmt = $this->pdo->prepare("SELECT `user_id`, `password` FROM `users` WHERE `email` = :email");
    $stmt->bindParam(":email", $email, PDO::PARAM_STR);
    $stmt->execute();
    $user = $stmt->fetch(PDO::FETCH_OBJ);
    
    if($user && password_verify($password, $user->password)) {
        $_SESSION['user_id'] = $user->user_id;
        header('Location: home.php');
        exit; // 跳转后记得退出,避免后续代码执行
    } else {
        return false;
    }
}

3. 最后检查:确保实例化User时传递了$pdo

确认你在login.php里已经正确引入数据库连接文件,并且把$pdo对象传给了User的构造函数,比如:

// 先引入必要文件
require_once '../core/classes/user.php';
require_once '../connection.php';

// 实例化User类,必须传入$pdo
$user = new User($pdo);

// 调用登录方法并处理错误提示
$loginResult = $user->login($email, $password);
if(!$loginResult) {
    echo "邮箱或密码错误!";
}

按照上面的步骤修改后,你的登录功能应该就能正常运行啦!

内容的提问来源于stack exchange,提问作者Kushagra Bajpai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:53:14