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
Warum verpacken Sie PDO am Anfang? – PeeHaa
* "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
'$ 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. –