CODEIGNITER 3X
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Bài 6: Load Library Database Trong Codeigniter

Trong bài này bạn sẽ được học:

  1. Các thao tác xử lý database.
  2. 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(){
 
    }
}
Như thế này là chưa đú để chúng ta có thể sử dụng library, các bạn cần phải khai báo database ở trong thư mục application/config/database.php, nếu bạn chưa rành về thao tác này xin mời xem lại bài Load Model Trong Codeigniter Tiếp theo tôi cần có một table với tên gọi là user, cái tên bảng tùy các bạn đặt nha.
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
Các bạn có thể copy đoạn mã này vào phpmyadmin, vào phần sql paste vào rồi run thôi nhen, nhưng trước đó hãy tạo ra database trước nhé, nếu không sẽ báo lỗi đấy. Làm đến bước này xem như chúng ta chuẩn bị xong phần kết nối database, tạo table và bước tiếp theo là xử lý nó.

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");
Ứng với câu truy vấn thông thường chình là mysql_query đó các bạn. Để có thể lấy ra toàn bộ dữ liệu trong table user ta có thao tác như sau.
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>";
}
Tôi dùng $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>";
}
Tôi dùng phương thức get tương ứng với câu truy vấn thông thường mà tôi đã viết ở trên, việc sử dụng phương thức này giúp tôi rút ngắn câu lệnh một cách khá là dễ dàng, tôi cũng đếm luôn tổng số record trả về là bao nhiêu bằng phương thức num_rows , và nếu tôi chỉ muốn lấy một record thì làm như thế nào?
$query->row_array();
Thay vì dùng result_array để lấy tất cả record , thì tôi dùng hàm row_array để lấy về một record duy nhất.Các bạn có thể test bằng cách thay đổi giữa row & result. Ngoài ra còn khá là nhiều phương thức hỗ trợ các bạn làm việc tốt với database, tôi sẽ liệt kê một số phương thức mà chung ta hay dùng để xây dựng ứng dụng website.
$this->db->limit();
$this->db->select();
$this->db->join();
$this->db->like();
$this->db->select_min();
$this->db->select_max();
Ví dụ tôi không muốn liệt kê tất cả các field và chẳng hạn như tôi muốn ẩn đi cột password.Tôi sẽ dùng phương thức select trong active record, liệt kê ra các field mà tôi muốn lấy.
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>";
}
Kết quả trả về như sau, xem như thao tác đã thành công trong việc lấy ra các field được chỉ định.

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>"; 
}
Tương tự để giới hạn kết quả trả về, tôi cũng có cú pháp như sau. limit() , vị trí đầu tiên là tổng số record tôi muốn hiển thị trong một trang, vi trí thứ 2 chính là vi trí bắt đầu để lấy record. nó khác câu truy vấn bình thường ở chỗ hoán đổi vị trí một tí nhé. ví dụ tôi muốn lấy 7 record, và vị trí bắt đầu của tôi là 0, tôi có limit(7, 0).
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>";
}
Để thực thi một mệnh đề điều kiện, liệt kê va lấy ra user nào có level = 2 thì tôi có cú pháp như sau where(“level”, “2″), level tương ứng với field, level muốn lấy đương nhiên là bằng 2 rồi.
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>";
}
Kết quả trả về như sau xem như thao tác đã thành công.

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();
Với active record thì mọi thứ trở nên rất là đơn giản như cân đường hộp sữa ấy. với phương thức select_min(“id”) bài toán xem như được giải quyết.
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>";
}
Tiếp theo, tôi sẽ hướng dẫn các bạn ba thao tác quan trọng nhất trong active record, chính là insert, update, delete. Đầu tiên tôi sẽ hướng dẫn cách bạn cách insert. Để insert một record ta cần phải thao tác với mảng, và cú pháp của câu truy vấn như sau.
$this->db->insert("table", tên biến truyền vào)
Đoạn code insert:
public function index2(){
        $data=array(
            "username" => "kaito",
            "password" => "1212445",
            "level"    => "2",
        );
        $this->db->insert("user", $data);
         
    }
Kiểm tra bằng cách, chạy link localhost/citest/index.php/user/index2 , sau đó quay trở lại action index xem kết quả, nếu kết quả trả về như sau, xem như thao tác thành công.

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)
Đoạn code update:
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";
        }
         
    }
Tôi tiến hành update id = 5, ứng với username là kaito, tôi cho level của nó là 1, nếu màn hình trình duyệt trả về cho tôi là “Update Thanh Cong” xem như tôi đã hoàn thành việc update một record. kiểm tra bằng cách chạy link localhost/citest/index.php/user/index3, quay trở lại action index để xem kết quả.

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")
Đoạn code Delete:
public function index4(){
        $this->db->where("id", "5");
        if($this->db->delete("user")){
            echo "Xoa thanh cong";
        }else{
            echo "Xoa that bai";
        }
    }
