hongthanh.net

Hướng dẫn cấu hình kết nối và sử dụng MySQL trong CodeIgniter 4

Hướng dẫn cấu hình kết nối và sử dụng MySQL trong CodeIgniter 4
CodeIgniter 4 cung cấp sẵn lớp Database mạnh mẽ, giúp việc kết nối và thao tác với MySQL trở nên đơn giản hơn rất nhiều so với việc viết truy vấn thuần. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách cấu hình kết nối MySQL và các cách sử dụng phổ biến nhất trong CodeIgniter 4.

1. Chuẩn bị môi trường

Trước khi bắt đầu, bạn cần đảm bảo:

  • Đã cài đặt PHP 8.1 trở lên (khuyến nghị PHP 8.2+).
  • Đã cài đặt MySQL 5.7+ hoặc MariaDB 10.3+.
  • Đã cài đặt CodeIgniter 4 thông qua Composer hoặc tải trực tiếp từ trang chủ.
  • Đã bật extension mysqli hoặc pdo_mysql trong php.ini.

2. Cấu hình kết nối MySQL

CodeIgniter 4 lưu cấu hình kết nối cơ sở dữ liệu trong file app/Config/Database.php. Bạn có thể chỉnh sửa trực tiếp file này, hoặc sử dụng file .env để ghi đè cấu hình (khuyến nghị dùng cách này để bảo mật thông tin).

2.1. Cấu hình qua file .env (khuyến nghị)

Trong thư mục gốc của project, sao chép file env thành .env (nếu chưa có), sau đó mở file và bỏ comment các dòng sau:

database.default.hostname = localhost
database.default.database = my_database
database.default.username = root
database.default.password =
database.default.DBDriver = MySQLi
database.default.DBPrefix =
database.default.port = 3306

Giải thích các tham số:

  • hostname: Địa chỉ máy chủ MySQL, thường là localhost hoặc 127.0.0.1.
  • database: Tên cơ sở dữ liệu bạn muốn kết nối.
  • username: Tên tài khoản MySQL.
  • password: Mật khẩu tương ứng.
  • DBDriver: Trình điều khiển kết nối, có thể là MySQLi hoặc Postgre, SQLite3...
  • DBPrefix: Tiền tố bảng, ví dụ ci_ nếu bạn muốn tất cả bảng có tiền tố.
  • port: Cổng kết nối, mặc định MySQL là 3306.

2.2. Cấu hình trực tiếp trong Database.php

Nếu không dùng file .env, bạn có thể sửa trực tiếp mảng $default trong app/Config/Database.php:

<?php

namespace Config;

use CodeIgniter\Database\Config;

class Database extends Config
{
    public $defaultGroup = 'default';

    public $default = [
        'DSN'      => '',
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'my_database',
        'DBDriver' => 'MySQLi',
        'DBPrefix' => '',
        'pConnect' => false,
        'DBDebug'  => true,
        'charset'  => 'utf8mb4',
        'DBCollat' => 'utf8mb4_general_ci',
        'swapPre'  => '',
        'encrypt'  => false,
        'compress' => false,
        'strictOn' => false,
        'failover' => [],
        'port'     => 3306,
    ];
}

Lưu ý: Giá trị trong file .env sẽ ghi đè giá trị trong Database.php, vì vậy bạn chỉ nên cấu hình ở một nơi để tránh nhầm lẫn.

3. Kiểm tra kết nối

Sau khi cấu hình, bạn có thể kiểm tra kết nối bằng cách tạo một controller đơn giản:

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class DbTest extends Controller
{
    public function index()
    {
        $db = \Config\Database::connect();

        if ($db->connect()) {
            echo 'Kết nối MySQL thành công!';
        } else {
            echo 'Kết nối thất bại!';
        }
    }
}

Truy cập đường dẫn tương ứng để kiểm tra. Nếu thành công, bạn đã sẵn sàng thao tác với dữ liệu.

4. Các cách sử dụng MySQL trong CodeIgniter 4

4.1. Sử dụng Query Builder

