2016-07-28 50 views
0

Ich habe ein Problem, wenn ich eine vorbereitete Anweisung in PHP mache. Mein Hauptziel ist es, zwei Klassen zu erstellen, die erste für die Verbindung (Conexion) mit dem Server und der Datenbank und die zweite für vorbereitete Anweisungen (RealizarConsultas).Vorbereitete Anweisungen und Klassenvererbung in PHP

Ich habe beschlossen, dass die Klasse, die Anweisungen verwendet, von "Conexion" erben sollte. Ich tue so, als würde ich jedes Mal, wenn ich die Funktion "RealizarConsultas :: MostrarConsulta()" verwende, eine Verbindung zur Datenbank herstellen. Diese Funktion sollte sich mit der Datenbank verbinden, dann sollte sie die vorbereitete Anweisung ausführen und schließlich sollte sie die Verbindung schließen.

Klasse für Verbindung verwendet.

Klasse verwendet, um Anweisungen vorzubereiten.

<?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(); 
     } 
    } 

?> 

Mein Hauptproblem ist in dieser Linie, befindet sich im Inneren "RealizarConsulta :: MostrarConsulta()".

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

Jedes Mal, wenn ich auf die Funktion aufrufen (RealizarConsulta :: MostrarConsulta());

Dieser Fehler wird angezeigt: Aufruf einer Memberfunktion prepare() für ein Nichtobjekt.

Ich verstehe, dass dieser Fehler mir sagt, dass $ this-> conexionDb kein Objekt ist, aber ich verstehe nicht wirklich warum. Der Grund, warum ich den Fehler nicht verstehe, liegt an der Tatsache, dass $ conexionDb eine geschützte Variable ist, die in der Elternklasse erstellt wurde, da eine geschützte Variable "RealizarConsulta" sie ohne Probleme erben sollte und ich sollte darauf zugreifen können. $ conexionDb, wie Sie sehen können, wird beim Aufruf des Konstruktors initialisiert und sollte die Informationen enthalten, die sich auf die Verbindung beziehen.

Wie Sie durch meine Argumentation sehen können, sollte $ conexionDb eine Referenz auf ein Objekt sein, das zur Klasse "Conexion" gehört, und ich sollte darauf in der Klasse "RealizarConsulta" zugreifen können.

Ich würde gerne wissen, in was ich versage und wie kann ich den Fehler beheben. Danke

+0

Warum verpacken Sie PDO am Anfang? – PeeHaa

+1

* "Die Klasse, die Anweisungen verwendet, sollte von" Conexion "" * erben - das ist eine schlechte Designentscheidung. Es sollte 'Conexion' nicht verlängern; Es sollte ein 'Conexion' als Argument im Konstruktor erhalten. Denken Sie ein wenig darüber nach: Möglicherweise möchten Sie während der Skriptausführung mehrere vorbereitete Anweisungen erstellen und ausführen. Es ist nicht erforderlich, für jede Anweisung eine separate Verbindung zu erstellen.Es ist eine Verschwendung von Ressourcen, und es gibt Situationen, in denen dieser Ansatz verhindert, dass Sie Ihr Ziel erreichen (Sie können nicht zwei Anweisungen in eine Transaktion fugen). – axiac

+1

'$ conexionDb' und' $ this-> conexionDb' sind völlig verschiedene Variablen. Wenn Sie einen Konstruktor nach dem Klassennamen benennen, lautet die PHP/4-Syntax - sie lösen in PHP/7 bereits eine Warnung aus und werden möglicherweise eines Tages entfernt. –

Antwort

0

Sie deklarieren Ihre Klassenvariable, aber wenn Sie keinen Code weglassen, ordnen Sie Ihre lokale Variable nicht der Klassenstufe zu. In PHP müssen Sie das tun. Zum Beispiel

class A { 
    protected $a; 

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

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

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

Würde Echo Hello World. Dies liegt daran, dass in echo(), $a eine lokale Variable und $this->a eine Variable ist, die auf die Klasse beschränkt ist. Sie sind zwei verschiedene Variablen, die zwei verschiedene Werte enthalten.

So soll Ihr Konstruktor wie diese auch

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(); 
     } 
    } 

aussehen, als eine Randnotiz, ist es sehr empfehlenswert public function __construct() als Konstruktor in PHP zu verwenden, nicht eine Funktion mit dem gleichen Namen wie die Klasse