Единственото нещо, което виждам тук, е, че казвате на PDO да хвърля изключения след сте се опитали да отворите връзката. Най-вероятно е твърде късно.
Това, което бихте могли да направите вместо това, е да изпратите тази опция директно на конструктора, като използвате 4-тия параметър:
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) {
...
Това вероятно ще реши проблема ви.
Редактиране: Ако името на хоста е предоставено от потребителя, можете да го потвърдите, преди да го изпратите до конструктора на PDO.
Например с помощта на:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Това ще работи за имена на домейни, localhost
и IP адреси.