1

ページを表示する場合のユーザータイプによっては、JOINを追加したり、結果を制限したりする必要がある場合があります。よりクリーンな方法はありますか?代わりに、リクエストのタイプごとに個別のステートメントを用意する必要がありますか?より「適切な」とは何ですか?

私のコードは次のようになります。

// Prepare statement
$stmt = $this->db->prepare('
    SELECT *
    FROM    Documents
    LEFT JOIN Notes ON ID = D_ID
    '.($user_id ? "INNER JOIN Users ON UID = ID AND UID = :userid" : '')."
    ". ($limit ? 'LIMIT :offset, :limit' : '')
);

// Bind optional paramaters
if ($user_id) $stmt->bindParam(':userid', $user_id, DB::PARAM_INT);

if ($limit)
{
    $stmt->bindParam(':offset', $limit[0], DB::PARAM_INT);
    $stmt->bindParam(':limit', $limit[1], DB::PARAM_INT);
}
4

2 に答える 2

1

たぶん、挿入文字列を独自のメソッドにラップして、のようgetUserInsertString($user_id)に明確にし、引用符の使用をより一貫性のあるものにしようとします。

また、行くだけで定義されているかどうか$user_idをテストしていますか?もしそうなら、エラー報告をすべてに向けた場合、未定義の変数警告がたくさん表示されます。代わりに使用を検討することをお勧めします。$limitif ($user_id)if (isset($user_id))

于 2012-04-05T23:43:50.077 に答える
0

個別の(保護された)関数を作成します。これらは、実行する必要があるだけのプリペアドステートメントを返します。

/**
* @returns PDOStatement
*/
protected function prepareStatementForCase1(PDO $dbObject,Object $dataToBind){...}
/**
* @returns PDOStatement
*/
protected function prepareStatementForCase2(PDO $dbObject,Object $dataToBind){...}

それから、私は外でどちらを呼ばなければならないかを決めるでしょう。コードをより簡単に再構築、保守、および読み取ることができます。

例:

class Document{
  protected $dbObject;

  public function __construct(PDO $dbObject){
    $this->dbObject=$dbObject;
  }
  public function doQuery($paramOne,$paramTwo,...){
    $logicalFormulaOne=...; // logical expression here with parameters
    $logicalFormulaTwo=...; // logical expression here with parameters
    if($logicalForumlaOne){
      $dbStatement=$this->prepareStatementForCase1($dataToBind);
    }else if($logicalFormuleTwo){
      $dbStatement=$this->prepareStatementForCase2($dataToBind);
    }
    $dbResult=$dbStatement->execute();
  }
  protected function prepareStatementForCase1(Object $dataToBind){
    $dbStatement=$this->dbObject->prepare("query string");
    $dbStatement->bindParam(...);
    return $dbStatement;
  }
}

ただし、PDOResultオブジェクトが異なるタイプのデータベースタプルを表す場合、またはいずれかのケースでより多くの行を返す場合は、これをお勧めしません。

私が通常行うことは、(あなたの例では)ドキュメントを表すクラスを作成することです。唯一。挿入、削除、選択、フィールドによる変更、および1つのアイテムの処理を行うことができます。(たとえば)それらをさらにフェッチする必要がある場合は、ドキュメントのコレクションを処理するDocumentListなどの新しいクラスを作成します。このクラスは、より多くのドキュメントオブジェクトをフェッチするときに、ドキュメントオブジェクトの配列を提供します。

于 2012-04-05T23:56:58.763 に答える