2

これは私が思うにランダムな質問であり、それはスタイルと組織ともっと関係があります。PDOを使用してMySQLデータベースに接続するWebアプリケーションがあり、一部のスクリプトでは、同じテーブルに必ずしも関係しないクエリが次々に発生します。つまり、あるものでSELECTステートメントを実行し、次にいくつかの値に応じて別のステートメントを更新し、最後に別のステートメントからDELETEします。

私は最近PHPとMySQLを学びましたが、確信が持てず、注意して問題を簡単に見つけたいと思っていたためです(そして、均一性やコーディングスタイルなどの愚かなことについては少し強迫的で肛門的であるため)私が使用したすべてのクエリは次の形式です

try {
    $statement = "
        UPDATE/SELECT   ...
        FROM/SET    ...
        WHERE   ...";
    $query = $dbcnx->prepare($statement);
    $flag = $query->execute();
}
catch (PDOException $e) {
    $errorMsg = "...";
    error_log($errorMsg,3,'../../xxx.log');
    $response = ...;
    $dbcnx->null;
    return $response;
}
$result = $query->fetch/fetchAll/fetcColumn...

そのため、問題が発生する場所(try / catch)を見つけ、インジェクションや無効な文字に対して安全である(prepare)ことができました(個人的なチェックをいくつか行いましたが、特別に作成された関数の方が優れていると確信しています)。

1つまたは2つのクエリがあった場合は問題ありませんでしたが、コードが大きくなると、アクションや実体がほとんどないため、コードが少し多すぎました(1つのクエリで16行など)。

だから私はいくつかのアドバイスをお願いします。コードをより管理しやすくするにはどうすればよいですか?構造に関する私の論理(私がそれを書いた方法)にいくつかの根本的な誤りがありますか?try / catchを使用するためのルールはありますか?それは開発とデバッグのためのものであり、後でそれのいくつかのブロックを削除することができますか?

このコードブロックだけの関数を作成し、ステートメントをパラメーターとして使用して呼び出すことを考えていました。したがって、本体にクエリを「入力」してから、関数を呼び出して、クエリを準備、実行し、結果を返します。もちろん、私は常にfetchAllを使用し、連想配列を返しますが、データセットが小さい限り、メモリ使用量は問題ないと思います(いずれにせよ、最近のシステムでは、違いに気付くのにかなりの時間がかかるはずです)。 ..

どんな考えでも大歓迎です。

これは実際にはコードや設定、s / wやプログラムの問題ではないことを理解していますが、それでも精神に従っていることを願っています。

4

1 に答える 1

4

まず第一に、素晴らしい質問に感謝します。
驚いたことに、ここでは、より良いコードプラクティスを求める質問はほとんどありません。
誰もコードの品質を気にしませんが、誰もがコードをコピーして貼り付けるように要求し、何を持っているかは気にしません。

次に、知っておく必要のある2つの優れた点があります。

  1. Try..catchは、例外的な(しゃれではない)演算子です。処理するコードに従って回復できるエラーのために、これを使用する必要はほとんどありません。エラーをログに記録するためだけにそれを使用することは、致命的な罪であり、貴重で強力なメカニズムの浪費です。
  2. 本当に必要なのは、すべての汚い仕事をして複雑なケースを処理するためのデータベース抽象化レイヤーです。

例外について読む必要があります。
これは、構文の強調表示以降のプログラミング言語の最大の改善です。
それらはすぐに捕まえることを意図していません。ポイントはまったく逆です。単一の例外ハンドラーを使用して、一元化された方法で例外をキャッチします。

しかし、ハンドラーがなくても、Exeptionsで十分です。誤ったクエリはスクリプトを停止し、503エラーを表示し、エラーメッセージをログに記録するか、PHPの設定に従って画面に表示します。これ以上必要なことはありません。

したがって、すべての処理コードを取り除き、エラーをログに記録するために使用するファイルをPHPに指示するだけです。

ini_set('log_errors',1);
ini_set('error_log','/path/to/log');

劇的に少ないコードで同じ結果が得られます。

抽象化ライブラリについては、コードを見てください。

$statement = "UPDATE/SELECT  FROM/SET    ...         WHERE   ...";
$query = $dbcnx->prepare($statement);
$flag = $query->execute();
$result = $query->fetch/fetchAll/fetcColumn...

4行で、そのうちの1行だけが意味を持ちます。

もう一行にしてみませんか-

$result = $db->getRes( $statement); //okay, leaving query separate for readability

それがどのようになるかについてのアイデアを与えるためだけに-私自身のデータベース抽象化クラス
はmysqliの上に基づいていますが、PDOを含む他のドライバーで簡単に書き直すことができます

于 2013-02-26T19:23:22.093 に答える