PHP报错:User类未找到问题求助及代码排查
修复 "Class 'User' not found" 错误
报错信息
Fatal error: Uncaught Error: Class "User" not found in C:\xampp\htdocs\praveenblog\includes\config.php:43 Stack trace: #0 C:\xampp\htdocs\praveenblog\admin\login.php(4): require_once() #1 {main} thrown in C:\xampp\htdocs\praveenblog\includes\config.php on line 43
错误根源
- 自动加载函数命名错误:自定义函数写成了
spl__autoload_register,但PHP官方自动加载注册函数是spl_autoload_register(多了一个下划线),导致类自动加载逻辑完全未生效。 - 变量大小写不匹配:
config.php中实例化的是$User(大写U),但login.php中调用的是$user(小写u),会引发未定义变量错误。 - 密码哈希语法错误:
class.user.php中密码哈希的单引号嵌套写法存在语法问题,导致该函数无法正常执行。 - 路径判断冗余:原自动加载中的多路径判断可以简化为基于当前文件目录的绝对路径计算,避免路径判断混乱。
修复后的代码
1. config.php
<?php ob_start(); session_start(); // 数据库配置 define('DBHOST','localhost'); define('DBUSER','root'); define('DBPASS',''); define('DBNAME','praveenblogcms'); $db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置时区为亚洲/加尔各答 date_default_timezone_set('Asia/Kolkata'); // 自动加载类文件:基于当前文件目录计算classes绝对路径 spl_autoload_register(function($class) { $class = strtolower($class); $baseDir = dirname(__DIR__); $classPath = $baseDir . '/classes/class.' . $class . '.php'; if (file_exists($classPath)) { require_once $classPath; } }); // 统一变量名为小写$user,与login.php保持一致 $user = new User($db); ?>
2. class.user.php
<?php class User{ private $db; public function __construct($db){ $this->db = $db; } public function is_logged_in(){ return isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true; } public function create_hash($value) { // 修复单引号嵌套问题,拆分盐值生成逻辑 $salt = '$2a$12$' . substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22); return crypt($value, $salt); } private function verify_hash($password, $hash) { return crypt($password, $hash) === $hash; } private function get_user_hash($username){ try { $stmt = $this->db->prepare('SELECT password FROM praveen_blog_users WHERE username = :username'); $stmt->execute(['username' => $username]); $row = $stmt->fetch(PDO::FETCH_ASSOC); return $row['password'] ?? false; } catch(PDOException $e) { echo '<p class="error">' . $e->getMessage() . '</p>'; return false; } } public function login($username, $password){ $hashed = $this->get_user_hash($username); if($hashed && $this->verify_hash($password, $hashed)){ $_SESSION['loggedin'] = true; return true; } return false; } public function logout(){ session_destroy(); unset($_SESSION['loggedin']); } } ?>
3. login.php
<?php require_once('../includes/config.php'); // 已登录则跳转后台首页 if($user->is_logged_in()){ header('Location: index.php'); exit; } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>管理员登录</title> <link rel="stylesheet" href="assets/style.css"> </head> <body> <div id="login"> <?php // 处理登录提交 if(isset($_POST['submit'])){ $username = trim($_POST['username']); $password = trim($_POST['password']); if($user->login($username, $password)){ header('Location: index.php'); exit; } else { $message = '<p class="invalid">用户名或密码错误</p>'; } } if(isset($message)){ echo $message; } ?> <form action="" method="POST" class="form"> <label>用户名</label> <input type="text" name="username" value="" required /> <br> <label>密码</label> <input type="password" name="password" value="" required /> <br> <label></label><input type="submit" name="submit" value="登录" /> </form> </div> </body> </html>
内容的提问来源于stack exchange,提问作者Praveen KJ
相关产品推荐
相关产品推荐

