Jediná věc, kterou zde vidím, je, že říkáte PDO, aby vyvolalo výjimky po pokusili jste se otevřít připojení. To je s největší pravděpodobností příliš pozdě.
Co byste místo toho mohli udělat, je poslat tuto možnost konstruktoru přímo pomocí 4. parametru:
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) {
...
To pravděpodobně vyřeší váš problém.
Upravit: Pokud název hostitele poskytuje uživatel, můžete jej před odesláním do konstruktoru PDO ověřit.
Například pomocí:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
To bude fungovat pro názvy domén, localhost
a IP adresy.