簡體   English   中英

致命錯誤:調用成員函數query()PHP CLASS

[英]Fatal error: Call to a member function query() PHP CLASS

我正在嘗試編寫此類來連接和查詢數據庫,但出現此錯誤:

致命錯誤:在第24行的C:\\ xxxxxx \\ xxxx \\ xxxxx \\ xxxxxxx \\ pages \\ config \\ class.php中,調用成員函數query()上的null

郵遞區號:

<?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 ,因此rest方法調用失敗:

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
    }  

如前所述,您的代碼效率不高,因為對於每個執行的查詢,代碼都(重新)連接到數據庫。 這不必要地昂貴/低效。

有很多方法可以解決此問題。

  1. 在數據庫類實例化時連接到數據庫

例如

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;
    }  
}
  1. 惰性連接,即僅在第一次執行的查詢上進行連接

例如

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->...

如果使用構造函數來啟動連接會更好,當前每次使用查詢方法時,您都將打開一個新的數據庫連接。

編輯:您的班級可能看起來像這樣

<?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將整個結果集作為數組返回。 這樣,您可以自由選擇要如何處理結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM