TÀI LIỆU HỌC THUẬT: CHƯƠNG 5 – PHP VÀ MYSQL (LẬP TRÌNH WEB)


1. Tổng quan về giáo trình

Tài liệu học tập "Chapter 5: PHP and MySQL" là một phần trong chương trình đào tạo học phần Lập trình Web (Web Lập Trình), do Khoa Khoa học và Kỹ thuật Máy tính – Trường Đại học Bách Khoa TP.HCM biên soạn và phát hành (bản quyền © 2020), với nội dung bài giảng do giảng viên Nguyễn Hữu Hiếu phụ trách.

Vị trí trong chương trình đào tạo

Học phần đóng vai trò cầu nối giữa lập trình giao diện phía máy khách (Frontend) và xử lý dữ liệu phía máy chủ (Backend). Chương 5 tập trung vào kỹ thuật tích hợp ngôn ngữ kịch bản PHP với hệ quản trị cơ sở dữ liệu quan hệ MySQL nhằm xây dựng các ứng dụng web động có khả năng lưu trữ, xử lý và truy xuất dữ liệu từ máy chủ cơ sở dữ liệu.

Mục tiêu học tập (Learning Outcomes)

Sau khi hoàn thành chương học này, người học có khả năng:

  • Thiết lập và chấm dứt kết nối từ môi trường PHP tới máy chủ cơ sở dữ liệu MySQL.
  • Quản lý và thao tác với các cơ sở dữ liệu MySQL thông qua các hàm tiện ích của PHP.
  • Thực hiện các thao tác định nghĩa dữ liệu (DDL): tạo mới, chỉnh sửa cấu trúc và xóa bảng dữ liệu MySQL.
  • Thực hiện các thao tác xử lý dữ liệu (DML): thêm mới, cập nhật và xóa các bản ghi trong cơ sở dữ liệu.
  • Truy vấn, trích xuất dữ liệu từ các tập kết quả (resultset) và ánh xạ dữ liệu ra cấu trúc bảng HTML trên trình duyệt web.

Cấu trúc và cách tiếp cận

Nội dung bài giảng được xây dựng theo mô hình tiến trình kỹ thuật tuần tự: đi từ việc giới thiệu gói mở rộng mysqli, cú pháp thiết lập kết nối máy chủ, xử lý lỗi ngoại lệ, phân chia tệp cấu hình, thực thi các câu lệnh SQL không trả về dữ liệu và có trả về dữ liệu, duyệt các tập bản ghi, cho đến việc thống kê hiệu năng truy vấn và đóng tài nguyên hệ thống.


2. Nội dung kiến thức cốt lõi

2.1. Các chủ đề chính trong bài giảng

Chủ đề 1: Cơ chế kết nối và quản trị phiên làm việc

  • Các hàm thực thi: mysqli_connect(), mysqli_close().
  • Khái niệm then chốt: Cú pháp kết nối $connection = mysqli_connect("host", "user", "password", "database"). Hàm trả về định danh kết nối (dạng số nguyên dương / đối tượng) khi thành công hoặc giá trị FALSE khi thất bại.
  • Trích xuất thông tin máy chủ/máy khách: Hệ thống các hàm cung cấp siêu dữ liệu: mysqli_get_client_info(), mysqli_get_client_stats(), mysqli_get_client_version(), mysqli_get_connection_stats(), mysqli_get_host_info(), mysqli_get_proto_info(), mysqli_get_server_info(), mysqli_get_server_version().

Chủ đề 2: Kiểm soát lỗi và phân đoạn cấu hình

  • Các hàm thực thi: mysqli_errno(), mysqli_error(), hàm ngắt die().
  • Khái niệm then chốt: Xử lý các nguyên nhân lỗi kết nối phổ biến (máy chủ CSDL chưa kích hoạt, không đủ quyền hạn truy cập tài nguyên, sai thông tin định danh người dùng).
  • Tổ chức tệp tin: Sử dụng các chỉ thị cấu trúc include('file.php'), include_once('config/file.php'), require('file.php'), require_once('file.php') nhằm phân tách thông tin bảo mật và tái sử dụng kết nối.

