2013-09-30 72 views
-1

我有一些代碼允許用戶在其服務器上輸入其數據庫的詳細信息。提交詳細信息後,代碼將檢查與數據庫的連接以查看是否輸入了有效的詳細信息。我希望它給的變量是真,如果連接任何工作或做,這樣的結果:Mysqli連接警告顯示連接詳細信息是否有問題

$mysqli = new mysqli($_POST['dbHost'],$_POST['dbUser'],$_POST['dbPassword'],$_POST['dbName']); 
if ($mysqli->connect_errno) { $badDetails = true; } 
else { goodDetails = true; } 

問題是,如果細節確實是不正確,它顯示了從代碼的第一行PHP警告以上給'未知的MySQL服務器主機'。

這是怎麼回事?我不希望PHP拋出它自己的可見錯誤,我想自己處理這個錯誤。

回答

2

你不應該擔心視覺誤差。在生產環境中,這些應該在ini中關閉,並且所有錯誤都應該記錄到服務器上,而不是僅顯示在屏幕上。

這是配置了display_errors設置和error_reporting()

許多框架覆蓋了自定義實現PHP的錯誤處理程序在一個漂亮的方式來顯示錯誤,根據其嚴重程度。
要做到這一點,你可以override the PHP error handler

As seen in the manual一個可用於常規的錯誤和異常註冊自定義處理程序。並且還可以觸發用戶定義的錯誤。

+0

啊,這是有道理的!謝謝,我會確保在我把所有活着的時候關閉這些erorrs。 – Coop

0

只需使用一個die()

$mysqli = new mysqli($_POST['dbHost'],$_POST['dbUser'],$_POST['dbPassword'],$_POST['dbName']) or die("Database Connection Failed"); 
+0

這似乎合乎邏輯,但似乎並沒有爲我工作。例如,當用戶爲數據庫主機放入'asd'時,它會拋出以下錯誤:警告:mysqli :: mysqli()[mysqli.mysqli] :(HY000/2005):未知的MySQL服務器主機'asd' – Coop

0

快速,骯髒的方法是錯誤supression:

$con = @mysqli_connect(/* info */); 

注意,你不應該保留這裏面,因爲這將抑制所有錯誤,和mysqli可能有多個你可能需要知道的錯誤。

雖然我會首先檢查主機變量,看看爲什麼會導致錯誤。你也可以使用die。

$con = mysqli_connect(/* info */) or die ("SQL Error!"); 

至於到哪裏尋找,嘗試看到主機VAR實際上是設置並檢查它的值:

if (!isset($_POST['dbHost'])) { 
    echo "Host var not set!"; 
} else { 
    echo "Host var set: " . $_POST['dbHost'] 
} 
+0

'錯誤抑制是一種不好的做法,特別是對於這種類型的錯誤。 – NDM

+0

@NDM這就是爲什麼我說這是一個快速骯髒的解決方案:)。如果你不處理這個錯誤,那真的只會是一個壞習慣,儘管對於mysqli我想它肯定會糟糕很多,因爲可能發生很多錯誤。我會添加關於它的警告。 – Rogue

+0

感謝您的回覆,但我仍然卡住了。我不想壓制所有的錯誤,所以你的第一個選擇是不行。使用die()似乎不會停止顯示數據庫細節是否錯誤的警告。至於你的第三位代碼,肯定會爲主機輸入一個字符串,因爲在用戶放入數據庫信息的表單上有驗證。 – Coop