2011-12-05 99 views
3

當MySQLi,例如,我正在爲mysql_函數做一個自定義的包裝。不可用,並且當它無法連接時,它會拋出異常。然而,致命的錯誤輸出是這樣的:信息太多,PHP錯誤?

Fatal error: Uncaught exception 'Exception' with message 'Failed to connect to database.' in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\MiniTicket\database.php :16

Stack trace:

#0 C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\MiniTicket\database.php (49): MySQL->__construct('localhost', 'miniticket', 'mtu:[email protected]~qR6f9...')
#1 C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\MiniTicket\index.php (3): require_once('C:\Program File...')
#2 {main} thrown in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\MiniTicket\database.php on line 16

正如你看到的,我的數據庫密碼被清楚地顯示給大家看。不好。我不想關閉這些消息,特別是在開發過程中,但我不希望顯示敏感信息。使用set_error_handler也不是一個好的解決方案,因爲我必須解析所有內容,而且這很容易出錯。

因此......有沒有一種簡單的方法可以在錯誤消息中的函數中禁用顯示參數,最好是通過PHP而不是在某些配置文件中?

編輯:禁用除文件名之外的文件路徑也是一種獎勵。

+1

是否捕捉到異常(並且在出現'無法連接到數據庫'時生成自己的錯誤消息)的可能性? – nickb

+0

@nickb:我寧願不這樣做,因爲這個類將無處不在,可以通過不同的方式處理異常。我想我可以用「死」來代替,但它感覺不太乾淨,尤其是在可以恢復錯誤的情況下。 – Ryan

+2

您可以隨時捕獲異常並拋出自己的異常,該異常僅包含原始異常中的'Exception :: getMessage',該異常在其堆棧跟蹤中沒有密碼。 – nickb

回答

1

您應該將生產和開發之間的錯誤處理分開,其中開發顯示錯誤信息,生產顯示一個友好的錯誤消息,但不輸出PHP所做的任何事情。將輸出記錄到文件。

+0

好的,我會試試看。有沒有簡單的方法來轉移消息? – Ryan

+0

@minitech:您可以將所有錯誤轉換爲異常(這會使警告默認爲崩潰),然後使用自定義異常處理程序將它們記錄到文件中。你也可以使用PHP的'error_log'。 – alex

1

編輯php.ini並設定

display_errors = 0 

如果您沒有訪問在你的腳本(S)的頂部爲php.ini,那麼你需要添加:

ini_set("display_errors", "0"); 

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

這將停止所有錯誤被輸出到兄弟wser,應該只能在你的生產系統上完成。確保你仍然在記錄錯誤(通過php.ini設置)。

我不確定爲什麼這不是默認配置,因此這種情況在生產環境中不會發生。

不要將此視爲您的軟件問題的解決方案,但這只是爲了阻止敏感數據向公衆顯示。

請注意,您可能需要重新啓動Apache以使php.ini更改生效。

+0

-1來自OP:**我不想關閉這些消息** – nickb

+0

@nickb請重新閱讀並更新您的評論。我在生產環境中添加了關於這個*的說明。謝謝! – hafichuk

+0

是的,這是發展雖然...這是一個好的解決方案,但我寧願隱藏在開發消息不管。 – Ryan