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