web-dev-qa-db-ja.com

非オブジェクトのメンバー関数bind_param()の呼び出し

この準備されたステートメントで変数をバインドしようとしていますが、エラーが発生し続けます:

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);
}

ここで関数が完全に記述されていないことは知っていますが、それは問題ではないはずです。このエラーが発生する理由がわかりません。

26
mcbeav

エラーメッセージが示すように、$qSelectはオブジェクトではないようです。準備呼び出しの直後にvar_dump($qSelect);を使用して、これをデバッグしてみてください。 getDBH()が必要なものを返すかどうかも確認します。

準備呼び出しが失敗したように聞こえます(理由はわかりません)。したがって、false-falseはオブジェクトではないので、bind_param()を呼び出すことはできません。

EDIT:情報は与えられていませんが、PHPのPDOを使用しているようです。その場合は、 ドキュメント をご覧ください。

データベースサーバーがステートメントの準備に成功すると、PDO :: prepare()はPDOStatementオブジェクトを返します。データベースサーバーがステートメントを正常に準備できない場合、PDO :: prepare()はFALSEを返すか、エラー処理に応じてPDOExceptionを発行します。

これらのPDO例外を返すようにサーバーを構成する必要があります。これにより、準備呼び出しが失敗する理由がわかります。

24
oezi

prepare()が失敗する理由の1つは、送信されたsqlステートメントが現在のDBで有効でない場合です。

prepare()はfalseを返します。

例-テーブル名が正しくない場合またはクエリ内の1つ以上のフィールドが存在しない

68
Stefan

私も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;
17
fvdz

Prepareはかなり馬鹿げているようです。クエリを完全にMySQL側に依存しているわけではありません。これは、クエリ内に、「user」、「order」などのキーワードと同じ名前のテーブルがある場合です。 、テーブルとしては認識されませんが、キーワードコマンドが実際に実行するものとして認識されるため、クエリは混乱し、準備は失敗します。

これを簡単に修正するには、テーブル名の両側に「 `」を追加して「正しい」方法で入力する必要があります。例:

`user`, `order`, `...`

正しいのですが、この動作を準備するのは馬鹿げています。

2
PHP Hater

PHP私のような経験のない人を助けるためにのみ。

私の場合、SQL構文にエラーがあったため、このエラーが発生しました。コンソールスタックトレースには、この問題は表示されません。

SQLを修正すると、プロセスは正常になりました。

1

データベース内のユーザーの権限を確認してください。 「挿入」権限のないユーザーは、挿入しようとしたときに「非オブジェクトでメンバー関数bind_param()を呼び出す」メッセージエラーも発生します。

1
itsites