Hướng dẫn dùng mysqli_prepare trong PHP

Trong bài này, bạn sẽ học cách sử dụng Prepared Statements trong MySQL bằng PHP.

1. Prepared Statement là gì?

Prepared Statement (còn được gọi là câu lệnh được tham số hóa) chỉ đơn giản là một câu truy vấn SQL có chứa các tham số giữ chỗ thay vì các giá trị thực tế.

Các tham số này sẽ được thay thế bằng các giá trị thực tế tại thời điểm thực hiện câu lệnh.

MySQLi hỗ trợ sử dụng tham số là vị trí ẩn danh (?), như ví dụ bên dưới:

INSERT INTO customer (first_name, last_name, email) VALUES (?, ?, ?);

Việc thực hiện Prepared Statement bao gồm hai giai đoạn: Chuẩn bị và Thực thi.

  • Chuẩn bị: Ở giai đoạn chuẩn bị, một mẫu câu lệnh SQL được tạo và gửi đến máy chủ cơ sở dữ liệu. Máy chủ phân tích mẫu câu lệnh, thực hiện kiểm tra cú pháp và tối ưu hóa truy vấn và lưu trữ nó để sử dụng sau.
  • Thực thi: Trong quá trình thực thi, các giá trị tham số được gửi đến máy chủ. Máy chủ tạo một câu lệnh từ mẫu câu lệnh và sử dụng các giá trị này để thực thi nó.

Ví dụ, bạn cần thực hiện một loạt các câu lệnh INSERT. Prepared Statement sẽ giúp bạn tối ưu hóa công việc này.

2. Ưu điểm của việc sử dụng Prepared Statement

Prepared Statement có thể thực hiện cùng một câu lệnh lặp đi lặp lại với hiệu quả cao, bởi vì câu lệnh chỉ được phân tích cú pháp một lần, trong khi nó có thể được thực thi nhiều lần.

Nó cũng giảm thiểu việc sử dụng băng thông, vì mỗi lần thực thi, chỉ có các giá trị giữ chỗ cần được truyền đến máy chủ cơ sở dữ liệu thay vì truyền cả câu lệnh SQL hoàn chỉnh.

Prepared Statement cũng cung cấp sự bảo vệ mạnh mẽ chống lại SQL injection (Hành động cố gắng truyền câu lệnh SQL để thao túng CSDL), bởi vì các giá trị tham số không được nhúng trực tiếp bên trong chuỗi truy vấn SQL.

Các giá trị tham số được gửi đến máy chủ cơ sở dữ liệu tách biệt với truy vấn bằng một giao thức khác và do đó không thể can thiệp vào nó.

Máy chủ sử dụng các giá trị này trực tiếp tại điểm thực hiện, sau khi mẫu câu lệnh được phân tích cú pháp.

Đó là lý do tại sao các Prepared Statement ít bị lỗi hơn và do đó được coi là một trong những yếu tố quan trọng nhất trong bảo mật cơ sở dữ liệu.

3. Sử dụng Prepared Statement bằng MySQLi

Như bạn có thể thấy trong ví dụ trên, chúng tôi đã chuẩn bị câu lệnh INSERT chỉ một lần nhưng thực hiện nó nhiều lần bằng cách truyền tập hợp các tham số khác nhau.

4. Giải thích thêm về Prepared Statement

Bên trong câu lệnh SQL INSERT của ví dụ trên, các dấu hỏi (?) được sử dụng làm trình giữ chỗ cho các giá trị của trường first_namelast_nameemail.

Hàm mysqli_stmt_bind_param() liên kết các biến với tham số (?) trong mẫu câu lệnh SQL.

Các tham số (?) sẽ được thay thế bằng các giá trị thực được giữ trong các biến tại thời điểm thực thi.

Chuỗi định nghĩa kiểu được cung cấp ở đối số thứ hai, tức là chuỗi ‘sss‘ chỉ định rằng kiểu dữ liệu của mỗi biến liên kết là chuỗi.

Chuỗi định nghĩa kiểu xác định kiểu dữ liệu của các biến liên kết tương ứng và chứa một hoặc nhiều trong bốn ký tự sau:

  • b — binary (như là hình ảnh, PDF, …)
  • d — double (Số thập phân)
  • i — integer (Số nguyên)
  • s — string (ký tự)

Số lượng biến liên kết và số lượng ký tự trong chuỗi định nghĩa kiểu phải khớp với số lượng tham số trong câu lệnh SQL.

Thông qua bài này, chúng ta thấy Prepared Statement là cách thực tế các lập trình viên hay làm để đảm bảo website đạt được sự an toàn và hiệu suất tốt.