1 回答

TA貢獻1827條經驗 獲得超8個贊
看來您誤解了錯誤報告的概念。我將嘗試向您闡明一般概念。
錯誤報告是為了通知開發人員錯誤的編碼、錯誤和其他需要修復的潛在問題。錯誤報告不適用于該產品的用戶。當你在開發時,你可以display_errors為自己啟用,但你不應該將它留在代碼中。但是,您應該始終記錄錯誤。PHP 有一個非常好的錯誤記錄器,但我能理解它對您來說可能不夠用,并且您想記錄更多信息和錯誤消息。
您可以編寫通用錯誤處理程序并捕獲應用程序拋出的所有錯誤和異常,并使用您自己的記錄器軟件將其記錄到服務器上的安全位置。不要在代碼中間捕獲異常。這樣的記錄器需要是您的應用程序的核心,并且在一個單獨的文件中,以便能夠捕獲所有錯誤。
出于這個原因,您的 try-catch 不是很有用,因為您將它放在多個地方并且它與您的應用程序代碼交織在一起。此外,您只捕獲異常并忽略錯誤。你應該抓住兩者。使用類似的東西catch(\Throwable $e)來捕捉兩者。
@是錯誤抑制運算符。應該不惜一切代價避免它。如果你不能避免它,那么你需要重寫代碼來避免它。你在那里用 mysqli 連接做什么你實際上忽略了錯誤兩次。首先,您使用@然后殺死您的腳本。不要殺死腳本。不要沉默錯誤。讓你的錯誤冒出來,讓它們被你的錯誤處理程序捕獲。
如果你仔細想想,你的課ConnectDB是很沒用的。要連接到數據庫,您始終需要相同的 3 行。mysqli 已經是一個類,所以在另一個類中包裝 3 行是沒有意義的。正確的代碼應該無外乎:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli(DB_HOST, DB_USERRW, DB_PASSWRW, DB_DBASE);
$conn->set_charset('utf8mb4');
當 mysqli 無法連接時,您當前的腳本會退出,但即使您沒有消除錯誤并且打開了錯誤報告,變量也不可能為空。if(!$this->db)成為另一個謬誤。此外,當您剛剛將一個異常靜音時,為什么要拋出異常?這讓我想到了另一點。為什么在立即捕獲時拋出異常?當然,整個邏輯無非就是一個簡單的 if 語句:
if(!$this->db) {
$this->messager->erroutput([' Database connection is currently unavailable.']);
}
我看到你已經命名了你的類MessageOut,我真的希望你不要將錯誤消息暴露給用戶。這不僅是糟糕的用戶體驗,而且還有安全風險。您應該改為實現一個漂亮的 HTTP 500 錯誤頁面,或者如果您的應用程序足夠復雜,您自己的錯誤頁面將在您的錯誤處理程序捕獲到錯誤時顯示。
一旦發現錯誤就關閉 mysqli 錯誤報告是沒有用的。mysqli_report(MYSQLI_REPORT_OFF);只需從您的代碼中刪除。
要形象化我所描述的內容,請考慮以下代碼:
<?php
// ini_set('display_errors', 1);
ini_set('log_errors', 1);
error_reporting(E_ALL);
class WebApp {
protected $db;
function __construct() {
$this->messager = new MessageOut();
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // it can also be at the top of the script, but it makes more sense to put it together with the rest of mysqli code
$this->db = new \mysqli(DB_HOST, DB_USERRW, DB_PASSWRW, DB_DBASE);
$this->db->set_charset('utf8mb4');
}
public function selectIdata() {
//select data
$query = "SELECT *
FROM thetable";
$stmt = $this->db->prepare($query);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($idata);
$result = [];
while ($stmt->fetch()) {
$result[] = $idata;
}
return $result;
}
}
try {
$app = new \WebApp();
} catch (\Throwable $e) {
// log your errors here.
}
它不是完美的代碼,因為錯誤處理程序不在那里,它也應該在一個單獨的文件中,但總體思路是避免應用程序邏輯中不必要的代碼。不要嘗試捕捉。不要消除錯誤,也不要添加無用的代碼。把事情簡單化。
- 1 回答
- 0 關注
- 133 瀏覽
添加回答
舉報