@papaja ha colpito nel segno. La tua connessione PDO non è riuscita, quindi non hai un oggetto PDO su cui eseguire il metodo prepare.
In cima alla mia testa, penso che ti manchi la virgoletta finale sulla stringa $dsn. Probabilmente vorrai aggiungere quanto segue dopo $this->dbname e prima del punto e virgola:
. "'"
Questa è una virgoletta singola racchiusa tra virgolette doppie. Uso la seguente sintassi per creare la stringa DSN:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
Ad ogni modo, crea un file di prova in modo da sapere esattamente qual è il problema. Il file di prova dovrebbe assomigliare a questo:
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);
}
}
Si noti che non stiamo eseguendo l'istanza dell'oggetto PDO all'interno di un blocco try catch. Mentre tu mai e poi fallo in produzione, sarà utile per il tuo test perché genererà un'eccezione fatale contenente tutti i dettagli della tua connessione.
Ora istanzia la classe di test e procedi eseguendo il debug degli errori che ricevi. Di nuovo, saranno più dettagliati rispetto all'errore precedente perché sarà un'eccezione PDO non rilevata.