Tìm hiểu về Database Library trong CI (phần 2)

5e4977d465812fa66ae79e601420848fb69950be.jpg

Tổng Quan

Ở phần trước mình đã giới thiệu với các bạn về các class config và lấy dữ liệu đơn gian từ database thông qua các những tiện ích mà database library cung cấp. Ở phần này sẽ tiếp tục giới thiệu thêm ba tiện ích được sử dụng nhiều đó là Result Helper và Transactions.

Result Helper

Result Helper hay còn được gọi là Result Helper Functions nó không phải là một function cụ thể mà là nhiều function được viết ra nhằm mục đích sử dụng hỗ trợ cho các kết qủa truy vấn sql.

Cùng xét một ví dụ để hiểu thêm về nó:

$query = $this->db->query('SELECT * FROM my_table');

$arr = $query->row_array();
// ...

Ví dụ trên là câu lệnh truy vấn với kết quả trả về một Array

Khi thực thi câu lệnh trong ví dụ trên hệ thống sẽ trả về một array chứa toàn bộ dữ liệu của table my_table vừa lấy về được. Để đếm số bản ghi có trong bảng my_table ta có thể count trực tiếp số phần tử của mảng trả về

$query = $this->db->query('SELECT * FROM my_table');

$arr = $query->row_array();
// Total record
$records = count($arr);

ngoài ra bạn có thể sử dụng câu lệnh quy vấn đề lấy về trực tiếp số bản ghi có trong db bằng cách thực hiện câu lệnh select count(*) ...


// Total record
$query = $this->db->query('SELECT COUNT(*) FROM my_table');

nếu bạn muốn sử dụng 2 cách trên thì có thể sử dụng Result Helper được cung cấp sẵn trong database library như sau $query->num_rows() :


$query = $this->db->query('SELECT * FROM my_table');
// Total record
echo $query->num_rows();

Ở ví trên ta thấy được rằng thuộc tính num_rows() trả về số lượng bản ghi có trong table my_table cú pháp rất đơn giản. Mặc định khi thực một query bất kỳ thì num_rows() luôn tồn tại.

** num_rows() **

  • Cú pháp thực hiện đơn gian, đã được xây dựng sẵn chỉ việc gọi
  • Giam việc xử lý cho hệ thống khi thực hiện query thì gía trị của num_rows() được set một cách tự động. chúng ta không cần phải count lại array kết qủa hoặc thực hiện câu lệnh sql để count lại nữa.

** num_fields() **

Tương tự như số lượng bản ghi thì số lượng trường trong bảng cũng được lấy về một cách dễ dàng thông qua num_fields() của result query thay vì phải đếm từ kết quả hoặc thực hiện thêm query mới


$query = $this->db->query('SELECT * FROM my_table');
//Số trường của bảng my_table
echo $query->num_fields();

** free_result() **

free_result() là function sinh ra để dung cho vấn đề giai phóng bộ nhớ khi thực hiện một câu lệnh truy vấn. Thông thường thì PHP sẽ thực hiện giai phóng bộ nhớ vào cuối kỳ thực thi script. Tuy nhiên nếu có nhiều truy vấn được thực hiện và bạn có thể sử dụng nó để giải phóng bộ nhớ sau mỗi kết qủa truy vấn để cắt giam dung lượng sử dụng trong bộ nhớ.

$query = $this->db->query('SELECT title FROM my_table');

foreach ($query->result() as $row)
{
   echo $row->title;
}
$query->free_result(); // giai phóng bộ nhớ cho kết qủa query SELECT title ....
$query2 = $this->db->query('SELECT name FROM my_table');

$row = $query2->row();
echo $row->name;
$query2->free_result(); // giai phóng bộ nhớ cho kết qủa query SELECT name ....

Trên đây là ba ví dụ đơn gian để giup các bạn hiểu thêm về Result Helper Functions.

Transactions

CI hỗ trợ bạn sử dụng transaction nó có sẵn trong database library nên bạn không cần phải config thêm gì mà cứ thế sử dụng. Lưu ý trong MySQL hỗ trợ transaction cho cấu trúc bảng sử dụng engine InnoDB.

Để chạy câu lệnh query với transacition bạn sẽ phải khai báo thêm 2 dòng lệnh này trans_start()trans_complete() để cho hệ thống nhận biết được nơi bắt đầu và kết thúc một transaction.


$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
//.... query....
$this->db->trans_complete();

Bạn có thể chạy nhiều lệnh trong trans_start()trans_complete() những câu lệnh query đó sẽ được commit nếu ok và có thể được rollback nếu như gặp vấn đề trong qúa trình thực thi

Chế độ nghiêm ngặt - Strict Mode

Mặc định CI sẽ chạy tất cả transaction ở chế độ Strict Mode. Strict Mode mặc định được enable và nếu bạn chạy nhiều nhóm transaction ở cùng thời điểm nếu một nhóm bị lỗi thì tất cả các nhóm khác sẽ tư động được rollback. Nếu Strict mode bị disable thì các nhóm tracsaction sẽ hoạt động độc lập và chỉ nhóm nào gặp lỗi mới rollback nhóm khác vẫn thực thi bình thường.

Để disable strict mode chúng ta sử dụng câu lệnh:


$this->db->trans_strict(FALSE);

Test Mode

Bạn có thể lựa chọn chế độ test mode, ở chế độ này mọi thứ sẽ được rollback kể cả nó có hợp lệ hay không. Để sử dụng chế độ này bạn chỉ càn truyền gía trị TRUE vào $this->db->trans_start()

$this->db->trans_start(TRUE); // Câu lệnh query sẽ được rollback lại
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
  • Để check trạng thái query ta sử dụng $this->db->trans_status()
  • Để rollback lại ta sử dụng $this->db->trans_rollback();
  • Để commit ta sử dụng $this->db->trans_commit();

Ví dụ cho sử dụng transaction tự điều hướng commit hoặc rollback

$this->db->trans_begin();

$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');

if ($this->db->trans_status() === FALSE){
    $this->db->trans_rollback();
} else {
    $this->db->trans_commit();
}

Note: chỉ sử dụng $this->db->trans_start() cho chế độ test mode và không dùng $this->db->trans_start() trong mode bình thường

Trên đây là một vài ví dụ để giup các bạn hiểu thêm về Result Helper và Transactions trong database library.

Chúc các bạn một ngaỳ làm việc vui vẻ !

(Bài viết có tham khảo tài liệu user guide của CI.)