mysqli_fetch_assoc()は、パラメーター/メンバー関数bind_param()の呼び出しエラーを予期しています。実際のmysqlエラーを取得して修正する方法は?

116
siopaoman 2014-03-27 03:27.

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

1 answers

131
Your Common Sense 2014-03-27 03:32.

時には、あなたのMySQLiをコードは次のようなエラーが発生しmysqli_fetch_assoc() expects parameter...Call to a member function bind_param()...または類似しました。または、エラーがなくても、クエリはまったく同じようには機能しません。クエリの実行に失敗したことを意味します。

クエリが失敗するたびに、MySQLには理由を説明するエラーメッセージが表示されます。残念ながら、デフォルトでは、このようなエラーはPHPに転送されず、上記の不可解なエラーメッセージだけが表示されます。したがって、MySQLエラーを報告するようにPHPとMySQLiを設定することが非常に重要です。エラーメッセージが表示されたら、修正するのは簡単です。

MySQLiでエラーメッセージを取得するにはどうすればよいですか?

まず、すべての環境でMySQLiを接続する前に、必ず次の行を用意しください。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

さまざまな環境でPHPを構成する方法

PHPエラーレポートに関する私の記事の要点は次のとおり
です。開発サーバーとライブサーバーでのエラーのレポートは異なる必要があります。開発サーバーではエラーを画面に表示すると便利ですが、ライブサーバーでは代わりにエラーメッセージをログに記録する必要があるため、後でエラーログで見つけることができます。

したがって、対応する構成オプションを次の値に設定する必要があります。

  • 開発サーバー上

    • error_reportingE_ALL値に設定する必要があります。
    • log_errors 1に設定する必要があります(開発用PCにもログがあると便利です)
    • display_errors 1に設定する必要があります
  • 本番サーバー上

    • error_reportingE_ALL値に設定する必要があります。
    • log_errors 1に設定する必要があります
    • display_errors 0に設定する必要があります

実際に使うには?

ちょうど任意のコードを削除することを手動でエラーをチェックし、すべてのものor die()if ($result)など。データベースインタラクションコードをすぐに書くだけです。

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

繰り返しますが、周りの条件はありません。エラーが発生した場合、コード内の他のエラーとして扱われます。たとえば、開発用PCでは画面に表示されるだけですが、ライブサイトではプログラマー用にログに記録されますが、ユーザーの便宜のためにエラーハンドラーを使用できます(ただし、これは別の話であり、 MySQLiですが、上記のリンク先の記事で読むことができます)。

表示されるエラーメッセージをどうするか?

まず、問題のクエリを見つける必要があります。エラーメッセージに、エラーが発生した正確な場所のファイル名と行番号が含まれています。単純なコードで十分ですが、コードで関数またはクラスを使用している場合は、スタックトレースに従って問題のクエリを見つける必要があります。

エラーメッセージが表示されたら、それを読んで理解する必要があります。見下すようなことではないように聞こえますが、学習者はエラーメッセージが単なるアラーム信号ではなく、実際には問題の詳細な説明が含まれているという事実を見落としがちです。そして、必要なのはエラーメッセージを読んで問題を修正することだけです。

  • たとえば、特定のテーブルが存在しないと表示されている場合は、スペル、タイプミス、大文字と小文字を確認する必要があります。また、PHPスクリプトが正しいデータベースに接続していることを確認する必要があります
  • または、SQL構文にエラーがあると表示されている場合は、SQLを調べる必要があります。また、問題のある場所は、エラーメッセージで引用されているクエリ部分の直前です。

エラーメッセージがわからない場合は、Googleで検索してみてください。そして、結果を閲覧するときは、率直に解決策を与えるのではなく、エラーを説明する答えに固執してください。特定のケースでは解決策が機能しない場合がありますが、説明は問題を理解し、自分で問題を修正できるようにするのに役立ちます。

エラーメッセージも信頼する必要があります。それはトークンの数は、バインドされた変数の数と一致しないことを言う場合、それはありそう。存在しないテーブルまたは列についても同じことが言えます。それがあなた自身の間違いであるかエラーメッセージが間違っているかどうかの選択を考えると、常に前者に固執します。繰り返しますが、それは見下すように聞こえますが、このサイトの何百もの質問は、このアドバイスが非常に役立つことを証明しています。

エラー報告に関して絶対にすべきでないことのリスト

  • エラー抑制演算子(@)は絶対に使用しないでください。プログラマーがエラーメッセージを読み取れなくなり、エラーを修正できなくなります。
  • 使用しないでくださいdie()またはecho無条件画面にエラーメッセージを出力したり、他の関数を。PHPはそれ自体でエラーを報告でき、環境に応じて正しい方法で報告できるため、PHPに任せてください。
  • クエリ結果を手動でテストするための条件を追加しないでください(のようにif($result))。エラー例外が有効になっていると、そのような状態は役に立たなくなります。
  • try..catchエラーメッセージをエコーするために演算子を使用しないでください。この演算子は、トランザクションのロールバックなどのエラー処理を実行するために使用する必要があります。ただし、エラーを報告するためだけに使用しないでください。上記で学習したように、PHPはすでに正しい方法でそれを実行できます。

PS
エラーが発生しないこともありますが、結果も発生しません。つまり、データベースに条件に一致するデータがないということです。この場合、たとえデータを誓うことができ、基準が大丈夫であっても、この事実を認めなければなりません。ではない。もう一度確認する必要があります。この問題に役立つ記事「データベースの相互作用をデバッグする方法」があります。 PDO用に書かれていますが、原理は同じです。この手順を1つずつ実行して、問題を解決するか、スタックオーバーフローに関する回答可能な質問をしてください。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language