Php 致命错误:未捕获错误:调用null上的成员函数select()

Php 致命错误:未捕获错误:调用null上的成员函数select(),php,database,oop,model-view-controller,Php,Database,Oop,Model View Controller,我对php中的OOP有点陌生,每次在模型中我都会遇到这个问题,但我找不到导致这个问题的错误 我得到一个错误:致命错误:未捕获错误:在getCategories函数的my模型中调用成员函数select()on null(请参见下面的代码) 问题是,如果您在模型中查看saveTo函数,它似乎可以工作。但是,select既不选择,也不选择它后面的函数 请帮助我,我试图搜索此错误,但找不到解决我特定问题的方法 非常感谢您的帮助! 提前谢谢 编辑:感谢大家的帮助!我想出来了。模型类中有一个错误,因此与数据

我对php中的OOP有点陌生,每次在模型中我都会遇到这个问题,但我找不到导致这个问题的错误

我得到一个错误:致命错误:未捕获错误:在getCategories函数的my模型中调用成员函数select()on null(请参见下面的代码)

问题是,如果您在模型中查看saveTo函数,它似乎可以工作。但是,select既不选择,也不选择它后面的函数

请帮助我,我试图搜索此错误,但找不到解决我特定问题的方法

非常感谢您的帮助! 提前谢谢


编辑:感谢大家的帮助!我想出来了。模型类中有一个错误,因此与数据库没有连接。

您的问题是
父::$db
null
。这意味着数据库连接未初始化。从找出原因开始,然后从那里开始工作。

错误表明对
null
对象调用了
select()
。对父对象执行
var\u dump()
:$db,并确保该对象实际上不是空的。

父类中似乎没有定义$db。这是一个模型。你确定你初始化了它吗


如果在父构造函数(在类模型中)中初始化了它,则需要在当前构造函数(在类模型中)中显式调用它。PHP不会自动做到这一点。

我们真的需要这些吗?从阅读No framework开始,我自己的MVCwe需要查看定义parent::$db的代码。另一方面,所有这些静态调用使您的代码紧密耦合,在本质上更具过程性。另见。。。在$db上执行var转储将导致错误。在父对象上执行vardum::$db将为空。这正是错误所说的。数据库未初始化,因此包含db连接对象的变量为空(null)
<?php

class model_additem extends model{
    public function __construct(){
        DB::setConnection(DB_ADMIN,DB_ADMIN_PASS);
    }

    public function insertItem($picName,$n,$d,$p,$ui,$ic,$pt,$pd="good"){
        $data = ["pic_name"=>$picName,"pic_desc"=>$pd,"pic_type"=>$pt];
        $img = parent::$db->saveTo("pictures")->setData($data)->execute();

        if($img){
            $imgId = parent::$db->lastInsertId();

            $data = ["name"=>$n,"description"=>$d,"price"=>$p,"image_id"=>$imgId,"owner_id"=>$ui,"category_id"=>$ic];
            $prod = parent::$db->saveTo("products")->setData($data)->execute();
            return $prod;
        }
        return false;
    }

    public function getCategories(){
        $data = parent::$db->select()->from('category')->fetch('all');
        if($data) return $data;
        return false;
    }


}
<?php

class controller_additem extends controller{
    public function __construct(){
        Load::view("admin".DS."header");
        Load::view('additem/additem');
        Load::view("admin".DS."footer");
        require_once 'CheckAdmin.php'; // Check if the user is admin to enter page + more.


    }

    public function index(){
        $item = $this->model("additem");
        if(isset($_POST["addItem"])){
            $iName = filter_input(INPUT_POST,"iName",FILTER_SANITIZE_MAGIC_QUOTES);
            $iDesc = filter_input(INPUT_POST,"iDesc",FILTER_SANITIZE_MAGIC_QUOTES);
            $iPrice = filter_input(INPUT_POST,"iPrice",FILTER_SANITIZE_NUMBER_FLOAT);
            $iCat = filter_input(INPUT_POST,"category",FILTER_SANITIZE_NUMBER_INT);
            $iPic = $_FILES["iPicture"];

            $extention = explode(".",$iPic["name"]);
            $ext = end($extention);
            //pre($iPic);
            //validation
            //if($iPic["size"]> 2000000){}
            $picName = $iName.time().'.'.$ext;
            if(move_uploaded_file($iPic["tmp_name"],ROOT . "public/images/" . $picName)){
                $userId = Session::get("userId");

                $result = $item->insertItem($picName,$iName,$iDesc,$iPrice,$userId,$iCat,$ext);
                if($result){
                    Session::set("result","Item has been inserted successfully");
                }else{
                    Session::set("result","Error occured");
                }

            }
        }
        $cats = $item->getCategories();
        $uName = Session::get("userData")["name"];
        Load::view("additem/additem",$cats);
    }
}
class db{
    private static $db = null;
    private $sql = "";
    private $save_type;
    private $binded = array();
    private $query = '';
    private $last_insert_id;