Tôi xóa id = 5, chạy link localhost/citest/index.php/user/index4 để tiến hành xóa id tương ứng với username là kaito, quay lại action index xem kết quả nhé, username kaito đã biến mất. Như vậy tôi và các bạn đã cùng nhau tìm hiểu các thao tác active record trong CI, và điều tôi muốn các bạn lưu ý rằng, các thao tác này không nên viết trong controller nó trái với nguyên tắc của CI, bản thân của controller không tương tác trực tiếp với database, để làm việc tốt với nó chúng ta sẽ thao tác trong model nhé.

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();
    }
}
?>
Xem như khai báo xong model muser rồi nhé, để tiến hành lấy toàn bộ record trong table user ta sẽ viết như thế nào. Tôi tạo một function có tên là listUser. thao tác database thì y chang phần action index của controller user, khác có tí là lấy kết quả thì ta cần return để trả kết quả về, y chang cách viết function trong php thuần.
<?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();
    }
}
?>
Tại controller user tôi tạo action index5 do làm việc với model nên ta cũng sẽ phải thao tác với view để show dữ liệu, tại thư mục application/views tôi tạo file list_view.php. nội dung code trong file list_view chỉ là test dữ liệu trong cặp thẻ pre mà thôi.
echo "<pre>";
print_r($data);
echo "</pre>";
Trong action index5 tôi có đoạn code khá là basic nhen, đầu tiên sẽ tiến hành load model ra, sau đó gọi model muser lên sử dụng, truyền tham số vào view thế là xong,tham số khi truyền từ controller sang sẽ bị chuyển 1 lần, vì thế cần phải lưu dữ liệu dưới dạng mảng.

 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()
- Đếm số record:
$this->db->num_rows()
- Lấy tất cả record:
$this->db->result_array()
- Lấy 1 dòng record:
$this->db->row_array()
Active Record:
- Thực thi câu truy vấn:
$this->db->get("table")
- Liệt kê những cột muốn hiển thị:
$this->db->select("cols1", "cols2")
- Sắp xếp kết quả:
$this->db->order_by("id desc")
- Giới hạn kết quả:
$this->db->limit(7, 0)
- Liệt kê dữ liệu với điều kiện:
$this->db->where("cols", "var")
- Thêm record:
$this->db->insert("table", $tenbien)
- Sửa record:
$this->db->update("table", $tenbien)
- Xóa record:
$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.

Cùng chuyên mục:

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Chia sẻ theme web blog mobile đơn giản (Theme FMB1)

Freetuts Mobile Blog được code trên nền tảng PHP và MySQL, sử dụng Codeigniter Framework.

Bài 19: Rewrite URL trong Codeigniter

Bài 19: Rewrite URL trong Codeigniter

Sau một khoảng thời gian không đụng tới Codeigniter thì hôm nay lại có dịp…

Tìm hiểu quy trình load model trong codeigniter

Tìm hiểu quy trình load model trong codeigniter

Việc load model rất quen thuộc với những bạn sử dụng framwork codeigniter nhưng đôi…

Tự tạo thư viện load widget trong codeigniter

Tự tạo thư viện load widget trong codeigniter

Như các bạn biết mặc định hệ thống của Codeigniter hoạt động theo mô hình…

Hướng dẫn custom bộ core codeigniter

Hướng dẫn custom bộ core codeigniter

Có khi nào bạn đặt câu hỏi có nên sửa các file nằm trong bộ…

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Bài 18: Tìm Hiểu Library Shopping Cart trong Codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net. Như vậy ở bài trước chúng…

Bài 17: Xây dựng crud add - update - edit user

Bài 17: Xây dựng crud add - update - edit user

Crud là một thuật ngữ không hề xa lạ với dân lập trình, nó là…

Bài 16: Kỹ thuật master layout trong codeigniter

Bài 16: Kỹ thuật master layout trong codeigniter

Đây là một vấn đề mở rộng mà CI không đề cập trong user guide,…

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Bài 15: Tìm Hiểu Helper Language Trong Codeigniter

Trong bài viết này , chúng ta chỉ tìm hiểu ở khái niệm cơ bản…

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Bài 14: Tìm Hiểu Helper Text Trong Codeigniter

Nhìn tiêu đề, hẳn các bạn đã đoán ra hôm nay chúng ta sẽ tìm…

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Bài 13: Tìm Hiểu Helper Date Trong Codeigniter

Hôm nay chúng ta sẽ tiếp tục tìm hiểu sâu hơn về các helper mà…

Bài 12: Đóng dấu watermark image trong codeigniter

Bài 12: Đóng dấu watermark image trong codeigniter

Đầu tiên xin gửi lời cảm ơn các bạn đã quan tâm và theo dõi…

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Bài 11: Tìm Hiểu Library Image Trong Codeigniter

Kết thúc bài trước, chúng ta đã hoàn thành khá xuất sắc phần upload hình…

Bài 10: Tìm hiểu library upload trong codeigniter

Bài 10: Tìm hiểu library upload trong codeigniter

Chào mừng các bạn đã quay trở lại freetuts.net, đã lâu rồi tôi không viết…

Bài 9: Tìm Hiểu Library Form Validation

Bài 9: Tìm Hiểu Library Form Validation

Cho tới bài viết này, chắc hẵn các bạn đều đã biết rõ cách load…

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Bài 8: Tìm hiểu Helper Url Và Form Trong Codeigniter

Trong Codeigniter Framework nó chia ra 2 khái niệm đó là helper & library, vậy…

Bài 7: Load Library Pagination Trong Codeigniter

Bài 7: Load Library Pagination Trong Codeigniter

Đây là một library cũng khá là phổ biến, hay được sử dụng trong quá…

Bài 5: Load Library Session Trong Codeigniter

Bài 5: Load Library Session Trong Codeigniter

Đây là một thư viện khá là quan trọng , trong framework CI (Codeigniter) .…

Bài 4: Load Model Trong Codeigniter

Bài 4: Load Model Trong Codeigniter

Trong Codeigniter để kết nối với Database chúng ta phải cấu hình thông tin cho…

Bài 3: Load View Trong Codeigniter

Bài 3: Load View Trong Codeigniter

Trong Codeigniter tất cả các Views đều được đặt trong thư mục application/views. Các bạn…

Top