2010-12-20 19 views
23

私は、このプリペアドステートメントに変数をバインドしようとしていますが、私はエラー受け続ける:関数が呼び出されコール

Call to a member function bind_param() on a non-object 

を、変数でありますそれに渡された。変数をエコーするように関数を変更すると、変数はページ上に表示されますが、ここでバインドしようとするとエラーが発生します。誰も助けることができますか?

私はこの機能が完全にここに書かれていないことは知っていますが、それは問題ではありません。私はなぜこのエラーを受けているのか分かりません。

+3

'var_dump($ qSelect)'は、それがあなたが思っているものかどうかをチェックします。 – Mchl

答えて

23

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

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

EDIT:あなたは情報を与えられていませんが、PHPのPDOを使用しているようです。その場合は、the documentationをご覧ください。

If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare() returns FALSE or emits PDOException (depending on error handling).

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

if the sql statement sent to it is not valid in the current DB. 

準備()はfalseを返します -

+0

えええええええええええええええええええええええええええええええええええええええええん、 – mcbeav

+0

mysqli – mcbeav

+0

Hmを使用しています。私は実際に同じ機能を持つという状況にあった。私はフィールドを追加するためにコピーして貼り付けていました。しかし、私は新しい分野の前にコンマを忘れてしまった!愚かな間違いですが、それはちょうどそれがちょうどあなたの部分の入力ミスかもしれないことを示すために行く。 –

67

まあ、一つの理由は、()が失敗することができますがある準備

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

+0

完璧な情報です。 – ripa

+0

ありがとうございました!それは私をたくさん助けました。 :) – dotslash

17

私は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; 
+0

もし彼が何度もこのような関数を使用していたら、close()の代わりにreset()を使い、funcionの外でprepare()をコンストラクタに移すべきです。 $ this-> qSelect。 – qdinar

2

準備がかなりばかげているようです。これは、MySQLの側面に完全にクエリを依存していません、これは、つまり、あなたのクエリでは、キーワードの同じ名前を持つことが起こるテーブルを持っている場合は、 "ユーザー"、 "注文" ...単にテーブルとして認識するのではなく、キーワードコマンドが実際に行うことと同じように、クエリが混乱していて準備が失敗するだけです。

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

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

これは間違いないが、私はそれがこの動作を行う準備から愚かであることがわかります。

1

データベース内のユーザーのアクセス許可を確認します。 「挿入」権限がないユーザーは、挿入しようとしたときに「オブジェクト以外のオブジェクトのbind_param()呼び出し」エラーも発生します。

1

PHPのような経験がない人を私のように助けようと試みるためだけです。

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

私はSQLを修正したときに問題は解決しました。