我想知道在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']) . "')";
可能还有很多其他方法,但想知道编写查询的最佳方式,因此如果有人可以提供建议,那将非常有用。
答案 0 :(得分:0)
Active records
所以最好是方法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);
检查您的where()
和我的where()
:)
活动记录查询构建更加舒适,并且在构建查询时可读,特别是如果您需要手动写下许多过滤器where,like,order_by,join,limit
,查询可能会快一点,但我鼓励您使用活动记录构建。
答案 1 :(得分: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;
答案 2 :(得分: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;
}
答案 3 :(得分: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();
}
在Controller中:
//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);