    public function __construct(){
        if(self::$db == null){
            $user = DB_GUEST;
            $pass = DB_GUEST_PASS;
            if(Session::found("user_priv") == 'no'){
                $user = DB_USER;
                $pass = DB_USER_PASS;
            }
            if(Session::found("user_priv") == 'yes'){
                $user = DB_ADMIN;
                $pass = DB_ADMIN_PASS;
            }
            self::setConnection($user,$pass);
        }
    }

    public static function setConnection($user,$pass,$dbname=DB_NAME){
        try{
            self::$db = new PDO("mysql:host=localhost;dbname=$dbname",$user,$pass);
            self::$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
            self::$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            self::$db->exec("SET NAMES utf8");
        }catch(PDOException $e){
            die($e->getMessage());
        }
    }

    public static function getDb(){
        if(self::$db == null){
            $user = DB_GUEST;
            $pass = DB_GUEST_PASS;
            if(Session::found("userId")){
                $user = DB_USER;
                $pass = DB_USER_PASS;
            }
            if(Session::found("admin")){
                $user = DB_ADMIN;
                $pass = DB_ADMIN_PASS;
            }
            self::setConnection($user,$pass);
        }
        return self::$db;
    }

    //SELECT [name,pass,email]
    public function select(array $select=[]){
        $sql = "SELECT ";
        if(empty($select)){
            $sql .= "*";
        }else{
            filter_array($select);
            $select = implode(",",$select);
            $sql .= string($select);
        }
        $this->sql = $sql;

        return $this;
    }

    //FROM
    public function from($tbl){
        $this->sql .= " FROM " . string($tbl);
        return $this;
    }

    //WHERE
    public function where(array $where){
        //filter_array($where);
        $sql = " WHERE ";
        foreach($where as $key => $val){
            $sql .= $key . " LIKE '".$val."' AND ";
        }

        $this->sql .= rtrim($sql," AND ");
        return $this;
    }

    //JOIN
    public function join(array $tbl,$type="LEFT JOIN"){
        $sql = " ".strtoupper($type)." ";
        $sql .= implode(",",$tbl);

        $this->sql .= $sql;
        return $this;
    }

    //ON
    public function on($cond1,$cond2){
        $sql = " ON ";
        $sql .= string($cond1) . " = " . string($cond2);

        $this->sql .= $sql;
        return $this;
    }

    //ORDER BY
    public function order_by($order_by, $order_type="ASC"){
        $sql = " ORDER BY ";
        $sql .= string($order_by)." ".strtoupper(string($order_type));

        $this->sql .= $sql;
        return $this;
    }

    //LIMIT
    public function limit($limit){
        $this->sql .= " LIMIT " . int($limit);
        return $this;
    }

    //FETCH
    public function fetch($fetch_type=""){
        $fetch = "fetch";
        if($fetch_type){
            $fetch = "fetchAll";
        }

        try{
            $query = self::$db->query($this->sql);
            $this->reset();
            return $query->$fetch();
        }catch(PDOException $e){
            die($e->getMessage());
        }
    }

    //saveTo
    public function saveTo($tbl,$type="insert"){
        $tbl = string($tbl);
        $this->save_type = strtolower(string($type));

        if($this->save_type == "update"){
            $sql = "UPDATE ";
        }elseif($this->save_type == "replace"){
            $sql = "REPLACE INTO ";
        }else{
            $sql = "INSERT INTO ";
        }

        $sql .= $tbl . " SET ";
        $this->sql = $sql;
        return $this;
    }

    //SET DATA
    public function setData(array $data,$filter="string"){
        $filter = string($filter);

        foreach($data as $colomn => $value){
            $colomn = string($colomn);
            $value = $filter($value);
            $this->binded[$colomn] = $value;
            $this->sql .= $colomn . "=:" . $colomn . ",";
        }
        //pre($this->binded);
        $this->sql = rtrim($this->sql,",");
        return $this;
    }

    //execute
    public function execute(){
        try{
            $this->query = self::$db->prepare($this->sql);
            if($this->binded){
                foreach($this->binded as $colomn => $value){
                    $this->bind($colomn,$value);
                }
            }
            $result = $this->query->execute();

            if($this->save_type == 'insert'){
                $this->last_insert_id = self::$db->lastInsertId();
            }
            $this->reset();
            return $result;

        }catch(PDOException $e){
            die($e->getMessage());
        }
    }

    //BIND
    private function bind($placeholder,$value,$filter="string",$bind_type="bindValue"){
        return $this->query->$bind_type(":".$placeholder,$filter($value),PDO::PARAM_STR);
    }

    public function lastInsertId(){
        return $this->last_insert_id;
    }

    //DELETE
    public function delete($tbl,$col=false){
        $this->sql = "DELETE ";
        if($col){
            $this->sql .= string($col)." ";
        }
        $this->sql .= "FROM " . string($tbl);
        return $this;
    }

    //TRUNCATE
    public function truncate($tbl){
        $this->sql = 'TRUNCATE ' . string($tbl);
        return $this;
    }

    //View Query
    public function viewQ(){
        echo $this->sql;
    }

    //RESET
    private function reset(){
        $this->sql = "";
        $this->save_type = "";
        $this->query = "";
        $this->binded = array();
    }
}