Chủ đề 3: Thực thi câu lệnh SQL và quản lý cấu trúc bảng

  • Các hàm thực thi: mysqli_query(), mysqli_create_db(), mysqli_drop_db().
  • Cú pháp: mysqli_query(connection, query).
  • Quy ước giá trị trả về:
    • Trả về giá trị logic TRUE đối với các câu lệnh không trả về tập dữ liệu (CREATE DATABASE, CREATE TABLE, DROP TABLE).
    • Trả về con trỏ kết quả (result pointer) đối với các câu lệnh truy vấn dữ liệu (SELECT, SHOW).
    • Trả về FALSE khi câu lệnh thực thi thất bại.
  • Ràng buộc bảng: Áp dụng các mệnh đề định nghĩa dữ liệu PRIMARY KEY (chỉ mục tham chiếu), AUTO_INCREMENT (tự động tăng giá trị tuần tự) và NOT NULL (ràng buộc trường bắt buộc có dữ liệu).

Chủ đề 4: Thao tác dữ liệu bản ghi (DML)

  • Các hàm và cú pháp: Thêm mới dữ liệu bằng INSERT INTO table (fields) VALUES (values), nạp tệp dữ liệu văn bản dung lượng lớn qua câu lệnh LOAD DATA INFILE 'file.txt' INTO TABLE table, cập nhật dữ liệu với UPDATE table SET field = value WHERE condition, và xóa dữ liệu qua DELETE FROM table WHERE condition.
  • Lưu ý kỹ thuật: Cảnh báo về việc bỏ sót mệnh đề WHERE sẽ dẫn đến việc cập nhật hoặc xóa toàn bộ bản ghi trong bảng; lưu ý tương thích đối với lệnh LOAD DATA (không hỗ trợ trên định dạng Paradox).

Chủ đề 5: Xử lý tập kết quả truy vấn (Resultset Handling)

  • Khái niệm con trỏ kết quả (Result pointer): Biến đặc biệt trỏ tới dòng hiện tại trong tập kết quả trả về từ câu lệnh SELECT.
  • Hàm trích xuất dữ liệu:
    • mysqli_fetch_row(): Trích xuất dòng hiện tại vào một mảng chỉ mục số nguyên (indexed array: $Row[0], $Row[1],...) và tịnh tiến con trỏ sang dòng kế tiếp.
    • mysqli_fetch_assoc(): Trích xuất dòng hiện tại vào một mảng kết hợp (associative array: $Row['firstname'], $Row['lastname'],...) với khóa mảng là tên các trường dữ liệu.
  • Cấu trúc lặp duyệt: Sử dụng vòng lặp while ($row = mysqli_fetch_assoc($result)) hoặc do ... while ($Row) để duyệt dữ liệu và in ra các thẻ HTML <table>, <tr>, <td>.

Chủ đề 6: Thống kê trạng thái và giải phóng tài nguyên

  • Hàm thống kê:
    • mysqli_num_rows($result): Đếm tổng số dòng dữ liệu trả về từ câu lệnh SELECT.
    • mysqli_num_fields($result): Đếm tổng số cột/trường trong tập kết quả.
    • mysqli_affected_rows($con): Trả về số lượng dòng bị thay đổi bởi các truy vấn INSERT, UPDATE, DELETE.
    • mysqli_info($con): Trả về chuỗi thông tin định lượng chi tiết cho các thao tác INSERT INTO, UPDATE, LOAD DATA INFILE.
  • Quản lý bộ nhớ: Sử dụng mysqli_free_result($result) để thu hồi vùng nhớ lưu trữ tập kết quả sau khi hoàn tất xử lý.
  • Toán tử đàn áp lỗi: Sử dụng ký tự @ trước tên hàm (ví dụ: @mysqli_query(...)) để ngăn chặn việc hiển thị lỗi trực tiếp ra màn hình người dùng cuối.

2.2. Bảng tổng hợp các hàm xử lý CSDL trong tài liệu

