PHP致命错误:在null上调用run_query()方法的问题求助
解决 "Call to a member function run_query() on null" 错误及代码问题
Hey,我来帮你搞定这个致命错误,顺便揪出代码里的其他隐性问题:
一、核心致命错误:$obj 未被正确初始化
这个错误的本质是:你调用run_query()方法的$obj变量是null——也就是说,这个对象根本不存在,自然没法调用它的方法。
常见的触发场景:
- 没引入定义数据库类的文件:你的
run_query()方法大概率是写在某个数据库操作类里的,但login.php里没有用require/include加载这个类文件; - 类文件加载了,但没实例化:比如漏掉了
$obj = new YourDatabaseClass();这行关键代码; - 实例化失败:比如类的构造函数需要传入数据库连接参数(主机、账号、密码),你没传或者传错了,导致实例化出来的对象是
null。
修复步骤:
- 先确认加载了数据库类文件,在
login.php开头添加:require_once 'path/to/your/database-class.php'; // 替换成你的类文件实际路径,比如db.class.php - 在调用
$obj->run_query()之前,正确实例化类:// 假设你的数据库类名为DbConnection,根据实际类名和参数调整 $obj = new DbConnection('localhost', 'db_username', 'db_password', 'db_name'); // 加个简单检查确保实例化成功 if (!isset($obj) || is_null($obj)) { die("数据库对象初始化失败,请检查连接参数"); }
二、SQL查询中的变量错误(隐性bug)
看你的代码片段:
$name = $_POST['username']; $query = "SELECT * FROM users WHERE username = '$email'";
这里你把表单提交的用户名存在了$name变量里,但SQL语句里却用了未定义的$email!这会导致查询条件变成username = '',就算前面的$obj没问题,也查不到任何数据,还会触发未定义变量的警告。
修复方法:
把SQL里的$email改成$name,同时为了避免SQL注入风险,一定要用预处理语句(绝对不要直接拼接变量到SQL里),比如:
// 使用预处理语句避免SQL注入 $query = "SELECT * FROM users WHERE username = ?"; // 假设你的数据库类支持预处理,或者用mysqli原生方法 $stmt = $obj->prepare($query); $stmt->bind_param("s", $name); $stmt->execute(); $result = $stmt->get_result();
三、其他小问题:变量名拼写错误
你的代码里写了$result = $obj->run_query($query);,但后面判断行数时用的是mysqli_num_rows($res...——这里的$res应该是$result吧?变量名拼写错误会导致后续代码无法获取查询结果行数。
内容的提问来源于stack exchange,提问作者user9500221
相关产品推荐
相关产品推荐

