@papaja đánh ngay cái đinh vào đầu. Kết nối PDO của bạn không thành công, do đó bạn không có đối tượng PDO để chạy phương thức chuẩn bị.
Tôi nghĩ bạn đang thiếu dấu ngoặc kép trên chuỗi $ dsn. Bạn có thể muốn thêm phần sau vào sau $ this-> dbname và trước dấu chấm phẩy:
. "'"
Đó là một câu trích dẫn đơn được gói gọn trong dấu ngoặc kép. Tôi sử dụng cú pháp sau để tạo chuỗi DSN:
"mysql:host=$this->HOST;dbname=$this->DATABASE"
Dù sao, hãy tạo một tệp thử nghiệm để bạn biết chính xác vấn đề là gì. Tệp thử nghiệm sẽ giống như sau:
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);
}
}
Lưu ý rằng chúng tôi không chạy quá trình khởi tạo đối tượng PDO trong khối try catch. Trong khi bạn sẽ không bao giờ thực hiện điều đó trong quá trình sản xuất, nó sẽ hữu ích cho thử nghiệm của bạn vì nó sẽ tạo ra một ngoại lệ nghiêm trọng chứa tất cả các chi tiết về kết nối của bạn.
Bây giờ khởi tạo lớp thử nghiệm và tiếp tục bằng cách gỡ lỗi các lỗi bạn nhận được. Một lần nữa, chúng sẽ chi tiết hơn lỗi trước đó vì nó sẽ là một ngoại lệ PDO chưa được ghi nhận.