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

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

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

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

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

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language