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

databaseManagement.jpg

Tổng Quan

CI cung cấp cho người phát triển một class để giúp chúng ta dễ dàng hơn trong việc thao tác với cơ sở dữ liệu đó chính là database class. Database class có đầy đủ tính năng - "full-featured", nó hỗ trợ cả câu lệnh truy vấn truyền thống và Active Record. Các chức năng mà database class cung cấp tương đối rõ ràng, cú pháp đơn giản.

Cấu hình database

CI cung cấp cho bạn một file config cho phép lưu trữ thông tin kết nối đến database của bạn (username, password, host ....) . File config là database.php (các bạn có thể truy cập theo đường dẫn: application/config/database.php ) bạn có thể cấu hình kết nối đến nhiều môi trường phát triển tương ứng (dev, test, production...).

Toàn bộ thông tin cấu hình được lưu trữ vào một mảng nhiều chiều, dưới đây là những thông tin config hay được sử dụng:


$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

Lý do cho việc sử dụng mảng nhiều chiều để config thông tin kết nối đến database là nó dễ dàng cho phép bạn tùy chọn để lưu trữ thông tin kết nối đến nhiều database. Bạn đang phát triển và ứng dụng phải chạy trên nhiều môi trường chúng ta sẽ phải thay đổi thông tin kết nối database tương ứng cho từng môi trường (deverlopment, production, test, etc.) một cách đơn giản để giải quyết vấn đề này là thiết lập nhiều thông tin kết nối cho những môi trường khác nhau và tùy vào môi trường đang chạy mà hệ thống sẽ lấy thông tin config tương ứng. VD: Môi trường "test" - test environment


$db['framgia']['hostname'] = "localhost";
$db['framgia']['username'] = "root";
$db['framgia']['password'] = "";
$db['framgia']['database'] = "database_name";
$db['framgia']['dbdriver'] = "mysql";
$db['framgia']['dbprefix'] = "";
$db['framgia']['pconnect'] = TRUE;
$db['framgia']['db_debug'] = FALSE;
$db['framgia']['cache_on'] = FALSE;
$db['framgia']['cachedir'] = "";
$db['framgia']['char_set'] = "utf8";
$db['framgia']['dbcollat'] = "utf8_general_ci";
$db['framgia']['swap_pre'] = "";
$db['framgia']['autoinit'] = TRUE;
$db['framgia']['stricton'] = FALSE;

Sau khi đã thiết lập kết nối cho những môi trường khác thì bạn chỉ cần thiết lập trên hệ thống như sau, ví dụ cho môi trường test - "framgia"

$active_group = "framgia";

Note: "default" sẽ được hệ thống lấy làm thông tin kết nối mặc định khi có nhiều thông tin connect db Tên môi trường là do bạn tự định nghĩa

Active Record

**Active Record class trên toàn hệ thống được kích hoạt hoặc vô hiệu hóa bằng cách thiết lập giá trị cho biến $active_record bằng TRUE hoặc FALSE. **

$active_record = TRUE; //enable
/* $active_record = FALSE; //disable */

Mặc định thì hệ thống sẽ tự động set active record là enbale, nếu bạn không dùng đến active record thì nên vộ hiệu hóa nó để tránh lãng phí tài nguyên của hệ thống.

Example Code

Note: tất cả những trang yêu cầu lấy dữ liệu trong db thì cần phải có khai báo kết nối database ($this->load->database()😉 hoặc bạn có thể tự động load database class

Câu lệnh truy vấn với kết quả là mảng Object

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

foreach ($query->result() as $row)
{
    echo $row->title;
    echo $row->name;
    echo $row->email;
}

echo 'Total Results: ' . $query->num_rows();

Kết quả của truy vấn trên sẽ trả về một mảng các object. Ví dụ: $row->title

Câu lệnh truy vấn với kết quả là Array

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

foreach ($query->result_array() as $row)
{
    echo $row['title'];
    echo $row['name'];
    echo $row['email'];
}

Kết quả của truy vấn trên sẽ trả về một mảng các phần tử theo index Ví du: $row['title']

Câu lệnh truy vấn với kết quả một Object

$query = $this->db->query('SELECT title FROM my_table LIMIT 0, 1');

$row = $query->row();
echo $row->title;

Kết quả của truy vấn trên sẽ trả về một object. VD: $row->title

Câu lệnh truy vấn với kết quả một Array

$query = $this->db->query('SELECT title FROM my_table LIMIT 0, 1');

$row = $query->row_array();
echo $row['title'];

Kết quả của truy vấn trên sẽ trả về array có một phần tử VD: $row['title']

Quy vấn dữ liệu với Active Record

$query = $this->db->get('table_name');

foreach ($query->result() as $row)
{
    echo $row->title;
}

Insert dữ liệu với câu lệnh Query

$sql = "INSERT INTO mytable (title, name)
        VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";

$this->db->query($sql);

echo $this->db->affected_rows();

Insert dữ liệu với câu lệnh Query

$sql = "INSERT INTO mytable (title, name)
        VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";

$this->db->query($sql);

echo $this->db->affected_rows();

Insert dữ liệu với Active Record

$data = array(
               'title' => $title,
               'name' => $name,
               'date' => $date
            );

$this->db->insert('mytable', $data);

// Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')

Thông tin tham khảo Param

  • hostname: địa chỉa của server cần kết nối đến csdl
  • username: tài khoản người dùng để kết nối đến csdl
  • password: mật khẩu để connect tới csdl
  • dbdriver: lựa chọn loại db bạn đang kết nối đến. Ex: mysql, postgres, odbc..
  • dbprefix: tiền tố cho các table trong db
  • port: cổng kết nối đên csdl
  • etc.

(Có tham khảo thông tin từ tài liệu hướng dẫn của CI) Framgia-LiemTD