Hướng dẫn dùng preparedstatement trong PHP
Một câu lệnh chuẩn bị sẵn (còn được gọi là câu lệnh được tham số hóa) chỉ đơn giản là một mẫu truy vấn SQL có chứa trình giữ chỗ thay vì các giá trị tham số thực tế. Các trình giữ chỗ này sẽ được thay thế bằng các giá trị thực tại thời điểm thực thi câu lệnh. Show MySQLi hỗ trợ việc sử dụng trình giữ chỗ vị trí ẩn danh ( INSERT INTOpersons (first_name, last_name, email)VALUES(?, ?, ?); Trong khi, PDO hỗ trợ cả trình giữ chỗ vị trí ẩn danh ( INSERT INTOpersons (first_name, last_name, email) Việc thực hiện câu lệnh đã chuẩn bị bao gồm hai giai đoạn: chuẩn bị và thực thi.
Các câu lệnh chuẩn bị sẵn rất hữu ích, đặc biệt trong các tình huống khi bạn thực thi một câu lệnh cụ thể nhiều lần với các giá trị khác nhau, ví dụ, một loạt câu lệnh Ưu điểm của việc sử dụng các câu lệnh soạn sẵnMột câu lệnh đã chuẩn bị có thể thực thi lặp lại cùng một câu lệnh với hiệu quả cao, vì câu lệnh chỉ được phân tích cú pháp một lần nữa, 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ì sau mỗi lần thực thi, chỉ các giá trị trình giữ chỗ cần được truyền đến máy chủ cơ sở dữ liệu thay vì câu lệnh SQL hoàn chỉnh. Các câu lệnh chuẩn bị sẵn cũng cung cấp khả năng bảo vệ mạnh mẽ chống lại SQL injection , vì các giá trị tham số không được nhúng trực tiếp vào 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 riêng biệt với truy vấn bằng cách sử dụ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 thi, sau khi mẫu câu lệnh được phân tích cú pháp. Đó là lý do tại sao các câu lệnh chuẩn bị í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. Ví dụ sau đây sẽ cho bạn thấy các câu lệnh đã chuẩn bị thực sự hoạt động như thế nào: Thủ tục
Hướng đối tượng
PDO
Như bạn có thể thấy trong ví dụ trên, chúng ta đã chuẩn bị câu lệnh Giải thích mã (kiểu thủ tục)Bên trong câu lệnh 1 ( dòng không-12 ) của ví dụ trên, dấu hỏi (? ) được sử dụng như trình giữ chỗ cho giá trị first_name , last_name , email.Hàm 3 ( dòng không-16 ) ràng buộc biến để giữ chỗ (? ) trong mẫu câu lệnh SQL. Các trình giữ chỗ (? ) sẽ được thay thế bằng các giá trị thực tế đượ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 làm đối số thứ hai, tức là chuỗi " 6" chỉ định rằng kiểu dữ liệu của mỗi biến ràng buộc là chuỗi.Chuỗi định nghĩa kiểu chỉ định kiểu dữ liệu của các biến ràng buộc tương ứng và chứa một hoặc nhiều trong bốn ký tự sau:
Số lượng biến liên kết và số ký tự trong chuỗi định nghĩa kiểu phải khớp với số lượng trình giữ chỗ trong mẫu câu lệnh SQL. Sử dụng dữ liệu đầu vào nhận được thông qua biểu mẫu webỞ chương trước, chúng ta đã tạo một biểu mẫu HTML để chèn dữ liệu vào cơ sở dữ liệu . Ở đây, chúng ta sẽ mở rộng ví dụ đó bằng cách triển khai câu lệnh đã chuẩn bị. Bạn có thể sử dụng cùng một biểu mẫu HTML để kiểm tra ví dụ chèn tập lệnh sau, nhưng chỉ cần đảm bảo rằng bạn đang sử dụng đúng tên tệp trong thuộc tính action của biểu mẫu. Dưới đây là mã PHP được cập nhật để chèn dữ liệu. Nếu bạn xem kỹ ví dụ, bạn sẽ thấy chúng tôi đã không sử dụng 7để loại bỏ ký tự đặc biệt của dữ liệu đầu vào của người dùng, giống như chúng tôi đã làm trong ví dụ chương trước. Vì trong các câu lệnh đã chuẩn bị, đầu vào của người dùng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn, vì vậy chúng không cần phải được loại bỏ một cách chính xác.Thủ tụcHướng đối tượng
PDO
Ghi chú: Mặc dù loại bỏ ký tự đặc biệt thông tin đầu vào của người dùng là không bắt buộc trong các câu lệnh đã chuẩn bị, nhưng bạn phải luôn xác thực loại và kích thước của dữ liệu nhận được từ các nguồn bên ngoài và thực thi các giới hạn thích hợp để bảo vệ chống lại việc khai thác tài nguyên hệ thống. |