Fatal error: Uncaught Error: Call to a member function on bool
Fatal error: Uncaught Error: Call to a member function on bool
我知道这个答案已经得到了回答,但我似乎对我的情况一无所知(我对网络开发还是很陌生,从今年 10 月开始学习前端,然后我跳到了 php 在本月初)。
我的功能应该检查用户是否已登录,但我无法理解我为我的问题阅读的答案,因为在我找到的答案中,这些功能似乎不是自定义的?我可能是错的,我希望如果我错了,你可以笑一笑。
因此,为了了解一些上下文,当我尝试在我的一个控制器中调用函数“check_logged_in()”时遇到了这个错误,这个有问题的控制器(称为上传)扩展我的核心文件夹中的主控制器(我三次检查了我的 init 文件是否需要它,以便我可以在全球范围内使用它)。
然后,如果需要,我从主控制器调用一个自定义函数来加载模型(在这种情况下,我需要加载我的用户模型以访问“check_logged_in()”函数,因为它写在那里)。
这就是事情发生的地方。我将提供一些代码,以便你们理解我在说什么。
上传控制器
<?php
class Upload extends Controller
{
function index()
{
header("location:" . ROOT . "upload/image");
die;
}
function image()
{
$user = $this->loadModel("user");
if(!$result = $user->check_logged_in()){
header("location:" . ROOT . "login");
die;
}
$data['page_title'] = "Upload";
$this->view("upload", $data);
}
}
主控制器
<?php
class Controller
{
protected function view($view, $data = [])
{
if (file_exists("../app/views/" . $view . ".php")) {
include "../app/views/" . $view . ".php";
} else {
include "../app/views/404.php";
}
}
protected function loadModel($model)
{
if (file_exists("../app/model/" . $model . ".php")) {
include "../app/model/" . $model . ".php";
return $model = new $model();
}
return false;
}
}
以及来自用户模型的代码位被调用
<?php
class User
{
function check_logged_in()
{
$DB = new Database();
if (isset($_SESSION['user_url'])) {
$arr['user_url'] = $_SESSION['user_url'];
$query = "select * from users where url_address = :user_url limit 1";
$data = $DB->read($query, $arr);
if (is_array($data)) {
//logged in
$_SESSION['user_name'] = $data[0]->username;
$_SESSION['user_url'] = $data[0]->url_address;
return true;
}
}
return false;
}
}
在此先感谢您的时间伙伴,我希望我的菜鸟自我足够清晰,以便您理解^^'
检查 $user 变量的正确值应该可以修复错误。
...
function image()
{
$user = $this->loadModel("user");
if(!$user || !$user->check_logged_in()){ // Here
header("location:" . ROOT . "login");
die;
}
$data['page_title'] = "Upload";
...
然后在$user
是false
条件将是
!false || !false->check_logged_in()
这将导致 true
.
否则 $user
是 User
:
!(object User) || !(object User)->check_logged_in()
将调用 User::check_logged_in()
方法。
我知道这个答案已经得到了回答,但我似乎对我的情况一无所知(我对网络开发还是很陌生,从今年 10 月开始学习前端,然后我跳到了 php 在本月初)。 我的功能应该检查用户是否已登录,但我无法理解我为我的问题阅读的答案,因为在我找到的答案中,这些功能似乎不是自定义的?我可能是错的,我希望如果我错了,你可以笑一笑。
因此,为了了解一些上下文,当我尝试在我的一个控制器中调用函数“check_logged_in()”时遇到了这个错误,这个有问题的控制器(称为上传)扩展我的核心文件夹中的主控制器(我三次检查了我的 init 文件是否需要它,以便我可以在全球范围内使用它)。 然后,如果需要,我从主控制器调用一个自定义函数来加载模型(在这种情况下,我需要加载我的用户模型以访问“check_logged_in()”函数,因为它写在那里)。 这就是事情发生的地方。我将提供一些代码,以便你们理解我在说什么。
上传控制器
<?php
class Upload extends Controller
{
function index()
{
header("location:" . ROOT . "upload/image");
die;
}
function image()
{
$user = $this->loadModel("user");
if(!$result = $user->check_logged_in()){
header("location:" . ROOT . "login");
die;
}
$data['page_title'] = "Upload";
$this->view("upload", $data);
}
}
主控制器
<?php
class Controller
{
protected function view($view, $data = [])
{
if (file_exists("../app/views/" . $view . ".php")) {
include "../app/views/" . $view . ".php";
} else {
include "../app/views/404.php";
}
}
protected function loadModel($model)
{
if (file_exists("../app/model/" . $model . ".php")) {
include "../app/model/" . $model . ".php";
return $model = new $model();
}
return false;
}
}
以及来自用户模型的代码位被调用
<?php
class User
{
function check_logged_in()
{
$DB = new Database();
if (isset($_SESSION['user_url'])) {
$arr['user_url'] = $_SESSION['user_url'];
$query = "select * from users where url_address = :user_url limit 1";
$data = $DB->read($query, $arr);
if (is_array($data)) {
//logged in
$_SESSION['user_name'] = $data[0]->username;
$_SESSION['user_url'] = $data[0]->url_address;
return true;
}
}
return false;
}
}
在此先感谢您的时间伙伴,我希望我的菜鸟自我足够清晰,以便您理解^^'
检查 $user 变量的正确值应该可以修复错误。
...
function image()
{
$user = $this->loadModel("user");
if(!$user || !$user->check_logged_in()){ // Here
header("location:" . ROOT . "login");
die;
}
$data['page_title'] = "Upload";
...
然后在$user
是false
条件将是
!false || !false->check_logged_in()
这将导致 true
.
否则 $user
是 User
:
!(object User) || !(object User)->check_logged_in()
将调用 User::check_logged_in()
方法。