Het enige dat ik hier kan zien, is dat je PDO vertelt om uitzonderingen na . te gooien u hebt geprobeerd de verbinding te openen. Dat is waarschijnlijk te laat.
Wat je in plaats daarvan zou kunnen doen, is die optie rechtstreeks naar de constructor sturen met behulp van de 4e parameter:
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) {
...
Dat zal waarschijnlijk je probleem oplossen.
Bewerken: Als de hostnaam door de gebruiker is opgegeven, kunt u deze valideren voordat u deze naar de PDO-constructor stuurt.
Gebruik bijvoorbeeld:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Dat werkt voor domeinnamen, localhost
en ip-adressen.