為什麼我在 PHP 中收到「在非物件上呼叫成員函數準備()」錯誤?

Patricia Arquette
發布: 2024-11-25 20:07:12
原創
507 人瀏覽過

Why am I getting a

在PHP 中的非物件錯誤上呼叫成員函數prepare()

在PHP 中,「在非物件錯誤上呼叫成員函數prepare()」當您嘗試對非物件的變數呼叫prepare()方法時,會發生「-object」錯誤。當變數不引用 mysqli 類別的實例或 mysqli 物件尚未正確初始化時,通常會發生這種情況。

理解問題

在您的根據提供的程式碼,當您呼叫 selectInfo() 函數時,$DBH 變數未初始化為 mysqli 類別的物件。這就是您遇到錯誤的原因。要解決此問題,您可以使用以下任一方法:

方法1:使用全域範圍

global $DBH;
function selectInfo($limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
登入後複製

此方法將$DBH 宣告為全域變量,允許您在selectInfo() 函數中存取它。然而,它不被認為是最佳實踐,因為它會導致全域變數污染。

方法 2:將物件作為參數傳遞

function selectInfo($DBH, $limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
selectInfo($DBH, 10, 20);
登入後複製

此方法直接傳遞mysqli 物件作為 selectInfo() 函數的參數。它更加明確,並確保物件正確初始化。

方法 3:使用資料庫輔助函數

function getDBH() {
    static $DBH = null;
    if (is_null($DBH)) {
        $DBH = new mysqli("host", "test", "123456", "dbname");
    }
    return $DBH;
}

function selectInfo($limit, $offset) {
    $DBH = getDBH();
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
登入後複製

此方法使用輔助函數來檢索mysqli 物件並在必要時初始化它。它確保在呼叫 selectInfo() 時該物件始終可用。

方法 4:使用資料庫類別

class Database {
    private $DBH;

    public function __construct($host, $user, $pass, $dbname) {
        $this->DBH = new mysqli($host, $user, $pass, $dbname);
    }

    public function prepare($sql) {
        return $this->DBH->prepare($sql);
    }
}

$db = new Database("host", "test", "123456", "dbname");
$stmt = $db->prepare("SELECT * FROM information LIMIT ?,?");
登入後複製

此方法將資料庫連接封裝在一個班級中。它提供了一種乾淨且結構化的方式來存取和準備語句。

以上是為什麼我在 PHP 中收到「在非物件上呼叫成員函數準備()」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板