L'unica cosa che posso vedere qui è che dici a PDO di generare eccezioni dopo hai provato ad aprire la connessione. Molto probabilmente è troppo tardi.
Quello che potresti fare invece, è inviare quell'opzione al costruttore direttamente usando il 4° parametro:
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) {
...
Questo probabilmente risolverà il tuo problema.
Modifica: Se il nome host è fornito dall'utente, è possibile convalidarlo prima di inviarlo al costruttore PDO.
Ad esempio utilizzando:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Funzionerà per i nomi di dominio, localhost
e indirizzi IP.