【问题标题】:Fatal error: Uncaught Error: Call to a member function prepare() on null Stack trace:Database->query('SELECT jobs .*,...')Job->getAllJobs()致命错误:未捕获的错误:在 null 堆栈跟踪上调用成员函数 prepare():Database->query('SELECT jobs .*,...')Job->getAllJobs()
【发布时间】:2019-06-02 12:54:37
【问题描述】:

如果我删除// $template->jobs = $job->getAllJobs(); //,我会得到输出,但这不是我所期望的,因为它没有从数据库中获取数据。我已经尝试了这个页面上与这个问题相关的大部分答案,但仍然得到这种错误..

<?php

class Database{

    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;

    private $dbh;
    private $error;
    private $stmt;



    public function __construct(){
        //set DSN

        $dsn= 'mysqli:host=' .$this->host .';dbname='. $this->dbname;
        $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
        );

        //PDO Instances
        try{
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);       
        } catch(PDOException $e) {
            $this->error = $e->getMessage();
        }
    }  

    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
    }
    //bind values after obtaining the values
    public function bind($param, $value, $type = null){
        if(is_null($type)){
            switch(true){
                case is_int ( $value ) :
                $type = PDO::PARAM_INT;
                break;
                case is_bool ( $value ) :
                $type = PDO::PARAM_BOOL;
                break;
                case is_null( $value ) :
                $type = PDO::PARAM_NULL;
                break;
                default:
                $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    public function execute(){
    return $this->stmt->execute();          
    }

    public function resultSet(){
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_OBJ);
    }
    public function single(){
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_OBJ);
    }
  }
//Code for job class

<?php
  class Job{
    private $db;

    public function __construct(){
      $this->db = new Database();
    }
    //get all jobs
    public function getAllJobs(){

      $this->db->query("SELECT jobs .*, categories.name AS cname FROM jobs NATURAL JOIN categories ON jobs.category_id = categories.id ORDER BY post_date DESC "); //jobs.category_id==foreignkey
      $results = $this->db->resultSet();
      return $results;
   }
}

///code that caused problem
$job = new Job;
$template->jobs = $job->getAllJobs();

错误发生为:

致命错误:未捕获的错误:在 null in
上调用成员函数 prepare() C:\xampp\htdocs\project\lib\database.php:32 堆栈跟踪:#0
C:\xampp\htdocs\project\lib\job.php(11): Database->query('SELECT jobs .*,...') #1
C:\xampp\htdocs\project\homejoblister.php(7): Job->getAllJobs() #2 {main} 抛出
C:\xampp\htdocs\project\lib\database.php 在第 32 行

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    在您的$dsn 变量中,您将DSN 前缀设置为mysqli。没有数据库类型mysqli(有一个API,但仍然连接到MySQL数据库)。

    只需将数据库类型设置为mysql

    $dsn = 'mysql:host=' .$this->host .';dbname='. $this->dbname.';charset=utf8mb4';
    

    我还将此处的字符集设置为 utf8,如果您使用的是非 ASCII 字符,它将派上用场。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2020-03-11
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多