Bài 6: Load Library Database Trong Codeigniter
Trong bài này bạn sẽ được học:
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
- Các thao tác xử lý database.
- Làm quen với Active Record.
Lưu ý:
Tôi sử dụng Codeigniter version 2.1.4.
Tên folder của tôi là citest cho bài viết này.
Tôi sẽ không giới thiệu về library này mà sẽ xoáy sâu vào các thao tác của nó.Đầu tiên tôi cần tạo ra một controller có tên là user và action của tôi là index và tôi sẽ gọi library database ngay tại constructor. Việc tôi gọi lib ngay tại constructor nó giúp cho tôi có thể tái sử dụng lib trong từng action.
Load library database
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ } }
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `password` char(32) COLLATE utf8_unicode_ci DEFAULT NULL, `level` int(1) DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Thao tác Database
Đầu tiên tôi sẽ trình bày cách viết câu truy vấn bình thường sau đó mới thao tác tới các active record do CI cung cấp. Để viết được các câu truy vấn bình thường tôi dùng thuộc tính như sau.
$this->db->query("SELECT * FROM USER order By id");
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $query=$this->db->query("SELECT * FROM USER order By id"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
$data
để hứng lấy kết quả trả về, ở đây result_array tương ứng với mysql_fetch_assoc dùng để lấy toàn bộ record, tôi in dữ liệu trong cặp thẻ textarea để xem kết quả trả về có đúng như sự kỳ vọng của tôi hay không. chạy link localhost/citest/index.php/user/index.[0] => Array
(
[id] => 1
[username] => admin
[password] => 123456
[level] => 2
)
[1] => Array
(
[id] => 2
[username] => alibaba
[password] => 123456
[level] => 1
)
[2] => Array
(
[id] => 3
[username] => vicky
[password] => 123456
[level] => 1
)
[3] => Array
(
[id] => 4
[username] => jacky
[password] => dsads
[level] => 1
)
[4] => Array
(
[id] => 5
[username] => tenda
[password] => 212332
[level] => 1
)
[5] => Array
(
[id] => 6
[username] => tplink
[level] => 1
)
Ok, nếu kết quả trên trình duyệt hiển thị như thế này, xem như việc lấy toàn bộ record của bạn đã thành công rồi đấy, rất là đơn giản phải không nào, tiếp theo tôi sẽ sử dụng active record trong quá trình làm việc với database.
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
$query->row_array();
$this->db->limit(); $this->db->select(); $this->db->join(); $this->db->like(); $this->db->select_min(); $this->db->select_max();
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $this->db->select("id, username, level"); $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
Array
(
[0] => Array
(
[id] => 1
[username] => admin
[password] => 123456
[level] => 2
)
Để sắp xếp id theo chiều giảm dần tôi có cú pháp như sau. order_by tương ứng với order by id desc trong câu truy vấn thông thường.
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $this->db->select("id, username, level"); $this->db->order_by("id", "desc"); $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $this->db->select("id, username, level"); $this->db->order_by("id", "desc"); $this->db->limit(7, 0); $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $this->db->select("id, username, level"); $this->db->order_by("id", "desc"); $this->db->limit(7, 0); $this->db->where("level", "2"); $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
Array
(
[0] => Array
(
[id] => 1
[username] => admin
[level] => 2
)
Tiếp theo tôi sẽ thực thi mệnh đề điều kiện, để lấy ra id nhỏ nhất & lớn nhất. nếu ở php thuần chúng ta phải viết như sau.
SELECT MIN(id) as id FROM user SELECT MAX(id) as id FROM user Active Record $this->db->select_min() $this->db->select_max();
class User extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->library("database"); } public function index(){ $this->db->select("id, username, level"); $this->db->order_by("id", "desc"); $this->db->limit(7, 0); $this->db->where("level", "2"); $this->db->select_min("id"); $query=$this->db->get("user"); $data=$query->result_array(); echo "<pre>"; print_r($data); echo "</pre>"; }
$this->db->insert("table", tên biến truyền vào)
public function index2(){ $data=array( "username" => "kaito", "password" => "1212445", "level" => "2", ); $this->db->insert("user", $data); }
Array
(
[0] => Array
(
[id] => 1
[username] => admin
[level] => 2
) [0] => Array
(
[id] => 5
[username] => kaito
[level] => 2
)
Tiếp theo để update một record ta cần phải làm như thế nào, đầu tiên để có thể update ta cần phải có một cái mảng, và một mệnh đề điều kiện chỉ định id cần update.
$this->db->update("table", tên biến truyền vào)
public function index3(){ $data=array( "username" => "kaito", "password" => "kaito123", "level" => "1", ); $this->db->where("id", "5"); if($this->db->update("user", $data)){ echo "Update Thanh cong"; }else{ echo "Update That bai"; } }
và cuối dùng muốn xóa một record tôi cần phải dùng mệnh đè điều kiện, chỉ định ra id cần xóa, ta có cú pháp như sau.
$this->db->delete("table")
public function index4(){ $this->db->where("id", "5"); if($this->db->delete("user")){ echo "Xoa thanh cong"; }else{ echo "Xoa that bai"; } }
Thao tác database trong model
Đầu tiên ta cần phải khởi tạo file model nhé, tuyệt đối nhớ dùm tôi là tên file của model không được phép trùng tên với controller, nếu 2 thằng trùng nhau sẽ báo lỗi ngay lập tức, tại thư mục application/models tôi khởi tạo file muser.php và khai báo như sau.
<?php class Muser extends CI_Model{ public function __construct(){ parent::__construct(); $this->load->database(); } } ?>
<?php class Muser extends CI_Model{ public function __construct(){ parent::__construct(); $this->load->database(); } public function listUser(){ $this->db->select("id, username, level"); $query=$this->db->get("user"); return $query->result_array(); } } ?>
echo "<pre>"; print_r($data); echo "</pre>";
public function index5(){ $this->load->model("Muser"); $data['data']=$this->Muser->listUser(); $this->load->view("user/list_view", $data); }
Kết quả y chang action index nhen, không tin các bạn chạy link localhost/citest/index.php/user/index5 để test.
Những điều cần lưu ý
Để có thể nắm bắt và hình dung được cách xử lý database trong CI các bạn cần lưu ý các vấn đề sau giúp tôi.
- Trong bất kì controller không được tạo action có tên là list, nó ứng với core system của CI.
- Thực thi câu truy vấn:
$this->db->query()
$this->db->num_rows()
$this->db->result_array()
$this->db->row_array()
- Thực thi câu truy vấn:
$this->db->get("table")
$this->db->select("cols1", "cols2")
$this->db->order_by("id desc")
$this->db->limit(7, 0)
$this->db->where("cols", "var")
$this->db->insert("table", $tenbien)
$this->db->update("table", $tenbien)
$this->db->delete("table")
Kết:
Sorry các bạn vì bài viết khá là dài, cũng dễ hiểu thôi đây chính là một library quan trọng mà các bạn cần phải nắm vững nó để có thể xây dựng hoàn chỉnh một ứng dụng website. tôi không thể nào liệt kê và hướng dẫn các bạn toàn bộ các phương thức mà active record cung cấp, để có thể nắm bắt sâu hơn, các bạn có thể tìm hiều thêm thông qua user guide mà CI cung cấp.