DATABASE (PHẦN 10)
CodeIgniter cung cấp rất nhiều phương thức hỗ trợ lập trình viên tương tác với DB nhanh chóng. Việc sử dụng các phương thức tương tác với DB cũng được chia làm hai nhóm chính:
- Nhóm thực thi câu SQL thuần.
- Nhóm sử dụng query builder.
Tôi sẽ trình bày theo cách truy vấn SQL thuần trước để các bạn dễ nắm bắt vấn đề.
Để thực thi một câu lệnh SQL các bạn thực hiện như sau:
Mã:
$this->db->query('Nội_dung_SQL');
CodeIgniter cung cấp sẳn cho các bạn việc khai báo các bảng dữ liệu có prefix (Tiền tố) và khi sử dụng các bạn có thể dễ dàng thay đổi prefix của bảng dữ liệu mà không cần thiết phải chỉnh sửa lại code của mình.
Nếu các bạn có sử dụng prefix cho bảng dữ liệu, các bạn sẽ phải dùng câu lệnh sau để lấy tên bảng theo prefix đó như sau:
Mã:
$this->db->dbprefix('Tên_bảng_dữ_liệu');
Ví dụ các bạn có bảng dữ liệu tên là tbl_blog (Với prefix là tbl_) thì khi sử dụng các bạn chỉ việc gọi như sau:
PHP:
$this->db->dbprefix('blog');
Cậu lệnh trên sẽ tự động hiểu ngầm là các bạn đang dùng tới bản tbl_blog.
Nhược điểm của việc thực thi SQL theo kiểu này đó là khả năng bị tấn công SQL injection nên các bạn cần phải sử dụng thêm các phương thức sau để lọc dữ liệu đầu vào như sau:
1. $this->db->escape():
Phương thức này sẽ lọc các ký tự có thể gây ra lỗi SQL như dấu ` ' " ...
Khi sử dụng phương thức này thì sẽ tự động chèn dấu nháy đơn ở 2 đầu của chuổi nên bạn không cần phải làm điều này.
Ví dụ:
PHP:
$sql = "INSERT INTO tbl_blog (title) VALUES(" . $this->db->escape($title) . ")";
2. $this->db->escape_str():
Phương thức này tương tự như phương thức $this->db->escape() chỉ khác là phương thức này sẽ không tự động thêm dấu nháy đơn '.
Ví dụ:
PHP:
$sql = "INSERT INTO tbl_blog (title) VALUES('" . $this->db->escape_str($title) . "')";
Các bạn để ý thật kỹ hai ví dụ trên các bạn sẽ thấy được sự khác biệt về việc sử dụng dấu nháy đơn '.
3. $this->db->escape_like_str():
Phương thức này cũng có chức năng tương tự như hai phương thức trên nhưng nó được sử dụng cho trường hợp LIKE.
Và vấn đề cuối cùng cho cách sử dụng này là sử dụng theo kiểu binding như sau:
Các bạn xem hai dòng lệnh dưới đây:
PHP:
$sql = "SELECT * FROM tbl_blog WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(1, 'active', 'filiallion'));
Ở đây, tôi không gán trực tiếp id = 1 hay status = active mà sẽ thay giá trị bằng dấu hỏi "?" và sẽ gán nó ở tham số thứ hai của $this->db->query() bằng một mãng giá trị và sắp xếp theo đúng thứ tự. Tức là câu SQL trên sẽ được dịch lại thành:
Mã:
SELECT * FROM tbl_blog WHERE id = 1 AND status = 'active' AND author = 'filiallion'
Với cách sử dụng này thì các bạn sẽ không cần phải sử dụng các hàm an toàn ở trên vì CodeIgniter đã xử lý giúp các bạn.
Ngoài cách sử dụng theo SQL thuần như trên thì CodeIgniter còn cung cấp rất nhiều phương thức giúp việc truy vấn SQL trở nên nhanh chóng và an toàn hơn gọi là query builder. Sau đây tôi sẽ trình bày với các bạn một số phương thức theo kiểu query builder để cập nhật dữ liệu như sau:
1. Insert:
CodeIgniter sẽ tự động tạo ra một chuỗi truy vấn để insert dữ liệu vào DB thông qua một mãng dữ liệu đầu vào theo ví dụ:
PHP:
$data = array(
'title' => 'title' ,
'status' => 'active',
'author' => 'filiallion'
);
$this->db->insert('tbl_blog', $data);
Khối lệnh trên tương ứng với câu lệnh SQL sau:
Mã:
INSERT INTO tbl_blog (title, status, author) VALUES ('title', 'active', 'filiallion')
Dữ liệu insert có thể là một mãng hoặc một đối tượng đều được.
Nếu các bạn muốn thực hiện insert nhiều dòng dữ liệu cùng lúc, các bạn có thể tìm hiểu thêm phương thức $this->db->insert_batch().
2. Update:
Các bạn xét ví dụ sau:
PHP:
$data = array(
'title' => 'New title' ,
'status' => 'inactive',
'author' => 'Lê Trung Hiếu'
);
$this->db->where('id', 1);
$this->db->update('tbl_blog', $data);
Khối lệnh trên tương ứng với câu lệnh SQL sau:
PHP:
UPDATE tbl_blog SET title = 'New title', status = 'inactive', author = 'Lê Trung Hiếu' WHERE id = 1
Về điều kiện update, các bạn khai báo trong phương thức $this->db->where().
Dữ liệu update có thể là một mãng hoặc một đối tượng đều được.
3. Delete:
Các bạn xét ví dụ sau:
PHP:
$this->db->delete('tbl_blog', array('id' => 1));
Câu lệnh trên tương ứng với câu SQL sau:
Mã:
DELETE FROM tbl_blog WHERE id = 1
Ngoài cách truyền điều kiện xóa vào tham số thứ hai, các bạn còn có thể thực hiện điều kiện xóa bằng phương thức $this->db->where() như ví dụ sau:
PHP:
$this->db->where('id', 1);
$this->db->delete('tbl_blog');
Các bạn tìm hiểu thêm về database tại địa chỉ
https://www.codeigniter.com/user_guide/database/index.html.