@papaja träffade spiken i huvudet. Din PDO-anslutning misslyckades, så du har inget PDO-objekt att köra prepareringsmetoden på.
På toppen av mitt huvud tror jag att du saknar slutcitatet på $dsn-strängen. Du vill förmodligen lägga till följande efter $this->dbname och före semikolon:
. "'"
Det är ett enda citat insvept i dubbla citattecken. Jag använder följande syntax för att skapa DSN-strängen:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
Hur som helst, skapa en testfil så att du vet exakt vad problemet är. Testfilen ska se ut så här:
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);
}
}
Observera att vi inte kör instansieringen av PDO-objektet i ett försöksfångstblock. Medan du skulle aldrig någonsin gör det i produktionen, kommer det att vara användbart för ditt test eftersom det kommer att skapa ett ödesdigert undantag som innehåller alla detaljer om din anslutning.
Instantiera nu testklassen och fortsätt genom att felsöka de fel du får. Återigen kommer de att vara mer detaljerade än det tidigare felet eftersom det kommer att vara ett oupptäckt PDO-undantag.