第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

PHP 不在類(lèi)中拋出指定的錯(cuò)誤消息

PHP 不在類(lèi)中拋出指定的錯(cuò)誤消息

PHP
富國(guó)滬深 2023-03-26 14:26:10
我有三個(gè)類(lèi),每個(gè)類(lèi)在連接到我的數(shù)據(jù)庫(kù)時(shí)處理不同的功能。具有處理連接名稱(chēng)的 1 類(lèi);帶名稱(chēng)的類(lèi) 2通過(guò)向用戶(hù) UI提供錯(cuò)誤和成功消息,帶名稱(chēng)的類(lèi) 3使用 MySqli 連接從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)并將其傳遞給 UI。 這和我平時(shí)做數(shù)據(jù)庫(kù)連接、收集和展示的方式不一樣。通常我只是在三個(gè)文件中創(chuàng)建了很多函數(shù),并在需要時(shí)調(diào)用它們。但是我的網(wǎng)站越來(lái)越大,越來(lái)越復(fù)雜,所以我正在重新組織一切。 我當(dāng)前的問(wèn)題是,當(dāng)我在第 3 堂課中創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),它沒(méi)有拋出我編寫(xiě)的錯(cuò)誤。ConnectDB()MySqli()MessageOut()$_SESSION['message']WebApp()class ConnectDB {    //Connecting to database    public function connect() {        //connecting to mysql        @$conn = new mysqli(DB_HOST, DB_USERRW, DB_PASSWRW, DB_DBASE);        // check validity of database connection        if (mysqli_connect_errno()) {            return false;            exit();        }        // select the database to use        return $conn;    }}ini_set('display_errors', 1);     ini_set('log_errors',1);     error_reporting(E_ALL);     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);class WebApp {    protected $db;    function __construct(){        $this->connector = new ConnectDB();        $this->messager = new MessageOut();        try {            $this->db = $this->connector->connect();            if(!$this->db) {                throw new Exception(' Database connection is currently unavailable.');            }        } catch (Exception $e) {            mysqli_report(MYSQLI_REPORT_OFF);            $errors = array();            $message = $e->getMessage();            //populate array with message and divert output to error class functions            array_push($errors, $message);            $this->messager->erroutput($errors);        }    }}我將我的 localhost 定義的密碼更改為錯(cuò)誤的密碼并加載了文件,但是即使錯(cuò)誤被抑制,錯(cuò)誤也會(huì)在我的第一堂課的第 10 行給出。這個(gè)想法是在使用之前檢查連接。我如何在我的第 3 堂課中得到拋出的錯(cuò)誤,給我“數(shù)據(jù)庫(kù)連接當(dāng)前不可用”。信息?編輯所以我重新評(píng)估了我所做的并try-catch在constructor我的第三節(jié)課中設(shè)置了一個(gè)塊,但我知道我得到了一個(gè)錯(cuò)誤:Fatal error: Uncaught Error: Call to a member function prepare() on null in第 41 行的第三節(jié)課使用了數(shù)據(jù)庫(kù)連接。
查看完整描述

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)單化。


查看完整回答
反對(duì) 回復(fù) 2023-03-26
  • 1 回答
  • 0 關(guān)注
  • 130 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)