Satu-satunya hal yang dapat saya lihat di sini, adalah Anda memberi tahu PDO untuk membuang pengecualian setelah Anda telah mencoba membuka koneksi. Itu kemungkinan besar sudah terlambat.
Apa yang dapat Anda lakukan sebagai gantinya, adalah mengirim opsi itu ke konstruktor secara langsung menggunakan parameter ke-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) {
...
Itu mungkin akan menyelesaikan masalah Anda.
Sunting: Jika nama host diberikan oleh pengguna, Anda dapat memvalidasinya sebelum mengirimkannya ke konstruktor PDO.
Misalnya menggunakan:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Itu akan berfungsi untuk nama domain, localhost
dan alamat ip.