Dalam PHP, "Panggilan kepada fungsi ahli prepare() pada bukan -object" berlaku apabila anda cuba memanggil kaedah prepare() pada pembolehubah yang bukan objek. Ini biasanya berlaku apabila pembolehubah tidak merujuk kepada contoh kelas mysqli atau apabila objek mysqli tidak dimulakan dengan betul.
Memahami Isu
Dalam anda kod yang disediakan, pembolehubah $DBH tidak dimulakan sebagai objek kelas mysqli apabila anda memanggil fungsi selectInfo(). Inilah sebabnya anda menghadapi ralat. Untuk menyelesaikan isu ini, anda boleh menggunakan mana-mana pendekatan berikut:
Pendekatan 1: Gunakan Skop Global
global $DBH; function selectInfo($limit, $offset) { $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); }
Pendekatan ini mengisytiharkan $DBH sebagai pembolehubah global , membolehkan anda mengaksesnya dalam fungsi selectInfo(). Walau bagaimanapun, ia tidak dianggap sebagai amalan terbaik kerana ia boleh membawa kepada pencemaran berubah-ubah global.
Pendekatan 2: Lulus Objek sebagai Parameter
function selectInfo($DBH, $limit, $offset) { $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); } selectInfo($DBH, 10, 20);
Pendekatan ini secara langsung melepasi objek mysqli sebagai parameter kepada fungsi selectInfo(). Ia lebih jelas dan memastikan objek dimulakan dengan betul.
Pendekatan 3: Gunakan Fungsi Pembantu Pangkalan Data
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 ?,?"); }
Pendekatan ini menggunakan fungsi pembantu untuk mendapatkan semula objek mysqli dan mulakannya jika perlu. Ia memastikan bahawa objek sentiasa tersedia apabila memanggil selectInfo().
Pendekatan 4: Gunakan Kelas Pangkalan Data
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 ?,?");
Pendekatan ini merangkum sambungan pangkalan data dalam kelas. Ia menyediakan cara yang bersih dan berstruktur untuk mengakses dan menyediakan penyata.
Atas ialah kandungan terperinci Mengapa saya mendapat ralat \'Panggilan kepada Fungsi Ahli menyediakan() pada Bukan Objek\' dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!