Tên hàm / Cấu trúc Cú pháp đại diện Ý nghĩa kỹ thuật Dữ liệu trả về
mysqli_connect() mysqli_connect($host, $user, $pass, $db) Khởi tạo phiên kết nối đến máy chủ MySQL Định danh kết nối / FALSE
mysqli_select_db() mysqli_select_db($link, $database) Chọn cơ sở dữ liệu làm việc hiện hành TRUE / FALSE
mysqli_query() mysqli_query($link, $sql) Gửi và thực thi câu lệnh SQL đến máy chủ Con trỏ kết quả / TRUE / FALSE
mysqli_errno() mysqli_errno($link) Lấy mã số lỗi từ thao tác MySQL gần nhất Số nguyên (0 nếu không có lỗi)
mysqli_error() mysqli_error($link) Lấy nội dung thông báo lỗi dạng văn bản Chuỗi ký tự thông báo lỗi
mysqli_fetch_row() mysqli_fetch_row($result) Lấy dữ liệu dòng hiện tại dạng mảng chỉ mục Mảng chỉ mục ($row[0]) / NULL
mysqli_fetch_assoc() mysqli_fetch_assoc($result) Lấy dữ liệu dòng hiện tại dạng mảng kết hợp Mảng kết hợp ($row['key']) / NULL
mysqli_num_rows() mysqli_num_rows($result) Đếm số dòng trả về từ câu truy vấn SELECT Số nguyên
mysqli_affected_rows() mysqli_affected_rows($link) Đếm số dòng bị thay đổi từ INSERT/UPDATE/DELETE Số nguyên
mysqli_info() mysqli_info($link) Trả về thông tin chi tiết của thao tác SQL cuối Chuỗi ký tự thống kê
mysqli_free_result() mysqli_free_result($result) Giải phóng bộ nhớ con trỏ kết quả void
mysqli_close() mysqli_close($link) Đóng kết nối máy chủ cơ sở dữ liệu TRUE / FALSE

2.3. Kiến thức nền tảng và kỹ năng xây dựng

  • Lý thuyết nền tảng:
    • Khả năng tương thích mở của PHP: Truy cập cơ sở dữ liệu thông qua chuẩn giao tiếp mở ODBC (Open Database Connectivity) hoặc giao tiếp trực tiếp không qua ODBC thông qua các gói mở rộng chuyên biệt.
    • Mô hình gói thư viện: Sự chuyển dịch từ gói mysql truyền thống sang gói mysqli (MySQL Improved) hỗ trợ cả hai phong cách: lập trình thủ tục (procedural) và lập trình hướng đối tượng (object-oriented).
    • Khử khuẩn dữ liệu người dùng: Áp dụng hàm mysql_real_escape_string() để xử lý các biến đầu vào từ người dùng ($firstname, $lastname), loại bỏ các ký tự đặc biệt có thể phá vỡ cấu trúc câu truy vấn SQL.
  • Kỹ năng phát triển:
    • Kỹ năng kỹ thuật: Viết kịch bản PHP kết nối máy chủ cục bộ (localhost) hoặc từ xa (cs.edu), khởi tạo cấu trúc CSDL, viết truy vấn tham số hóa.
    • Kỹ năng phân tích: Phân tích mã lỗi từ mysqli_errno(), chẩn đoán sự cố đường truyền mạng hoặc quyền hạn người dùng thông qua mã phản hồi.
    • Kỹ năng xử lý dữ liệu: Kết xuất dữ liệu bảng quan hệ ra giao diện web động dưới dạng bảng HTML và xử lý các tập dữ liệu nhập ngoại dạng tệp văn bản thô.

3. Phương pháp giảng dạy và học tập

Phương pháp tiếp cận sư phạm (Pedagogical Approach)

Bài giảng sử dụng phương pháp giảng dạy dựa trên nghiên cứu tình huống mã nguồn cụ thể (Code-driven approach). Cấu trúc từng bài học đi liền giữa giải thích cú pháp lý thuyết và các khối mã mẫu (Sample Code).

Tài liệu áp dụng phương pháp so sánh đối chứng giữa cú pháp chuẩn và cú pháp gây lỗi (minh họa bằng các khối mã good và bad trong slide số 13):

  • Thực hiện kết nối tới máy chủ cs.edu với tài khoản demo.
  • Đối chiếu trường hợp chọn sai tên CSDL (nonexistentdb) để kích hoạt hàm mysqli_errno().
  • Đối chiếu trường hợp truy vấn bảng không tồn tại (SELECT * FROM nonexistenttable) để quan sát phản hồi lỗi từ hệ thống.

Phân tích tình huống và dữ liệu thực hành

Tài liệu sử dụng hai bộ dữ liệu thực nghiệm xuyên suốt các ví dụ:

  1. Bảng dữ liệu friends: Gồm các trường thông tin FirstName, LastName, Address, Age. Kịch bản thực hành bao gồm:
    • Thêm mới bản ghi: ('Lester', 'Longbottom', '35'), ('Carly', 'Sampson', '33').
    • Cập nhật dữ liệu có điều kiện: UPDATE friends SET Age = '61' WHERE FirstName = 'Bill' AND LastName = 'Yeakus'.
    • Duyệt và in toàn bộ danh sách ra bảng HTML có viền (border=1).
  2. Bảng dữ liệu company_cars: Thực hành chèn nhiều bản ghi đồng thời với các thông tin mã định danh xe, năm sản xuất, hãng sản xuất, dòng xe (ví dụ: ('CPQ-894', 2011, 'Honda', 'Insight', 49.0)), hoặc nạp hàng loạt từ tệp văn bản nguồn company_cars.txt thông qua lệnh LOAD DATA INFILE.

