1

codeigniter でデータベース (mysql) クエリを作成する際のベスト プラクティスを教えてください。私はさまざまな方法を見てきましたが、何がベストプラクティスになるのか混乱していました。

以下は、私が経験したいくつかの方法です

方法 1

$this -> db -> select('id, username, password');
$this -> db -> from('users');
$this -> db -> where('username = ' . "'" . $username . "'");
$this -> db -> where('password = ' . "'" . MD5($password) . "'");
$this -> db -> limit(1);

方法 2

$query = $this->db->query("select * from user where username = '$uname' and password = '$pass'");

方法 3 (ストアド プロシージャの記述)

$query = "call authenticateuser(" . $this->db->escape($parameters['username']) . ", '" . sha1($parameters['password']) . "')";

他にもたくさんの方法があるかもしれませんが、クエリを書くのに最適な方法を知りたいので、誰かがアドバイスできるなら、それは本当に役に立ちます.

4

4 に答える 4

1

Active recordsしたがって、リファクタリングがほとんどない method1 が最適です。

$this->db->select('id, username, password');
$this->db->from('users');
$this->db->where('username',$username);
$this->db->where('password', MD5($password));
$this->db->limit(1);

where()あなたと私のものをチェックしてくださいwhere():)

アクティブ レコード クエリの構築はより快適で、クエリを構築するときに読みやすいです。特に、多くのフィルターwhere,like,order_by,join,limitを手作業で書き留める必要がある場合、クエリはおそらく少し速くなるはずですが、アクティブ レコード構築を使用することをお勧めします。

于 2012-11-22T09:08:52.243 に答える
0

私は通常、データベースからデータを取得するためにこれを使用します。これは非常に簡単で迅速です。

私のモデル:

public function getdata($select,$table,$where,$limit,$offset,$order){

        if(isset($select) && !empty($select)){
            $this->db->select("$select");
        }
        if(isset($limit) && !empty($limit)){
            if(isset($offset) && !empty($offset)){
                $this->db->limit($limit,$offset);
            }
            else{
                $this->db->limit($limit);
            }
        }
        if(isset($where) && !empty($where)){
            foreach ($where as $key => $value) {
                $this->db->where($key,$value);
            }
        }
        if(isset($order) && !empty($order)){
            foreach ($order as $key => $value) {
                $this->db->order_by($key,$value);
            }
        }

        $query = $this->db->get("$table");
        return $query->result();
    }

私のコントローラー:

$this->my_model->getdata('','user',array('userid' =>  1,'username' => 'my_username'),'','','');

これの意味は:

select * from user where userid = 1 and username = 'my_username';

他の例:

$this->my_model->getdata('username','user','',10,'','','');

意味:

select username from user limit 10;

//my_model is model class name;
于 2012-11-22T11:02:04.617 に答える
0

実際のCIのアクティブレコードに基づいた独自のcrud_modelを使用しています。$paramsパラメータで関数をフラッディングするよりも配列を渡す方が良いです。

私のモデルでは:

//for JOINS etc stuff

public function get_joined_data($params){

    if (!empty($params['select'])) {
        $this->db->select($params['select']);
    }
    $this->db->from($params['from']);

    if (is_array($params['join']) || count($params['join']) > 1) {
        foreach ($params['join'] as $key => $value) {
            $join_values = explode(',', $value);
            $this->db->join($join_values[0], $join_values[1], $join_values[2]);
        }
    } else{
        $join_values = explode(',', $params['join'][0]);
        $this->db->join($join_values[0], $join_values[1], $join_values[2]);
    }

    if (!empty($params['key']) && !empty($params['where'])) {
        $this->db->where($params['key'], $params['where']);
    } else if (is_array($params['where'])) {

        $this->db->where($params['where']);
    }
    if (isset($params['like']) && is_array($params['like'])) {
        $this->db->like($params['like']);
    }
    if (isset($params['orderby']) && is_array($params['orderby'])) {
        foreach ($params['orderby'] as $name => $order) {
            $this->db->order_by($name, $order);
        }
    }
    if (isset($params['limit'])) {
        $this->db->limit($params['limit']['count'], $params['limit']['start']);
    }
    $query = $this->db->get();
    return $query->result();
}

そしてコントローラーで:

//joins()

$params = array(
    'from' => '$from',
    'join' => $join_arr,  
    'where' => $where_arr, 
    'orderby' => $orderby_arr 
    );`enter code here`
$donors_data = $this->crud_model->get_joined_data($params);
于 2016-05-19T05:41:29.217 に答える
0

私はストアド プロシージャを使用していますが、コーディングは面倒ですが、利点はメンテナンス、セキュリティ、速度の点で簡単です。これが私の例です:

   function user_list($str_where, $str_order, $str_limit){

     $str_where  = $this->db->call_function('real_escape_string', $this->db->conn_id, $str_where);
    $str_order  = $this->db->call_function('real_escape_string', $this->db->conn_id, $str_order);
    $str_limit  = $this->db->call_function('real_escape_string', $this->db->conn_id, $str_limit);

$qry_res    = $this->db->query("CALL rt_sample_list('{$str_where}', '{$str_order}', '{$str_limit}');");
    $res        = $qry_res->result();

    $qry_res->next_result(); // Dump the extra resultset.
    $qry_res->free_result(); // Does what it says.

    return $res;

}

于 2013-02-08T06:21:15.890 に答える