1 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
看來(lái)您誤解了錯(cuò)誤報(bào)告的概念。我將嘗試向您闡明一般概念。
錯(cuò)誤報(bào)告是為了通知開(kāi)發(fā)人員錯(cuò)誤的編碼、錯(cuò)誤和其他需要修復(fù)的潛在問(wèn)題。錯(cuò)誤報(bào)告不適用于該產(chǎn)品的用戶(hù)。當(dāng)你在開(kāi)發(fā)時(shí),你可以display_errors為自己?jiǎn)⒂?,但你不?yīng)該將它留在代碼中。但是,您應(yīng)該始終記錄錯(cuò)誤。PHP 有一個(gè)非常好的錯(cuò)誤記錄器,但我能理解它對(duì)您來(lái)說(shuō)可能不夠用,并且您想記錄更多信息和錯(cuò)誤消息。
您可以編寫(xiě)通用錯(cuò)誤處理程序并捕獲應(yīng)用程序拋出的所有錯(cuò)誤和異常,并使用您自己的記錄器軟件將其記錄到服務(wù)器上的安全位置。不要在代碼中間捕獲異常。這樣的記錄器需要是您的應(yīng)用程序的核心,并且在一個(gè)單獨(dú)的文件中,以便能夠捕獲所有錯(cuò)誤。
出于這個(gè)原因,您的 try-catch 不是很有用,因?yàn)槟鷮⑺旁诙鄠€(gè)地方并且它與您的應(yīng)用程序代碼交織在一起。此外,您只捕獲異常并忽略錯(cuò)誤。你應(yīng)該抓住兩者。使用類(lèi)似的東西catch(\Throwable $e)來(lái)捕捉兩者。
@是錯(cuò)誤抑制運(yùn)算符。應(yīng)該不惜一切代價(jià)避免它。如果你不能避免它,那么你需要重寫(xiě)代碼來(lái)避免它。你在那里用 mysqli 連接做什么你實(shí)際上忽略了錯(cuò)誤兩次。首先,您使用@然后殺死您的腳本。不要?dú)⑺滥_本。不要沉默錯(cuò)誤。讓你的錯(cuò)誤冒出來(lái),讓它們被你的錯(cuò)誤處理程序捕獲。
如果你仔細(xì)想想,你的課ConnectDB是很沒(méi)用的。要連接到數(shù)據(jù)庫(kù),您始終需要相同的 3 行。mysqli 已經(jīng)是一個(gè)類(lèi),所以在另一個(gè)類(lèi)中包裝 3 行是沒(méi)有意義的。正確的代碼應(yīng)該無(wú)外乎:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli(DB_HOST, DB_USERRW, DB_PASSWRW, DB_DBASE);
$conn->set_charset('utf8mb4');
當(dāng) mysqli 無(wú)法連接時(shí),您當(dāng)前的腳本會(huì)退出,但即使您沒(méi)有消除錯(cuò)誤并且打開(kāi)了錯(cuò)誤報(bào)告,變量也不可能為空。if(!$this->db)成為另一個(gè)謬誤。此外,當(dāng)您剛剛將一個(gè)異常靜音時(shí),為什么要拋出異常?這讓我想到了另一點(diǎn)。為什么在立即捕獲時(shí)拋出異常?當(dāng)然,整個(gè)邏輯無(wú)非就是一個(gè)簡(jiǎn)單的 if 語(yǔ)句:
if(!$this->db) {
$this->messager->erroutput([' Database connection is currently unavailable.']);
}
我看到你已經(jīng)命名了你的類(lèi)MessageOut,我真的希望你不要將錯(cuò)誤消息暴露給用戶(hù)。這不僅是糟糕的用戶(hù)體驗(yàn),而且還有安全風(fēng)險(xiǎn)。您應(yīng)該改為實(shí)現(xiàn)一個(gè)漂亮的 HTTP 500 錯(cuò)誤頁(yè)面,或者如果您的應(yīng)用程序足夠復(fù)雜,您自己的錯(cuò)誤頁(yè)面將在您的錯(cuò)誤處理程序捕獲到錯(cuò)誤時(shí)顯示。
一旦發(fā)現(xiàn)錯(cuò)誤就關(guān)閉 mysqli 錯(cuò)誤報(bào)告是沒(méi)有用的。mysqli_report(MYSQLI_REPORT_OFF);只需從您的代碼中刪除。
要形象化我所描述的內(nèi)容,請(qǐng)考慮以下代碼:
<?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.
}
它不是完美的代碼,因?yàn)殄e(cuò)誤處理程序不在那里,它也應(yīng)該在一個(gè)單獨(dú)的文件中,但總體思路是避免應(yīng)用程序邏輯中不必要的代碼。不要嘗試捕捉。不要消除錯(cuò)誤,也不要添加無(wú)用的代碼。把事情簡(jiǎn)單化。
- 1 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)