【问题标题】:Fatal error: Uncaught Error: Call to a member function on bool致命错误:未捕获的错误:调用 bool 上的成员函数
【发布时间】:2022-01-27 07:05:17
【问题描述】:

我知道这个答案已经得到了回答,但在我的情况下似乎我什么都不懂(我对 Web 开发还是很陌生,从今年 10 月开始学习前端,我一开始就跳到了 php月)。 我的功能应该检查用户是否已登录,但我无法理解我为我的问题阅读的答案,因为在我找到的答案中,功能不是自定义的?我可能是错的,如果我错了,我希望你能笑一笑。

因此,为了了解一些上下文,当我尝试在我的一个控制器中调用函数“check_logged_in()”时遇到此错误,这个有问题的控制器(称为 Upload)从我的核心扩展了主控制器文件夹(我三次检查我的初始化文件是否需要它,以便我可以全局使用它)。 然后,如果需要,我从主控制器调用一个自定义函数来加载模型(在这种情况下,我需要加载我的用户模型来访问“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;
    }
}

提前感谢你们的时间伙伴,我希望我的菜鸟自我足够清楚,让你们理解^^'

【问题讨论】:

  • $this-&gt;loadModel("user") 必须返回 false,而不是 User 类的实际实例。这反过来很可能意味着,那里的file_exists 调用实际上并没有找到您正在那里寻找的文件。
  • 您已经删除了错误消息,因此查找错误不再有用。被调用的函数是什么,发生这种情况的行是什么?我知道您需要一些经验才能了解错误消息的含义,但这并不意味着它们没有用。
  • 附带说明,请注意,没有 order by 子句的 select * from users ... limit 1 将返回任意行(甚至不是正确随机化的行)。
  • @CBroe,是的,loadModel 应该返回 false,所以我可以被重定向到登录页面,因为我没有连接,但是我收到了这个错误消息,我有点迷路了我想在进入 php 编码之前我需要学习更多。
  • @Álvaro González 被调用的函数是第 14 行的 check_logged_in(),这是错误发生的地方:s

标签: php model-view-controller


【解决方案1】:

检查 $user 变量的正确值应该可以修复错误。

...
    function image()
    {
        $user = $this->loadModel("user");
        
        if(!$user || !$user->check_logged_in()){ // Here
            header("location:" . ROOT . "login");
            die;
        }

        $data['page_title'] = "Upload";
...

那么在$userfalse 条件将是 !false || !false-&gt;check_logged_in() 这将导致true

否则$userUser!(object User) || !(object User)-&gt;check_logged_in() 将调用 User::check_logged_in() 方法。

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 2022-01-21
    • 2018-09-10
    • 1970-01-01
    • 2022-07-02
    • 2020-10-04
    • 2016-04-20
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多