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
相关产品推荐
相关产品推荐

