致命错误:调用成员函数query() PHP CLASS



我想写这个类来连接和查询我的数据库,但我得到了这个错误:

致命错误:在null对象上调用成员函数query()C:xxxxxx xxxxxxxxxx xxxxxxxpagesconfigclass.php on line 24

Php代码:
<?php
class Db{
    private static $db_host = "localhost";
    private static $db_user = "root";
    private static $db_pass = "";
    private static $db_name = "sivi";
    public $connection;
        public function db_connect() {    
            $connection = mysqli_connect(self::$db_host, self::$db_user, self::$db_pass, self::$db_name) or die("Error " . mysqli_error($connection)); 
            echo "Conexión realizada". "<br>";
    }  
    public function db_query($query){
          $connection = $this->db_connect();
          var_dump($query);
          $result = $connection->query($query);
          while($row = mysqli_fetch_array($result)) { 
          echo $row["COD_PRE"] . "<br>";
          }
    } 
}
$con = new Db();
$con->db_query('SELECT `COD_PRE`, `CODE` FROM `test` WHERE `CODE` = 457 AND CONFIN = 1');
?>

你的方法:

public function db_connect() {    
            $connection = mysqli_connect(self::$db_host, self::$db_user, self::$db_pass, self::$db_name) or die("Error " . mysqli_error($connection)); 
            echo "Conexión realizada". "<br>";
    }  

不从方法返回$connection,所以其他方法调用失败,这样做:

public function db_connect() {    
            $connection = mysqli_connect(self::$db_host, self::$db_user, self::$db_pass, self::$db_name) or die("Error " . mysqli_error($connection)); 
            echo "Conexión realizada". "<br>";
           return $connection; // return the $connection object
    }  
如前所述,您的代码效率不高,因为对于执行的每个查询,代码(重新)连接到DB。这是不必要的昂贵/低效的。

有很多方法可以解决这个问题。

  1. 在DB类实例化时连接到DB

class Db{
    private static $db_host = "localhost";
    private static $db_user = "root";
    private static $db_pass = "";
    private static $db_name = "sivi";
    public $connection;
    public function __construct()
   {
      $this->connection = $this->db_connect();
   }  
    public function db_connect() {    
            $connection = mysqli_connect(self::$db_host, self::$db_user, self::$db_pass, self::$db_name) or die("Error " . mysqli_error($connection)); 
            echo "Conexión realizada". "<br>";
            return $connection;
    }  
}
  • 延迟连接,即仅在第一次执行查询时连接
  • class Db{
        private static $db_host = "localhost";
        private static $db_user = "root";
        private static $db_pass = "";
        private static $db_name = "sivi";
        public $connection = null;
        public function __construct()
        {
        }  
        public function db_connect() {    
            $connection = mysqli_connect(self::$db_host, self::$db_user, self::$db_pass, self::$db_name) or die("Error " . mysqli_error($connection)); 
            echo "Conexión realizada". "<br>";
            return $connection;
        }  
        public function db_query($query){
            if ( null ==== $this->connection ) $this->connection = $this->db_connect();
            var_dump($query);
            $result = $this->connection->query($query);
            while($row = mysqli_fetch_array($result)) { 
                echo $row["COD_PRE"] . "<br>";
            }
        }
    }
    

    您必须使用$this来访问自己类的属性。

    $this->connection = ....
    $result = $this->connection->...
    

    如果使用构造函数来初始化连接会更好,目前每次使用query方法都要打开一个到数据库的新连接。

    编辑:你的类看起来像这样

    <?php
    class Db {
        private $db_host = "localhost";
        private $db_user = "root";
        private $db_pass = "";
        private $db_name = "sivi";
        private $connection;
        public function __construct() {
            $this->connection = mysqli_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name) 
                    or die("Error " . mysqli_error($this->connection));
        }
        public function db_query($query) {
            var_dump($query);
            $result = $this->connection->query($query);
            while ($row = mysqli_fetch_array($result)) {
                echo $row["COD_PRE"] . "<br>";
            }
        }
    }
    $con = new Db();
    $con->db_query('SELECT `COD_PRE`, `CODE` FROM `test` WHERE `CODE` = 457 AND CONFIN = 1');
    ?>
    

    我认为不需要静态的属性,所以我也改变了它们。

    db_query方法在我看来太不灵活,因为它直接输出您的结果。我将使用fetch_all返回整个结果集作为一个数组。这样,您就可以自由选择如何处理您的结果。

    最新更新