केवल एक चीज जो मैं यहां देख सकता हूं, वह यह है कि आप पीडीओ को बाद अपवादों को फेंकने के लिए कहते हैं आपने कनेक्शन खोलने का प्रयास किया है। यह सबसे अधिक संभावना है कि बहुत देर हो चुकी है।
इसके बजाय आप क्या कर सकते हैं, उस विकल्प को सीधे चौथे पैरामीटर का उपयोग करके कंस्ट्रक्टर को भेजें:
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) {
...
इससे शायद आपकी समस्या का समाधान हो जाएगा।
संपादित करें: यदि होस्ट नाम उपयोगकर्ता द्वारा प्रदान किया गया है, तो आप इसे पीडीओ कंस्ट्रक्टर को भेजने से पहले सत्यापित कर सकते हैं।
उदाहरण के लिए उपयोग करना:
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}
यह डोमेन नाम के लिए काम करेगा, localhost
और आईपी पते।