CodeIgniter Active Record: Truy vấn Chèn, Cập nhật, Xóa

⚡ Tóm tắt thông minh

CodeIgniter Active Record là một mẫu thiết kế cho phép mô hình đọc và ghi vào cơ sở dữ liệu bằng các chuỗi phương thức đơn giản và an toàn. Nó hỗ trợ các thao tác chèn, chọn, cập nhật và xóa trên các công cụ cơ sở dữ liệu khác nhau mà không cần viết lại mã, và nó tham số hóa đầu vào để ngăn chặn tấn công SQL injection.

  • 🔗 Ý tưởng cốt lõi: Active Record bao bọc các câu lệnh SQL trong các lệnh gọi phương thức như insert, get, update và delete.
  • 🛡️ An toàn: Các giá trị được truyền dưới dạng tham số, điều này giúp bảo vệ chống lại tấn công SQL injection.
  • 🔄 Linh hoạt: Cùng một đoạn mã có thể sử dụng được trên mọi nơi. MySQL, SQL Server và các hệ điều hành khác thông qua trình điều khiển cơ sở dữ liệu.
  • ⚙️ Thành lập: Cấu hình file database.php và tự động tải thư viện cơ sở dữ liệu.
  • ➕ Chèn: $this->db->insert('table', $data) xây dựng và thực thi câu lệnh INSERT.
  • 🔍 Chọn: $this->db->get('table') trả về các hàng để lặp qua.
  • ✏️ Cập nhật và xóa: Mệnh đề WHERE kết hợp với lệnh UPDATE hoặc DELETE sẽ thay đổi hoặc xóa các hàng.

CodeIgniter Active Record CRUD

Dữ liệu là huyết mạch của hầu hết các ứng dụng. Nó cần được lưu trữ để có thể phân tích, từ đó cung cấp thông tin chi tiết và hỗ trợ các quyết định kinh doanh. Dữ liệu thường được lưu trữ trong cơ sở dữ liệu. Một trong những mối quan ngại chính khi tương tác với cơ sở dữ liệu là bảo mật, tính dễ truy cập và việc triển khai Ngôn ngữ truy vấn có cấu trúc (SQL) cụ thể của nhà cung cấp cơ sở dữ liệu.

Active Record là một mẫu thiết kế giúp tương tác với cơ sở dữ liệu một cách dễ dàng, an toàn và hiệu quả. Active Record có những ưu điểm sau:

  • Chèn, cập nhật và xóa bản ghi bằng chuỗi phương thức đơn giản.
  • Gửi dữ liệu do người dùng nhập vào một cách an toàn bằng cách sử dụng các tham số.
  • Cho phép bạn làm việc với nhiều công cụ cơ sở dữ liệu như MySQL và SQL Server mà không cần viết lại mã ứng dụng.
  • CodeIgniter sử dụng các trình điều khiển dành riêng cho từng công cụ cơ sở dữ liệu ở chế độ nền.

Cách sử dụng Active Record: Ví dụ

Trong hướng dẫn này, chúng ta sẽ sử dụng một cơ sở dữ liệu mẫu với hai bảng, một bảng chứa đơn đặt hàng và một bảng chứa chi tiết. Hướng dẫn này giả định bạn đã có sẵn... MySQL Cơ sở dữ liệu đã được cài đặt và đang chạy. Hãy chạy các tập lệnh sau để tạo cơ sở dữ liệu hướng dẫn:

CREATE SCHEMA ci_active_record;

USE ci_active_record;

