0

子モデルが継承する親モデルの汎用挿入関数を作成することは一般的ですか、および/または賢明ですか?私は非常に単純なCRUDアプリでCodeIgniter\PHPを使用していますが、この質問は実際には言語\フレームワークに依存しません。1つの値を読み取る(選択する)読み取り関数を継承すると、非常にうまく機能し、正しいと感じます:親モデル

public function read($columnSelect,$columnCondition,$value) {
    $query = "SELECT $columnSelect FROM $tableName WHERE $columConditionn=?";
    $res = $this->db->query($query,$columnName);
    if ($res->result()->num_rows()>0)
        return $res->result();
    else 
        return false;

これにより、ユーザーID、電子メールの取得、特定の列の存在の確認などが可能になります。間違いなく、ほとんどまたはすべてのモデルで役立つと思うので、親モデルでその関数を作成することをお勧めします。より複雑なすべての読み取り関数は、明らかに各モデルに固有です(たとえば、複数の値を読み取るクエリなど)。挿入についてはどうでしょうか。1つの値、2つの値などを挿入する関数を作成するか、「醜い」関数を作成してパラメーターの配列を取得し、その配列に従って挿入クエリを作成する以外に、一般的な挿入は考えられません。例:

        public function genericInsert($columnList,$valueList) {

              $query = " INSERT INTO $tableName(
                        //now code that parses columnList and adds ','
                       //and then code that adds VALUES(..) in the same manner

これは間違いなく私にとって「パターン」のようには感じられず、間違っていると感じます。私は何かを見落としていますか?インサートに対して何をしますか?それは各モデルに固有ですか、それとも親モデルから継承する方法を考えようとしていますか?また、もしそうなら、あなたはあなた自身があなたの親モデルに入れていると思う関数は何ですか?(更新、削除など)?

これは私の親モデルがこれまでのように見えるものです:

class MY_Model extends CI_Model {
    public $tableName;

    public function __construct($tableName) {
        parent::__construct();
        $this->tableName = $tableName;

    }

    public function read($columnSelect,$columnCondition,$value) {
        $query = "SELECT $columnSelect FROM $tableName WHERE $columConditionn=?";
        $res = $this->db->query($query,$columnName);
        if ($res->result()->num_rows()>0)
            return $res->result();
        else 
            return false;
    }
}
4

3 に答える 3

0

なぜ車輪の再発明をするのですか?Codeigniterの標準dbクラスは、作成したい親モデルが実行するすべてのことをすでに実行できます。独自のdbラッパークラスを作成していてCIを使用していない場合は理にかなっていますが、CIはすでにこれらの機能を提供しており、必要に応じてカスタマイズ/拡張できます。

于 2013-01-25T21:47:47.257 に答える
0

私自身の質問に答えるのは嫌いですが、これは私が探していたものです http://thephpcode.com/blog/codeigniter/a-smart-codeigniter-model

于 2013-01-26T19:50:10.750 に答える
0

いくつかのアドバイスですが、このようクエリを作成するときは十分に注意してください。コード内でエスケープが発生していないため、コードをSQLインジェクション用に開いたままにしています。

たとえば、$columnSelectが次のようになる場合。

"x'; DROP TABLE members; --"

クエリは次のようになります。

"SELECT 'x'; DROP TABLE members; -- FROM $tableName WHERE $columConditionn=?";
于 2013-01-26T21:05:34.967 に答える