2012-11-22 60 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注入開放。你應該真的使用可用的參數,並像這樣編寫你的WHERE函數:$ this - > db - > where('username',$ username);'。哪一個會自動爲你排除字符串。 – 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,它被稱爲**活動記錄** – 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

對我來說,我使用的存儲過程,雖然它是在編碼繁瑣但優點是易於維護,安全性和速度。 這是我的例子:

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

我用我自己的crud_model這是基於CI的實際活動記錄。最好通過$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);