この準備されたステートメントで変数をバインドしようとしていますが、エラーが発生し続けます:
Call to a member function bind_param() on a non-object
関数が呼び出され、変数が渡されます。変数をエコーするように関数を変更すると、変数はページに正常に印刷されますが、ここにバインドしようとするとエラーが表示されます。誰でも助けることができますか?
//CALL FROM PAGE ONE
check($username);
//FUNCTION ON PAGE 2
function check($username){
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
}
ここで関数が完全に記述されていないことは知っていますが、それは問題ではないはずです。このエラーが発生する理由がわかりません。
エラーメッセージが示すように、$qSelect
はオブジェクトではないようです。準備呼び出しの直後にvar_dump($qSelect);
を使用して、これをデバッグしてみてください。 getDBH()
が必要なものを返すかどうかも確認します。
準備呼び出しが失敗したように聞こえます(理由はわかりません)。したがって、false
-false
はオブジェクトではないので、bind_param()
を呼び出すことはできません。
EDIT:情報は与えられていませんが、PHPのPDOを使用しているようです。その場合は、 ドキュメント をご覧ください。
データベースサーバーがステートメントの準備に成功すると、PDO :: prepare()はPDOStatementオブジェクトを返します。データベースサーバーがステートメントを正常に準備できない場合、PDO :: prepare()はFALSEを返すか、エラー処理に応じてPDOExceptionを発行します。
これらのPDO例外を返すようにサーバーを構成する必要があります。これにより、準備呼び出しが失敗する理由がわかります。
prepare()
が失敗する理由の1つは、送信されたsqlステートメントが現在のDBで有効でない場合です。
prepare()
はfalseを返します。
例-テーブル名が正しくない場合またはクエリ内の1つ以上のフィールドが存在しない。
私もmysqliアプローチを使用しており、最初のインスタンスを閉じる前にmysqliの別のインスタンスを作成したときに同じエラーが発生しました。したがって、同じコードを開始する前にclose()
を使用することが重要です。例えば:
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
$qSelect->close(); // <--- use close before calling the same function( wich contains $DBH code) again;
Prepareはかなり馬鹿げているようです。クエリを完全にMySQL側に依存しているわけではありません。これは、クエリ内に、「user」、「order」などのキーワードと同じ名前のテーブルがある場合です。 、テーブルとしては認識されませんが、キーワードコマンドが実際に実行するものとして認識されるため、クエリは混乱し、準備は失敗します。
これを簡単に修正するには、テーブル名の両側に「 `」を追加して「正しい」方法で入力する必要があります。例:
`user`, `order`, `...`
正しいのですが、この動作を準備するのは馬鹿げています。
PHP私のような経験のない人を助けるためにのみ。
私の場合、SQL構文にエラーがあったため、このエラーが発生しました。コンソールスタックトレースには、この問題は表示されません。
SQLを修正すると、プロセスは正常になりました。
データベース内のユーザーの権限を確認してください。 「挿入」権限のないユーザーは、挿入しようとしたときに「非オブジェクトでメンバー関数bind_param()を呼び出す」メッセージエラーも発生します。