PHP构造函数在错误query()为null时不能正常工作


php constructor is not working correctly with error query() on null

从item.php中可以看到,我有两个函数来显示一些项目

display_item_1()和display_item_2 ()

当我通过调用

运行程序时
$item = new item();
$item->display_item_1(1);
$item->display_item_2(1);

它只显示函数->display_item_1()

但是对于display_item_2()收到致命错误:调用成员函数query()在null

换句话说,函数display_item_1()和display_item_2()是相同的编码,但只显示第一个。这意味着item。php中的构造函数不正确?

或者我做错了哪一部分?

db.php

class db{
protected $db_host;
protected $db_name;
protected $db_user_name;
protected $db_pass;
public function __construct() {
$this->db_host="localhost";
$this->db_name="bs";
$this->db_user_name="root";
$this->db_pass="";
}
public function conn(){
try {   
    $conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $conn;
}
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }
}
}

item.php

require "db.php";
class item {
public $user_uid;
protected $item_name;
public $conn;
public function __construct(){
    $db = new db();
    $this->conn= $db->conn();
}
public function display_item_1($uid){
    $this->user_uid=$uid;
    try{
        $sql="SELECT * FROM item where uid='$this->user_uid'";
        $statement=$this->conn->query($sql);
    }
    catch(PDOException $e){
        ... 
    }
}
public function display_item_2($uid){
    $this->user_uid=$uid;
    try{
        $sql="SELECT * FROM item where uid='$this->user_uid'";
        $statement=$this->conn->query($sql);
        }
    }
    catch(PDOException $e){
        ...
    }
}
}

在你的其他问题中也提到过,我将在这个问题中再次提到:重写代码并让DB类处理查询。现在您的DB类在面向对象设计方面没有意义,它写得不好,应该从头开始重写。这只是一个想法,它可能是这样的:

db.php

// Use uppercase for class names and stick to possibly unreserved names
class DatabaseHandler
{
    // moved from constructor and set to private, you are surely not using inheritance
    private $db_host="localhost";
    private $db_name="bs";
    private $db_user_name="root";
    private $db_pass="";
    private $connection= FALSE; // added, holds db connection
    /* obsolete in your case 
    public function __construct() { }
    */
    public function connect() 
    {
        try {   
            $conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->connection= $conn;
            return TRUE;
        }
        catch(PDOException $e)
        {
            echo $sql . "<br>" . $e->getMessage();
            return FALSE;
        }
    }
    /**
    * return records from your database; checks skipped in this example
    */
    public function query($query) 
    {
        // only query if a database connection is available, else return false
        if (!$this->connection) return FALSE;
        try {
            $statement=$this->connection->query($query);
            return $statement->fetchAll();
        }
        catch(PDOException $e){
            // logging or whatever ...
            return FALSE;           
        }
    }
}

item.php

class Item {
    public $user_uid;
    private $item_name;
    private $conn; // why make it public?
    public function __construct(){
        $db = new DatabaseHandler();
        if (!$db->connect()) die("Database not available"); // update these lines
        $this->conn= $db; 
    }
    public function display_item_1($uid){
        $this->user_uid=$uid;
        $arrValues= $this->conn->query("SELECT * FROM item where uid='$this->user_uid'");
        print_r($arrValues);
    }
    public function display_item_2($uid){
        $this->user_uid=$uid;
        $arrValues= $this->conn->query("SELECT * FROM item where uid='$this->user_uid'");
        print_r($arrValues);
    }
}

运行代码:

$item = new Item();
$item->display_item_1(1);
$item->display_item_2(1);

请通过一些教程,特别是类和OOP(面向对象的编程)。