2012-11-22 3 views
1

codeigniter에서 데이터베이스 (mysql) 쿼리를 작성하는 모범 사례에 대해 알고 싶습니다. 나는 여러 가지 다른 방식을 보았지만 가장 좋은 방법이 무엇인지 혼란스러워했습니다.codeigniter에서 쿼리를 작성하는 모범 사례

다음 내가

방법 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']) . "')"; 

힘 다른 많은 방법이 있지만 쿼리를 작성하는 가장 좋은 방법을 알고 싶습니다. 따라서 누군가가 조언 할 수 있다면 정말 도움이 될 것입니다.

+0

활동 기록은 가장 좋습니다. – Vamsi

+2

위의 모든 방법의 문제점은 SQL 주입에 개방적이라는 것입니다. 사용 가능한 매개 변수를 실제로 사용하고 '$ this -> db -> where ('username ', $ username);와 같이 WHERE 함수를 작성해야합니다. 자동으로 문자열을 이스케이프 처리합니다. – Jeemusu

+1

참고 :주의하십시오. Codeigniter는 기존의'mysql_ *'함수를 사용하여 더 이상 사용되지 않는 이스케이프 용 함수를 사용합니다. codeigniter를 사용하는 경우에도 기본 드라이버를 pdo로 변경하십시오. – itachi

답변

0

Active records 그래서 가장 작은 리팩토링과 방법 항목입니다 :

$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() 및 광산 당신이 필요로 expecially에있는 경우, 쿼리를 만들 때 where() :

액티브 레코드 쿼리 건물은 더 편안하고 읽기 많은 필터 where,like,order_by,join,limit 손으로 쿼리를 작성하는 속도는 조금 빨라야하지만 적극적인 레코드 빌딩을 사용하는 것이 좋습니다.

+0

첫째로, 그것은 활동적인 기록이 아니다. Codeigniter 개발자는 전체 용어를 도살하고 있습니다. 이것은 쿼리 빌더이며 다른 것은 없습니다. 둘째, 톱 쿼리는 활성 레코드/쿼리 빌더보다 항상 빠릅니다. 셋째, 복잡한 쿼리의 경우 활성 레코드가 아닌 이유로 활성 레코드가 수행되지 않습니다. – itachi

+0

그래서 그들은 문서를 변경해야합니다. http://codeigniter.com/user_guide/database/active_record.html에있는 내용을보고합니다. ** Active Record ** – sbaaaang

+0

@Ispuk라고 말하면 아마도 방법이 왜 더 나은. – Jeemusu

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; 
0

. 나는 실제의 CI의 활동 기록을 기반으로 내 자신의 crud_model를 사용

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; 

}

0

: 은 여기 내 예입니다. 함수를 매개 변수로 플러딩하는 대신 $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); 
관련 문제