Det enda jag kan se här är att du säger åt PDO att kasta undantag efter du har försökt öppna anslutningen. Det är troligen för sent.
Vad du kan göra istället är att skicka det alternativet till konstruktören direkt med den fjärde parametern:
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) {
...
Det kommer förmodligen att lösa ditt problem.
Redigera: Om värdnamnet tillhandahålls av användaren kan du validera det innan du skickar det till PDO-konstruktorn.
Använd till exempel:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Det kommer att fungera för domännamn, localhost
och ip-adresser.