2013-08-28 117 views
9

我想在我的主機上設置一個新的站點(主機路由,如果它很重要)但我不斷收到此錯誤,當我嘗試使用PDO(第一個PDO站點即時嘗試) :PHP PDO:無法連接,目錄名稱無效

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連接,但我無法獲得PDO的工作。

我試過這個,這是我看到周圍:

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

但retuns語法錯誤。

任何人有任何想法可能會導致此?


這是所有在我的本地服務器上工作,除了連接線上沒有任何更改上傳。

+0

哪一行是36? – Mike

+0

新的PDO(「mysql:host = 91.146.107.11 – Mihai

+0

@Mike其中$ 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...在那裏,它被忽略了(導致它丟失了主機=以及),默認情況下它是localhost。

+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 
} 

您收到此錯誤的原因是因爲有您的網絡連接錯誤,而是因爲你不知道你的腳本停止,事實並非如此。看看產生的錯誤信息,以及如何解決它應該是明顯的。看起來,邁克爾·普拉斯納的答案是正確的,因爲你沒有設置「主持人」。

編輯:

事實證明,PDO 抱怨,如果你離開了你的hostdbname在PDO連接DSN一部分(至少在Unix上)。我對它進行了測試並將其保留爲空,並將其默認爲「本地主機」,因此我能夠完全連接,完全保留本地主機連接,這可以解釋爲什麼它在本地服務器上運行,但不在生產服務器上運行。事實上,這是完全有可能的連接提供除了像這樣的數據庫引擎在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] 訪問(使用密碼:YES)拒絕用戶kennyi81_gamer'@ 'localhost' 的

總之,如果你想一直包裹在try/catch塊的連接在連接過程中發現錯誤。只要確保不要重新投擲(而不是捕獲)PDOExceptiongetMessage()或者您可以公開您的登錄憑證。

+0

我試過了,但沒有任何消息出現,除了我已經有的 –

+0

@ TristanCunningham查看我的編輯 – Mike

+1

保留一個未被捕獲的異常也會*告訴你*並觸發一個致命錯誤,從而阻止進一步執行。這種建議開發人員捕獲異常並僅打印出消息的趨勢似乎是PHP的下一輪可怕建議 – Phil