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.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.