Det eneste jeg kan se her, er at du fortæller PDO at smide undtagelser efter du har forsøgt at åbne forbindelsen. Det er højst sandsynligt for sent.
Hvad du kunne gøre i stedet, er at sende denne mulighed til konstruktøren direkte ved at bruge den 4. 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) {
...
Det vil sandsynligvis løse dit problem.
Rediger: Hvis værtsnavnet er angivet af brugeren, kan du validere det, før du sender det til PDO-konstruktøren.
For eksempel ved at bruge:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Det vil fungere for domænenavne, localhost
og ip-adresser.