CREATE TABLE `order_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`item` varchar(245) DEFAULT NULL,
`quantity` int(11) DEFAULT '0',
`price` decimal(10,2) DEFAULT '0.00',
`sub_total` decimal(10,2) DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NULL DEFAULT NULL,
`customer_name` varchar(245) DEFAULT NULL,
`customer_address` varchar(245) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

Đoạn mã trên tạo một cơ sở dữ liệu có tên là ci_active_record và hai bảng, orders và order_details. Mối quan hệ giữa hai bảng được xác định bởi cột id trong bảng orders và order_id trong bảng order_details.

CodeCấu hình cơ sở dữ liệu Igniter

Bây giờ chúng ta sẽ cấu hình ứng dụng để giao tiếp với cơ sở dữ liệu này. Mở tệp cấu hình cơ sở dữ liệu nằm trong thư mục application/config/database.php và tìm các dòng sau:

'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',

Cập nhật đoạn mã trên thành đoạn mã sau:

'hostname' => 'localhost',
'username' => 'root',
'password' => 'letmein',
'database' => 'ci_active_record',

Lưu ý: Bạn cần thay thế tên người dùng và mật khẩu bằng thông tin trùng khớp với tài khoản của mình. MySQL cấu hình.

Ngoài các chi tiết cấu hình cơ sở dữ liệu, chúng ta cũng cần phải nói với ai đó rằng: CodeIgniter sẽ tải thư viện cơ sở dữ liệu khi nó được khởi chạy.

Bước 1) Mở tệp sau: application/config/autoload.php.

Bước 2) Tìm các thư viện khóa mảng `$autoload` và tải thư viện cơ sở dữ liệu như hình bên dưới:

$autoload['libraries'] = array('database');

Đây:

  • Đoạn mã trên tải thư viện cơ sở dữ liệu khi ứng dụng khởi chạy.

CodeIgniter Chèn Bản Ghi Hoạt Động

Để phục vụ mục đích thử nghiệm, chúng ta sẽ tạo một controller và định nghĩa các route để tương tác với ứng dụng thông qua Active Record. Tạo một file mới tại application/controllers/ActiveRecordController.php và thêm đoạn mã sau:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class ActiveRecordController extends CI_Controller {
public function store_order(){
$data = [
'date' => '2018-12-19',
'customer_name' => 'Joe Thomas',
'customer_address' => 'US'
];

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

echo 'order has successfully been created';
}
}

Đây:

  • $data = […] định nghĩa một biến mảng data sử dụng tên cột của bảng cơ sở dữ liệu làm khóa mảng và gán giá trị cho chúng.
  • `$this->db->insert('orders', $data);` gọi phương thức `insert` của thư viện cơ sở dữ liệu, truyền vào tên bảng `orders` và biến mảng `$data`. Dòng lệnh này tạo ra câu lệnh SQL `INSERT` sử dụng các khóa của mảng làm tên trường và các giá trị của mảng làm giá trị cần chèn.

Bây giờ chúng ta đã tạo phương thức điều khiển, chúng ta cần tạo một tuyến đường mà chúng ta sẽ gọi để thực thi nó. Mở tệp application/config/routes.php và thêm dòng sau:

$route['ar/insert'] = 'activerecordcontroller/store_order';

Đây:

  • Chúng ta định nghĩa một route ar/insert gọi phương thức store_order của ActiveRecordController.

Bây giờ chúng ta hãy khởi động máy chủ web để kiểm tra phương pháp của mình. Chạy lệnh sau để khởi động máy chủ PHP tích hợp sẵn:

cd C:\Sites\ci-app
php -S localhost:3000

Đây:

  • Lệnh trên sẽ điều hướng đến thư mục dự án và khởi động máy chủ tích hợp sẵn tại cổng 3000.

Tải các mục sau URL vào trình duyệt của bạn: http://localhost:3000/ar/insert. Bạn sẽ nhận được kết quả sau:

order has successfully been created

Mở MySQL Truy cập cơ sở dữ liệu hướng dẫn và kiểm tra bảng đơn đặt hàng. Bạn sẽ thấy hàng mới được tạo, như hình bên dưới:

Dòng đơn hàng mới được chèn thông qua Active Record.

CodeIgniter Select Active Record

Trong phần này, chúng ta sẽ xem cách đọc các bản ghi trong cơ sở dữ liệu và hiển thị chúng trên trình duyệt web dưới dạng danh sách không có thứ tự. Thêm phương thức sau vào ActiveRecordController:

public function index() {
$query = $this->db->get('orders');

echo "<h3>Orders Listing</h3>";
echo "<ul>";

foreach ($query->result() as $row) {
echo "<li>$row->customer_name</li>";
}

echo "</ul>";
}

Đây:

  • $query = $this->db->get('orders'); thực thi truy vấn select trên bảng orders, chọn tất cả các trường.
  • tiếng vang “ Danh sách đơn hàng ”; hiển thị tiêu đề HTML.
  • tiếng vang “ ”; in ra thẻ mở cho một danh sách HTML không có thứ tự.
  • vòng lặp foreach ($query->result() as $row) {…} duyệt qua các kết quả trả về từ cơ sở dữ liệu và echo “ $row->customer_name ”; in ra tên khách hàng.

Trước khi bạn tải URLBạn có thể thêm một vài bản ghi nữa vào cơ sở dữ liệu. Bây giờ, hãy định nghĩa một tuyến đường cho truy vấn SELECT. Mở application/config/routes.php và thêm tuyến đường sau:

$route['ar'] = 'activerecordcontroller';

Đây:

  • Tuyến đường `ar` trỏ đến phương thức `index` của lớp `ActiveRecordController`. Đây là mặc định, đó là lý do tại sao chúng ta không chỉ định phương thức `index`, như chúng ta đã làm với tuyến đường chèn bản ghi.

Giả sử máy chủ web đã hoạt động, hãy tải các tệp sau: URL: http://localhost:3000/arBạn sẽ thấy kết quả tương tự như sau trên trình duyệt web của mình:

Danh sách đơn hàng được chọn thông qua Active Record

CodeCập nhật Active Record của Igniter

Trong phần này, chúng ta sẽ tìm hiểu cách sử dụng Active Record để cập nhật cơ sở dữ liệu. Giả sử chúng ta muốn cập nhật tên khách hàng Joe Thomas thành Joe. Hãy thêm phương thức sau vào lớp ActiveRecordController:

public function update_order() {
$data = [
'customer_name' => 'Joe',
];
$this->db->where('id', 1);
$this->db->update('orders', $data);
echo 'order has successfully been updated';
}

Đây:

  • $data = […] xác định các trường và giá trị mà chúng ta muốn cập nhật trong bảng cơ sở dữ liệu.
  • $this->db->where('id', 1); thiết lập mệnh đề where cho truy vấn cập nhật.
  • $this->db->update('orders', $data); tạo truy vấn cập nhật SQL và thực thi nó dựa trên cơ sở dữ liệu của chúng tôi.

Đoạn mã trên tạo ra câu lệnh SQL sau:

UPDATE orders SET customer_name = 'Joe' WHERE id = 1;

Bây giờ chúng ta hãy cập nhật tệp application/config/routes.php và thêm tuyến đường sau:

$route['ar/update'] = 'activerecordcontroller/update_order';

Lưu các thay đổi và tải tệp sau. URL trong trình duyệt web:

Thông báo đơn hàng đã được cập nhật thành công.

Bây giờ chúng ta hãy hiển thị các bản ghi trong cơ sở dữ liệu và xem liệu thay đổi đã có hiệu lực hay chưa.

Danh sách đơn hàng hiển thị tên đã được cập nhật

Như bạn có thể thấy từ hình ảnh phía trên, thông tin đầu tiên đã được cập nhật từ Joe Thomas thành Joe.

CodeIgniter Xóa bản ghi hoạt động

Bây giờ chúng ta sẽ xóa một bản ghi khỏi cơ sở dữ liệu. Chúng ta sẽ xóa bản ghi có ID là 3. Thêm phương thức sau vào ActiveRecordController:

public function delete_order() {
$this->db->where('id', 3);
$this->db->delete('orders');

echo 'order has successfully been deleted';
}

Đây:

  • $this->db->where('id', 3); thiết lập mệnh đề where.
  • $this->db->delete('orders'); xóa hàng trong bảng orders dựa trên các tiêu chí được thiết lập bằng mệnh đề where.

Để thực thi đoạn mã trên, hãy tải các tệp sau: URL trong trình duyệt web của bạn: http://localhost:3000/ar/delete.

Câu Hỏi Thường Gặp

Active Record liên kết các giá trị dưới dạng tham số thay vì nối chúng vào chuỗi SQL, do đó dữ liệu người dùng nhập vào không thể thay đổi cấu trúc truy vấn. Điều này giúp tránh được lỗi.ping Việc này diễn ra tự động đối với các thao tác chèn, cập nhật và tìm kiếm.

Đúng vậy. Active Record tạo ra SQL thông qua trình điều khiển cho mỗi engine, vì vậy việc chuyển đổi từ MySQL Việc chuyển sang SQL Server thường có nghĩa là thay đổi cấu hình, chứ không phải mã mô hình, miễn là bạn tránh sử dụng SQL dành riêng cho nhà cung cấp.

Mệnh đề WHERE giới hạn phạm vi các hàng mà câu lệnh tác động. Nếu không có mệnh đề này, lệnh cập nhật hoặc xóa sẽ được thực thi trên mọi hàng trong bảng, đây là một lỗi phổ biến và tốn kém.

Đúng vậy. AI có thể viết lại câu lệnh SELECT, INSERT, UPDATE hoặc DELETE thành chuỗi câu lệnh get, insert, update hoặc delete tương đương. Hãy kiểm tra kết quả, vì các phép nối phức tạp có thể cần đến trình tạo truy vấn thay vì Active Record đơn giản.

Việc tự động tải thư viện cơ sở dữ liệu giúp cho biến `$this->db` có sẵn trong mọi controller và model mà không cần phải tải lại mỗi lần. Điều này rất tiện lợi khi phần lớn ứng dụng tương tác với cơ sở dữ liệu.

Tóm tắt bài viết này với: