在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中文網其他相關文章!