2013-08-28 5 views
9

मैं अपने होस्टिंग (मेजबान मार्ग पर यह महत्वपूर्ण है) पर एक नई साइट स्थापित करने की कोशिश कर रहा हूं, लेकिन जब मैं पीडीओ (पहली पीडीओ साइट आईएम कोशिश कर रहा हूं) का उपयोग करने की कोशिश करता हूं तो मुझे यह त्रुटि मिलती है। :PHP पीडीओ: कनेक्ट करने में असमर्थ, अमान्य कैटलॉग नाम

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36 

जब मैं इन सेटिंग्स का उपयोग:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

.... 

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1'); 

कैसे डेटाबेस खर्च की गई थी:

enter image description here

मैं अपने अन्य उप डोमेन/मुख्य साइट पर mysqli कनेक्ट जुर्माना का उपयोग करने में सक्षम हूं, लेकिन मुझे बस काम करने के लिए पीडीओ नहीं मिल रहा है।

मैं इस, जो मैं चारों ओर देखा है की कोशिश की है:

$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1'); 

लेकिन यह एक सिंटैक्स त्रुटि retuns।

किसी को भी यह पता है कि इसका क्या कारण हो सकता है?


यह सब मेरे स्थानीय सर्वर पर काम कर रहा है, कनेक्ट लाइन से अलग अपलोड पर कुछ भी नहीं बदला है।

+0

कौन सी लाइन 36 है? – Mike

+0

नया पीडीओ ("mysql: host = 91.146.107.11 – Mihai

+0

@ माइक इसके ऊपर दिखाए गए प्रश्न के लिए $ stmt-> execute(); –

उत्तर

11

बजाय:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

प्रयास करें:

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

और यह सबसे अधिक संभावना अपने स्थानीय सर्वर पर काम करता है (मेजबान = जोड़ें), क्योंकि आप mysql:localhost... या mysql:127.0.0.1... है वहां और इसे अनदेखा किया गया है (क्योंकि यह होस्ट = भी गुम है) और डिफ़ॉल्ट रूप से यह स्थानीयहोस्ट है।

+0

संपादित करें: यह ठीक है, धन्यवाद। –

1

PDO manual page से, आप देख सकते हैं कि आपको try/catch ब्लॉक में कनेक्शन को लपेटने की आवश्यकता है। इस तरह अगर कनेक्शन के साथ कुछ गलत हो जाता है, तो यह आपको बताएगा। कुछ इस तरह:

try { 
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 

    // Then actually do something about the error 
    logError($e->getMessage(), __FILE__, __LINE__); 
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__); 
    // etc. 
    die(); // Comment this out if you want the script to continue execution 
} 

कारण आपको यह त्रुटि हो रही है अपने कनेक्शन के साथ एक त्रुटि है, क्योंकि, लेकिन जब से तुम को रोकने के लिए अपनी स्क्रिप्ट नहीं बताया, यदि ऐसा नहीं होता है। उत्पादित त्रुटि संदेश को देखें, और इसे ठीक करने के तरीके को स्पष्ट किया जाना चाहिए। ऐसा लगता है कि माइकल प्रजसन का जवाब सही है कि आप "मेजबान" स्थापित नहीं कर रहे हैं।

संपादित करें:

यह पता चला है के रूप में, पीडीओ नहीं शिकायत आप पीडीओ कनेक्शन DSN हिस्सा (कम से कम यूनिक्स पर) में host या dbname को छोड़ दें। मैंने इसका परीक्षण किया और इसे खाली छोड़कर इसे "लोकलहोस्ट" में डिफॉल्ट कर दिया जाएगा और इसलिए मैं पूरी तरह से स्थानीयहोस्ट कनेक्शन के लिए इसे पूरी तरह से ठीक से कनेक्ट करने में सक्षम था, जो यह बताएगा कि यह आपके स्थानीय सर्वर पर क्यों काम करता है लेकिन आपके उत्पादन सर्वर पर नहीं। वास्तव में, यह पूरी तरह से इस तरह डेटाबेस इंजन के अलावा DSN में बिल्कुल कुछ भी नहीं की आपूर्ति कनेक्ट करने के लिए संभव है:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************"); 

केवल समस्या यह है कि यह तो एक डेटाबेस का उपयोग करने के लिए एक डेटाबेस का उपयोग नहीं किया जाएगा, है, बस करो:

if ($dbh->query("USE kennyi81_gamersite") === false)) { 
    // Handle the error 
} 

हालांकि उस के साथ कहा, मैं अपने संदेह कि आप वास्तव में एक try/catch ब्लॉक (के रूप में आप अपनी टिप्पणी में उल्लेख) का उपयोग कर जब तक आप किसी भी तरह वैध डेटाबेस क्रेडेंशियल प्रदान कर जोड़ने की कोशिश की है। इस तरह से ऐसा करने का एकमात्र तरीका किसी भी प्रकार की त्रुटि उत्पन्न नहीं करता है यदि आप वास्तव में सही ढंग से कनेक्ट होते हैं और डेटाबेस kennyi81_gamersite का चयन करते हैं।यदि नहीं, तो आपने इस तरह का एक संदेश देखा होगा:

डेटाबेस से कनेक्ट करने में असमर्थ। "Mysql" ने कहा: SQLSTATE [28000] [1045] पहुँच उपयोगकर्ता 'kennyi81_gamer' @ 'स्थानीय होस्ट' के लिए इनकार किया (पासवर्ड का उपयोग: हाँ)

सारांश में, अगर आप चाहते हैं हमेशा एक try/catch ब्लॉक में अपने कनेक्शन लपेट कनेक्शन के दौरान त्रुटियों को खोजने के लिए। बस सुनिश्चित करें कि PDOException के getMessage() को फिर से फेंकना (और पकड़ना) नहीं है या आप अपने लॉगिन प्रमाण-पत्रों का पर्दाफाश कर सकते हैं।

+0

मैंने कोशिश की लेकिन मुझे पहले से ही मिला कोई भी संदेश दिखाई नहीं दिया। –

+0

@ TristanCunningham मेरा संपादन देखें – Mike

+1

बिना किसी अपवाद को छोड़कर * आपको बताएगा * साथ ही साथ एक घातक त्रुटि को ट्रिगर भी करेगा, इस प्रकार आगे निष्पादन को रोक देगा। डेवलपर्स को अपवादों को पकड़ने और केवल संदेश को मुद्रित करने की सलाह देने का यह रुझान PHP का अगला दौर भयानक प्रतीत होता है सलाह – Phil

संबंधित मुद्दे