Điều duy nhất tôi có thể thấy ở đây, là bạn yêu cầu PDO ném ngoại lệ sau bạn đã cố gắng mở kết nối. Điều đó rất có thể là quá muộn.
Thay vào đó, những gì bạn có thể làm là gửi trực tiếp tùy chọn đó đến hàm tạo bằng cách sử dụng tham số thứ 4:
try {
$opts = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname,
$dbuser, $dbpasswd, $opts);
} catch(PDOException $e) {
...
Điều đó có thể sẽ giải quyết được vấn đề của bạn.
Chỉnh sửa: Nếu tên máy chủ do người dùng cung cấp, bạn có thể xác thực nó trước khi gửi đến phương thức khởi tạo PDO.
Ví dụ:sử dụng:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Điều đó sẽ hoạt động đối với tên miền, localhost
và địa chỉ ip.