web-dev-qa-db-ja.com

さまざまな環境でMySQLiエラー情報を取得する方法は? / mysqli_fetch_assoc()はパラメーター1がmysqli_resultであることを期待します

ローカル/開発環境では、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です。

81
siopaoman

クエリが失敗し、その理由がわからない場合があります。したがって、PHPおよびmysqliを設定して、すべてのエラーを報告することが非常に重要です。

Mysqliでエラーメッセージを取得する方法

まず、MySQLiが環境にallで接続する前に、常に次の行を用意します。

_mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
_

その後、すべてのMySQLエラーがPHP例外に転送されます。捕捉されなかった例外は、PHP致命的なエラーになります。したがって、MySQLエラーの場合、従来のPHPエラーが発生します。これにより、エラーの原因がすぐにわかります。スタックトレースを使用すると、エラーが発生した正確な場所に移動できます。

異なる環境で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)など)のは意味がありません。クエリが失敗し、既にエラー例外が発生するか、問題がなく、テストするものがありません。
  • エラーメッセージをエコーするには、try..catchを使用します。繰り返しますが、PHPはそれをもっと良くすることができます。
88

オブジェクトを作成したとは思わない。

$ mysqli = new mysqli( 'localhost'、 'my_user'、 'my_password'、 'world');

代わりにPDOを使用することをお勧めします。

0
Wayne Oliver