Tiêu chuẩn đánh giá và hướng dẫn tự học

  • Tiêu chuẩn đánh giá: Đánh giá thông qua tính chính xác của việc kiểm tra trạng thái kết nối (sử dụng điều kiện if (!$link) kết hợp hàm die()), khả năng lựa chọn hàm nạp mảng phù hợp (mysqli_fetch_row so với mysqli_fetch_assoc), và việc giải phóng bộ nhớ đầy đủ (mysqli_free_result, mysqli_close).
  • Hướng dẫn tự học: Người học được khuyến nghị tạo lập các tệp kịch bản kiểm tra độc lập (ví dụ tệp version.php để kiểm tra phiên bản máy chủ/máy khách), tổ chức cây thư mục chuẩn với thư mục con config/ chứa tệp cấu hình kết nối, và thực hành gỡ lỗi trực tiếp qua các thông báo do mysqli_error() trả về.

4. Điểm nổi bật và cập nhật kỹ thuật

So sánh kỹ thuật giữa gói mysql và mysqli

Theo thông tin tại slide số 4, gói mysqli (MySQL Improved) được giới thiệu từ phiên bản PHP 5 nhằm làm việc với máy chủ MySQL từ phiên bản 4.3 trở về sau:

  • Tính tương thích: Các phiên bản PHP trước đó bắt buộc phải sử dụng gói thư viện mysql.
  • Mô hình lập trình: Gói mysqli cung cấp giao diện hướng đối tượng tương đương với gói mysql, đồng thời duy trì khả năng sử dụng theo mô hình lập trình thủ tục (procedural programming).
  • Hiệu năng và an toàn: Gói mysqli được tối ưu hóa về tốc độ thực thi, nâng cao khả năng bảo mật và cải thiện tính tương thích với các hệ thống thư viện mở rộng.

Kỹ thuật quản trị tệp và tích hợp dữ liệu

  • Phân đoạn tệp cấu hình: Bài giảng làm rõ cơ chế quản lý tệp phụ trợ thông qua 4 hàm: include(), include_once(), require(), require_once(). Cơ chế này cho phép nạp các tệp cấu hình kết nối (ví dụ: config/file.php nạp tiếp file2.php) mà không gây xung đột định nghĩa hàm hay biến môi trường.
  • Xử lý tệp dữ liệu phẳng (Flat-file Processing): Hỗ trợ nhập liệu khối lượng lớn trực tiếp từ các tệp văn bản lưu trữ trên hệ thống tệp cục bộ vào bảng CSDL bằng câu lệnh LOAD DATA INFILE, tối ưu hóa thời gian xử lý so với việc thực thi nhiều câu lệnh INSERT đơn lẻ.
  • Kiểm soát luồng lỗi thông minh: Kết hợp toán tử kiểm soát lỗi @ với hàm kiểm tra mysqli_info() để thu thập thông tin về các dòng dữ liệu bị trùng lặp, bị bỏ qua hoặc khớp mẫu điều kiện mà không làm gián đoạn giao diện của người dùng.

5. Đối tượng sử dụng giáo trình

Nhóm người học mục tiêu

  • Sinh viên đại học chính quy: Sinh viên theo học các ngành Khoa học Máy tính, Kỹ thuật Máy tính và Công nghệ Thông tin thuộc Trường Đại học Bách Khoa TP.HCM hoặc các cơ sở đào tạo tương đương đang học môn Lập trình Web.
  • Người tự học và kỹ sư phát triển Web Backend: Người học cần tài liệu tra cứu có hệ thống về cách thức tích hợp PHP với hệ quản trị cơ sở dữ liệu quan hệ MySQL theo tiêu chuẩn cú pháp mysqli.

Yêu cầu kiến thức tiên quyết (Prerequisites)

