Das einzige, was ich hier sehen kann, ist, dass Sie PDO anweisen, Ausnahmen nach zu werfen Sie haben versucht, die Verbindung zu öffnen. Das ist höchstwahrscheinlich zu spät.
Was Sie stattdessen tun könnten, ist, diese Option direkt mit dem 4. Parameter an den Konstruktor zu senden:
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) {
...
Das wird wahrscheinlich Ihr Problem lösen.
Bearbeiten: Wenn der Hostname vom Benutzer bereitgestellt wird, können Sie ihn validieren, bevor Sie ihn an den PDO-Konstruktor senden.
Zum Beispiel mit:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
Das funktioniert für Domainnamen, localhost
und IP-Adressen.