PHP では、「非オブジェクトでのメンバー関数 prepare() の呼び出し」 -object」エラーは、オブジェクトではない変数に対して prepare() メソッドを呼び出そうとすると発生します。これは通常、変数が 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 ?,?");
このアプローチでは、データベース接続が 1 つのオブジェクト内にカプセル化されます。クラス。これは、ステートメントにアクセスして準備するためのクリーンで構造化された方法を提供します。
以上がPHP で「非オブジェクトのメンバー関数 prepare() の呼び出し」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。