@papaja trafiła prosto w gwóźdź w głowę. Twoje połączenie PDO nie powiodło się, dlatego nie masz obiektu PDO, na którym można uruchomić metodę przygotowania.
Poza czubkiem głowy, myślę, że brakuje ci końcowego cytatu w łańcuchu $dsn. Prawdopodobnie chcesz dodać następujące po $this->dbname i przed średnikiem:
. "'"
To pojedynczy cytat w podwójnych cudzysłowach. Używam następującej składni do tworzenia ciągu DSN:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
W każdym razie utwórz plik testowy, aby dokładnie wiedzieć, na czym polega problem. Plik testowy powinien wyglądać tak:
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);
}
}
Zauważ, że nie uruchamiamy instancji obiektu PDO w bloku try catch. Chociaż nigdy zrób to w środowisku produkcyjnym, będzie to przydatne w twoim teście, ponieważ wyrzuci krytyczny wyjątek zawierający wszystkie szczegóły twojego połączenia.
Teraz stwórz wystąpienie klasy testowej i przejdź do debugowania otrzymanych błędów. Ponownie, będą one bardziej szczegółowe niż poprzedni błąd, ponieważ będzie to niewyłapany wyjątek PDO.