@papaja hat den Nagel auf den Kopf getroffen. Ihre PDO-Verbindung ist fehlgeschlagen, daher haben Sie kein PDO-Objekt, auf dem Sie die Methode „prepare“ ausführen können.
Aus dem Kopf heraus denke ich, dass Sie das Endanführungszeichen in der $dsn-Zeichenfolge vermissen. Sie möchten wahrscheinlich Folgendes nach $this->dbname und vor dem Semikolon hinzufügen:
. "'"
Das ist ein einfaches Anführungszeichen, das in doppelte Anführungszeichen eingeschlossen ist. Ich verwende die folgende Syntax, um die DSN-Zeichenfolge zu erstellen:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
Erstellen Sie auf jeden Fall eine Testdatei, damit Sie genau wissen, wo das Problem liegt. Die Testdatei sollte folgendermaßen aussehen:
class TestDatabase{
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
private $dbh;
public function __construct(){
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
}
}
Beachten Sie, dass wir die Instanziierung des PDO-Objekts nicht innerhalb eines try-catch-Blocks ausführen. Während Sie es niemals tun würden Wenn Sie dies in der Produktion tun, ist es für Ihren Test nützlich, da es eine schwerwiegende Ausnahme auslöst, die alle Details Ihrer Verbindung enthält.
Instanziieren Sie nun die Testklasse und fahren Sie mit dem Debuggen der erhaltenen Fehler fort. Auch hier sind sie detaillierter als der vorherige Fehler, da es sich um eine nicht abgefangene PDO-Ausnahme handelt.