2016-07-28 16 views
0

在PHP中執行預準備語句時出現問題。我的主要目標是創建兩個類,第一個用於連接(Conexion)到服務器和數據庫,第二個用於執行準備好的語句(RealizarConsultas)。在PHP中編寫語句和類繼承

我已經決定用來做語句的類應該繼承「Conexion」。通過這樣做,我每次使用函數「RealizarConsultas :: MostrarConsulta()」時都假裝連接數據庫。這個函數應該連接數據庫,然後它應該執行準備好的語句,最後它應該關閉連接。

用於連接的類。

<?php 

    class Conexion extends PDO{ 

     protected $conexionDb; 

     public function Conexion(){ 
      try{ 
       $conexionDb=new PDO ('mysql:host=localhost;dbname=euroburo','root',''); 
       $conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $conexionDb->exec("SET CHARACTER SET utf8"); 



      }catch(Exception $e){ 

       echo "Error: ".$e->getLine(); 

      } 
     } 
     public function stopConexion(){ 
      $conexionDb->close(); 
     } 

    } 
?> 

用於做準備語句的類。

<?php 
    require("conexion.php"); 
    class RealizarConsulta extends Conexion{ 
     public function RealizarConsulta(){ 
      parent::__construct(); 
     } 
     public function MostrarConsulta($consulta){ 
      $resultado=$this->conexionDb->prepare($consulta); 
      $resultado->execute(); 
      $final = $resultado->fetch(PDO::FETCH_ASSOC); 
      print_r($final); 
      $this->stopConexion(); 
     } 
    } 

?> 

我的主要問題是在這一行,位於「RealizarConsulta :: MostrarConsulta()」內部。

$resultado=$this->conexionDb->prepare($consulta); 

每次我調用函數(RealizarConsulta :: MostrarConsulta());

出現此錯誤:調用一個非對象的成員函數prepare()。

我知道這個錯誤告訴我$ this-> conexionDb不是一個對象,但我不明白爲什麼。我不明白錯誤的原因是因爲$ conexionDb是在父類中創建的受保護變量,因爲受保護的變量「RealizarConsulta」類應該繼承它,沒有任何問題,我應該可以訪問它。你可以看到$ conexionDb在構造函數被調用時被初始化,並且它應該保存與連接有關的信息。

正如你可以看到我的推理,$ conexionDb應該是對屬於「Conexion」類的對象的引用,我應該可以在「RealizarConsulta」類中訪問它。

我想知道我失敗的原因以及如何解決錯誤。謝謝

+0

你爲什麼要包裝PDO? – PeeHaa

+1

*「用於執行語句的類應該從」Conexion「繼承*」* - 這是一個糟糕的設計決定。它不應該延伸'Conexion';它應該在構造函數中獲得一個'Conexion'作爲參數。想一想:您可能想在腳本執行過程中創建並運行多個準備好的語句;不需要爲每個語句創建單獨的連接。這是浪費資源,有時候這種方法阻止你完成你的目標(你不能在事務中包裝兩條語句)。 – axiac

+1

'$ conexionDb'和'$ this-> conexionDb'是完全不同的變量。另外,在類名後面命名一個構造函數是PHP/4語法 - 它們已經在PHP/7中觸發了一個警告,並且有可能在某一天被刪除。 –

回答

0

您正在聲明您的類級變量,但除非您遺漏了一些代碼,否則不會將您的本地變量分配給類級別。在PHP中,你必須這樣做。例如

class A { 
    protected $a; 

    public function __construct() { 
     $this->a = 'Hello'; 
    } 

    public function echo() { 
     $a = 'World'; 
     echo $this->a . ' ' . $a; 
    } 
} 

$a = new A(); 
$a->echo() 

會回聲Hello World。這是因爲在echo(),$a是一個局部變量,而$this->a是一個變量作用於該類的變量。它們是兩個不同的變量,它們擁有兩個不同的值。

所以你的構造應該是這樣的

public function __construct() { 
     try { 
      $conexionDb= new PDO('mysql:host=localhost;dbname=euroburo', 'root', ''); 
      $conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $conexionDb->exec("SET CHARACTER SET utf8"); 
      $this->conexionDb = $conexionDb; 
     } catch(Exception $e) { 
      echo "Error: ".$e->getLine(); 
     } 
    } 

此外,作爲一個側面說明,強烈推薦使用public function __construct()作爲PHP構造函數,而不是一個具有相同的名稱作爲類的函數