ローカル/開発環境では、MySQLiクエリは正常に実行されています。ただし、Webホスト環境にアップロードすると、次のエラーが表示されます。
致命的なエラー:の非オブジェクトのメンバー関数bind_param()の呼び出し...
コードは次のとおりです。
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
クエリを確認するために、コントロールパネルphpMyAdminでクエリを実行しようとしましたが、結果はOKです。
クエリが失敗し、その理由がわからない場合があります。したがって、PHPおよびmysqliを設定して、すべてのエラーを報告することが非常に重要です。
まず、MySQLiが環境にallで接続する前に、常に次の行を用意します。
_mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
_
その後、すべてのMySQLエラーがPHP例外に転送されます。捕捉されなかった例外は、PHP致命的なエラーになります。したがって、MySQLエラーの場合、従来のPHPエラーが発生します。これにより、エラーの原因がすぐにわかります。スタックトレースを使用すると、エラーが発生した正確な場所に移動できます。
PHPエラー報告 に関する私の記事の要点は次のとおりです。
一般的なPHPエラーを確認できる必要があることに注意してください。そして、実際にはさまざまな環境の問題があります:
対応する構成オプションを次の値に設定する必要があります
開発サーバー上
error_reporting
_は_E_ALL
_値に設定する必要があります。display_errors
_は1に設定する必要があります実動サーバー上
error_reporting
_は_E_ALL
_値に設定する必要があります。display_errors
_は0に設定する必要がありますlog_errors
_は1に設定する必要がありますエラーを手動でチェックするコード、すべてのor die()
、if ($result)
などを削除するだけです。データベースインタラクションコードをすぐに記述してください
_$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
_
繰り返しますが、周りの条件なし。エラーが発生した場合、コード内の他のエラーとして扱われます。たとえば、開発用PCでは、画面に表示されるだけです。また、ライブサイトにはエラーラッパーが必要ですが、これは別の話であり、mysqliとそのエラーにはまったく関係ありません。
エラーメッセージを取得したら、それを読んで理解する必要があります。当たり前のように聞こえますが、学習者はしばしばエラーメッセージの極端な有用性を見落とします。それでも、ほとんどの場合、問題は非常に簡単です。特定のテーブルが存在しないと言われている場合、スペル、タイプミス、大文字と小文字、資格などを確認する必要があります。または、SQL構文にエラーがあると表示されている場合は、SQLを調べる必要があります。また、問題箇所は、エラーメッセージで引用されているクエリ部分の直前です。
エラーメッセージもtrustする必要があります。トークンの数がバインドされた変数の数と一致しないと言われた場合、そうです。同じことは、存在しないテーブルまたは列についても言えます。あなた自身の間違いであろうとエラーメッセージが間違っていようと、選択を考えると、常に前者に固執してください。繰り返しになりますが、このサイトでは何百もの質問がこのアドバイスが非常に役立つことを証明しています。
@
_)を使用しますdie()
またはecho
またはその他の関数を使用して、エラーメッセージを無条件で画面に出力します。 PHPは既に問題なくエコーできるため、支援は必要ありません。if($result)
など)のは意味がありません。クエリが失敗し、既にエラー例外が発生するか、問題がなく、テストするものがありません。オブジェクトを作成したとは思わない。
$ mysqli = new mysqli( 'localhost'、 'my_user'、 'my_password'、 'world');
代わりにPDOを使用することをお勧めします。