@papaja kena paku tepat di kepala. Sambungan PDO Anda gagal, sehingga Anda tidak memiliki objek PDO untuk menjalankan metode persiapan.
Dari atas kepala saya, saya pikir Anda melewatkan kutipan akhir pada string $dsn. Anda mungkin ingin menambahkan yang berikut ini setelah $this->dbname dan sebelum titik koma:
. "'"
Itu adalah kutipan tunggal yang dibungkus dengan tanda kutip ganda. Saya menggunakan sintaks berikut untuk membuat string DSN:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
Bagaimanapun, buat file uji sehingga Anda tahu persis apa masalahnya. File pengujian akan terlihat seperti ini:
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);
}
}
Perhatikan bahwa kita tidak menjalankan instantiasi objek PDO dalam blok try catch. Meskipun Anda tidak akan pernah lakukan itu dalam produksi, ini akan berguna untuk pengujian Anda karena akan mengeluarkan pengecualian fatal yang berisi semua detail koneksi Anda.
Sekarang buat instance kelas pengujian dan lanjutkan dengan men-debug kesalahan yang Anda terima. Sekali lagi, mereka akan lebih detail daripada kesalahan sebelumnya karena itu akan menjadi pengecualian PDO yang tidak tertangkap.