Jedyne, co widzę tutaj, to to, że mówisz PDO, aby rzucał wyjątki po próbowałeś otworzyć połączenie. To najprawdopodobniej za późno.
Zamiast tego możesz wysłać tę opcję bezpośrednio do konstruktora za pomocą czwartego 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 prawdopodobnie rozwiąże Twój problem.
Edytuj: Jeśli nazwa hosta została podana przez użytkownika, możesz ją zweryfikować przed wysłaniem do konstruktora PDO.
Na przykład używając:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
To zadziała dla nazw domen, localhost
i adresy IP.