Để tiếp thu trọn vẹn nội dung chương học, người học cần trang bị trước:

  1. Kiến thức cơ bản về ngôn ngữ PHP: Cú pháp khai báo biến, các cấu trúc điều khiển (if/else, while, do...while), kiểu dữ liệu mảng và cách tổ chức tệp (include, require).
  2. Kiến thức cơ sở dữ liệu và ngôn ngữ SQL: Cú pháp các câu lệnh thao tác bảng (CREATE TABLE, DROP TABLE), các mệnh đề ràng buộc (PRIMARY KEY, AUTO_INCREMENT, NOT NULL) và các câu lệnh truy vấn dữ liệu (SELECT, INSERT, UPDATE, DELETE).
  3. Kiến thức cơ bản về HTML: Cấu trúc văn bản và các thẻ định dạng bảng biểu (<table>, <tr>, <th>, <td>).

Vai trò đối với giảng viên

Tài liệu cung cấp khung bài giảng hoàn chỉnh gồm hệ thống mục tiêu học tập rõ ràng, các slide giải thích cú pháp hàm đi kèm mã nguồn mẫu và các hình ảnh chụp màn hình kết quả thực tế (output), hỗ trợ giảng viên triển khai bài giảng lý thuyết trên lớp kết hợp hướng dẫn thực hành tại phòng máy.


6. Câu hỏi thường gặp (FAQ)

1. Giáo trình này phù hợp với đối tượng nào?

Tài liệu được biên soạn phục vụ trực tiếp cho sinh viên thuộc khối ngành Khoa học và Kỹ thuật Máy tính đang tham gia học phần Lập trình Web, cũng như người học cần nắm vững kỹ thuật tương tác cơ sở dữ liệu phía máy chủ bằng ngôn ngữ PHP.

2. Cần chuẩn bị những kiến thức nền tảng nào trước khi học chương này?

Người học cần nắm vững cú pháp lập trình PHP cơ bản, các câu lệnh truy vấn cơ sở dữ liệu SQL chuẩn (DDL và DML), nguyên lý hoạt động của máy chủ web cục bộ và các thẻ cấu trúc bảng trong HTML.

3. Điểm khác biệt giữa thư viện mysqli và thư viện mysql cũ là gì?

Thư viện mysqli (MySQL Improved) được phát triển từ PHP 5 dành cho MySQL 4.3 trở lên, hỗ trợ cả hai mô hình lập trình hướng đối tượng và thủ tục, có tốc độ xử lý nhanh hơn, tính bảo mật cao hơn và hỗ trợ nhiều hàm chuyên sâu để trích xuất trạng thái máy chủ/kết quả truy vấn so với gói mysql cũ.

4. Làm thế nào để phân biệt giữa mysqli_fetch_row() và mysqli_fetch_assoc()?

Cả hai hàm đều dùng để trích xuất từng dòng dữ liệu từ con trỏ kết quả và tịnh tiến con trỏ đến dòng tiếp theo. Tuy nhiên:

  • mysqli_fetch_row() trả về một mảng chỉ mục số nguyên (các trường được truy xuất theo số thứ tự: $Row[0], $Row[1],...).
  • mysqli_fetch_assoc() trả về một mảng kết hợp (các trường được truy xuất thông qua tên cột làm khóa: $Row['firstname'], $Row['age'],...).

5. Có những tài liệu và thành phần bổ trợ nào đi kèm bài giảng?

Bài giảng đi kèm hệ thống mã nguồn mẫu minh họa:

  • Tệp version.php hiển thị thông tin máy chủ và thư viện máy khách.
  • Tệp cấu hình phân đoạn config/file.php và file2.php.
  • Tệp dữ liệu văn bản company_cars.txt phục vụ thực hành lệnh LOAD DATA INFILE.
  • Các đoạn mã mẫu thực thi thao tác CRUD trên bảng dữ liệu thực nghiệm friends.

7. Kết luận

Tài liệu "Chapter 5: PHP and MySQL" của Khoa Khoa học và Kỹ thuật Máy tính – Trường Đại học Bách Khoa TP.HCM cung cấp hệ thống kiến thức hoàn chỉnh về kỹ thuật kết nối và quản trị cơ sở dữ liệu quan hệ MySQL thông qua ngôn ngữ kịch bản PHP.

Lộ trình học tập được định hình qua 5 giai đoạn tuần tự:

[Khởi tạo kết nối & Bắt lỗi] 

Nội dung giáo trình tập trung vào việc chuẩn hóa thao tác lập trình qua gói hàm mysqli_*, cung cấp các giải pháp phân đoạn mã nguồn qua include_once/require_once, xử lý an toàn dữ liệu đầu vào với mysql_real_escape_string(), và quản trị bộ nhớ hệ thống với mysqli_free_result(). Đây là tài liệu nền tảng định hình chuẩn mực kỹ thuật cho việc xây dựng ứng dụng web động phía máy chủ.