2011-10-28 100 views
3

在早期它的一些點出現有太多的SQL連接其次爲回顯篩查的任何人一直在尋找:錯誤,使用PDO連接到mysql的連接太多,顯示我們的db用戶名和密碼?

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08004] [1040] Too many connections' in /dir/file.php:21 
Stack trace: 
#0 /dir/file.php(21): PDO->__construct('mysql:host=loca...', 'the user', 'password') 

正如你可以看到,它打印的用戶名和密碼。

我是新來的PDO連接到數據庫的形式,我進入它,因爲人們告訴我,我的常規mysql_connect形式是不安全的。但是,默認情況下,當mysql_connect有太多的連接時,永遠不會將用戶名和密碼輸出到屏幕上。

真是一場災難。

如果出現錯誤,我該如何停止PDO?

我使用:

$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass); 
+0

你有沒有碰巧圖這一個出來? – hafichuk

+2

我同意這是一個問題,應該提交給PDO團隊。請在出現錯誤時投票隱藏憑據:http://bugs.php.net/bug.php?id=62184 – IMB

+2

好的 - 會的。雖然看起來很奇怪,甚至應該有投票的需要 - 它只是在默認打印用戶名和密碼憑證的錯誤信息荒謬!尤其是當顯然,至少我對PDO的理解是爲了更安全地訪問數據庫!超級失敗。 – willdanceforfun

回答

2

編輯php.ini並設定

display_errors = 0 

如果您沒有訪問到你的腳本的頂部,然後php.ini中(S )您需要添加:

ini_set("display_errors", "0"); 

http://php.net/manual/en/errorfunc.configuration.phphttp://php.net/manual/en/function.error-reporting.php

這將停止輸出到瀏覽器的所有錯誤。確保你仍然在記錄錯誤(通過php.ini設置)。

P.S.不要扔掉PDO

+3

編號例外。 –

+0

@ TomalakGeret'kal我完全同意,但是您仍然想要禁用輸出到瀏覽器作爲預防措施。 – hafichuk

+0

感激不盡!謝謝。 – willdanceforfun

3

PDO沒有做任何事情。

發生這種情況是因爲您沒有執行任何異常處理,因此將調用默認的PHP錯誤處理程序並顯示您的調用堆棧,包括函數參數。

通常調用堆棧是非常好的事情,所以你想讓的錯誤處理程序工作;你只需要正確使用它。

  • 地方try/catch在可能引發異常的代碼周圍的相關位置塊;至少,在代碼的頂層放置一個全面的try/catch塊,以便沒有任何東西可以滲透。

PDO文件,雖然明確指出(在一個紅色警告框)的大風險,你拿不正確捕獲PDO例外:

If your application does not catch the exception thrown from the PDO constructor, the default action taken by the zend engine is to terminate the script and display a back trace. This back trace will likely reveal the full database connection details, including the username and password. It is your responsibility to catch this exception, either explicitly (via a catch statement) or implicitly via set_exception_handler().

http://www.php.net/manual/en/pdo.connections.php

+0

這對我的智能版本是有意義的。現在,如果我可以努力工作,那麼嘗試/抓住什麼。感謝指針! – willdanceforfun

+0

@cosmicbdog:在使用使用它們的庫之前,您絕對需要了解異常情況! –

+0

這也有道理:) – willdanceforfun