在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」類中訪問它。
我想知道我失敗的原因以及如何解決錯誤。謝謝
你爲什麼要包裝PDO? – PeeHaa
*「用於執行語句的類應該從」Conexion「繼承*」* - 這是一個糟糕的設計決定。它不應該延伸'Conexion';它應該在構造函數中獲得一個'Conexion'作爲參數。想一想:您可能想在腳本執行過程中創建並運行多個準備好的語句;不需要爲每個語句創建單獨的連接。這是浪費資源,有時候這種方法阻止你完成你的目標(你不能在事務中包裝兩條語句)。 – axiac
'$ conexionDb'和'$ this-> conexionDb'是完全不同的變量。另外,在類名後面命名一個構造函數是PHP/4語法 - 它們已經在PHP/7中觸發了一個警告,並且有可能在某一天被刪除。 –