web-dev-qa-db-ja.com

mysqliまたは死ぬ、死ぬ必要がありますか?

このようなコードを少し使用すると:

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));

死ななければならないのですか、それとも別のクエリを後で入力できますか?エラーのログを別のテーブルに書き込む所定の関数のように?といった:

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);

「または」の後の他のオプションは何ですか?私はドキュメントでそれを見つけていません、手がかりはありがたいです。

18
Maelish

死ななければなりませんか

かなり逆に、die()であってはなりません。
PHPは悪い遺伝の言語です。非常に悪い遺伝。そして、or die()は、最悪の初歩の1つであるエラーメッセージとともに:

  • dieはエラーメッセージをスローし、潜在的な攻撃者にいくつかのシステム内部を明らかにします
  • 無実のユーザーを奇妙なメッセージで混乱させ、操作するインターフェースを残さないので、おそらく脱落してしまうでしょう。
  • 途中でスクリプトを強制終了するため、表示されたデザインが破損する(またはデザインがまったく表示されない)可能性があります(つまり、ユーザーが要求したページの不完全なレンダリング)
  • スクリプトを回復不能に強制終了します。スローされた例外はキャッチされ、適切に処理されます
  • die()は、エラーが発生した場所のヒントを提供しません。また、比較的大きなアプリケーションでは、見つけるのが非常に面倒です。

したがって、die()をmysqlエラーで使用しないでください、一時的なデバッグでも:より良い方法があります。

クエリには2つの選択肢があります。

  • アプリケーションコードでmysqli_query()を使用する場合(これは間違っていますが、StackOverflowでは他の方法は教えられません)、dieの代わりにtrigger_error()を使用できます。通常のPHPエラーが発生し、PHP設定に応じて自動的にログに記録されます。

    _$result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
    _
  • mysqli_query()を抽象化ライブラリの一部として使用する場合、代わりに新しい例外をスローする必要があります。これは、スタックトレース(常に例外が提供されます)が必要なためです。エラーが発生しました。

ただし、OR演算子で_new Exception_を使用することはできません。そのため、コードは少し長くなります。

_$result = mysqli_query($link , $sql);
if (!$result) {
    throw new Exception(mysqli_error($link)."[ $sql]");
}
_

一度だけ書かなければならないので、大したことではありません。

更新。判明したように、 mysqliはそれ自体で例外をスローすることができます 。 :

_$result = mysqli_query($link, $sql);
_

このコードは、エラーが発生した場合に例外をスローするため、余分なコードなしで常に通知されます。ただし、前の例では、エラーメッセージにSQLクエリが追加されています。これは非常に価値があるため、前述の方法にも固執する可能性があります。

重要な注意事項

エラーのログを別のテーブルに書き込む所定の関数?

これは明らかに悪い考えです。特に、前回の試行に失敗した同じメディアにエラーメッセージを書き込む場合。
エラーは最も堅牢なメディア(プレーンテキストログ)に記録する必要があります。したがって、PHPを設定してエラーログを作成し、定期的にチェックしてください。

61

orは単なる演算子です(_||_に非常に似ています)。

or die()構文は、orが短絡するため機能します。つまり、最初のステートメントがtrueの場合、_True or X_は常にtrueになるため、Xはそうではありません。 tが評価され、スクリプトはdieしません。

6
Blender

はい、(または)の後に別の機能を提供できます。私は次をテストしました:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}
1
kalaero

具体的にはdie()である必要はありませんが、exit()またはdie()を呼び出すことでスクリプトを停止させるものである必要があります。例外をスローします。そうでない場合、スクリプトはその関数の戻り値(おそらくnullまたは何らかのジャンク)を$update_result、これはほぼ確実に問題を引き起こします。

0
duskwuff