Query Builder giúp bạn xây dựng truy vấn bằng các phương thức, hạn chế việc viết SQL thuần và tăng tính bảo mật.

<?php

$db = \Config\Database::connect();

// Lấy tất cả bản ghi trong bảng users
$users = $db->table('users')->get()->getResult();

// Lấy một bản ghi theo điều kiện
$user = $db->table('users')->where('id', 1)->get()->getRow();

// Thêm bản ghi mới
$data = [
    'name'  => 'Nguyễn Văn A',
    'email' => 'a@example.com',
];
$db->table('users')->insert($data);

// Cập nhật bản ghi
$db->table('users')->where('id', 1)->update(['name' => 'Nguyễn Văn B']);

// Xóa bản ghi
$db->table('users')->where('id', 1)->delete();

4.2. Sử dụng Model

Model là lớp trung gian giúp bạn thao tác với một bảng cụ thể. Đây là cách được khuyến nghị trong các dự án thực tế.

Tạo file app/Models/UserModel.php:

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table      = 'users';
    protected $primaryKey = 'id';
    protected $allowedFields = ['name', 'email', 'password'];
    protected $useTimestamps = true;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
}

Sử dụng Model trong controller:

<?php

namespace App\Controllers;

use App\Models\UserModel;

class User extends BaseController
{
    public function index()
    {
        $model = new UserModel();

        // Lấy tất cả người dùng
        $users = $model->findAll();

        // Lấy một người dùng theo id
        $user = $model->find(1);

        // Thêm người dùng mới
        $model->insert([
            'name'  => 'Trần Thị C',
            'email' => 'c@example.com',
        ]);

        // Cập nhật
        $model->update(1, ['name' => 'Trần Thị D']);

        // Xóa
        $model->delete(1);

        // Trả về view
        return view('users/index', ['users' => $users]);
    }
}

4.3. Truy vấn SQL thuần

Khi cần các truy vấn phức tạp, bạn vẫn có thể viết SQL thuần thông qua phương thức query():

<?php

$db = \Config\Database::connect();

// Truy vấn có tham số (chống SQL Injection)
$sql = "SELECT * FROM users WHERE email = ?";
$query = $db->query($sql, ['a@example.com']);
$user = $query->getRow();

// Truy vấn không tham số
$query = $db->query("SELECT COUNT(*) AS total FROM users");
$row = $query->getRow();
echo $row->total;

4.4. Sử dụng nhiều kết nối cơ sở dữ liệu

CodeIgniter 4 hỗ trợ nhiều nhóm kết nối. Bạn có thể khai báo thêm trong Database.php:

public $secondDb = [
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'another_database',
    'DBDriver' => 'MySQLi',
    'port'     => 3306,
];

Và gọi bằng:

$db2 = \Config\Database::connect('secondDb');
$data = $db2->table('products')->get()->getResult();

5. Một số lưu ý quan trọng

  • Luôn đặt DBDebug thành false khi triển khai production để tránh lộ thông tin lỗi.
  • Sử dụng utf8mb4 làm charset để hỗ trợ đầy đủ tiếng Việt và emoji.
  • Nên dùng Model thay vì Query Builder thuần cho các thao tác CRUD để code gọn gàng và dễ bảo trì.
  • Không lưu thông tin đăng nhập trực tiếp trong Database.php nếu đẩy code lên Git; hãy dùng file .env và thêm vào .gitignore.
  • Đối với truy vấn có tham số người dùng nhập, luôn dùng binding (?) để phòng chống SQL Injection.

6. Kết luận

Việc cấu hình và sử dụng MySQL trong CodeIgniter 4 rất linh hoạt, từ Query Builder, Model cho đến SQL thuần. Tùy vào quy mô và yêu cầu dự án, bạn có thể chọn cách tiếp cận phù hợp. Với các dự án thực tế, việc kết hợp Model và Query Builder thường mang lại hiệu quả cao nhất về cả tốc độ phát triển lẫn khả năng bảo trì.

Chúc bạn cấu hình thành công và khai thác hiệu quả sức mạnh của CodeIgniter 4 cùng MySQL!

Chia sẻ