Có một điều nhỏ cần đề cập. Theo mặc định, PDO chỉ mô phỏng các câu lệnh đã chuẩn bị sẵn.
Và khi ở chế độ mô phỏng, nó chạy cùng một truy vấn cũ mà không thực sự chuẩn bị một câu lệnh nào :)
Vì vậy, trước hết,
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
để bật các tuyên bố chuẩn bị thực sự.
Có một điều nhỏ khác cần đề cập đến.
Đáng buồn thay, có rất ít thực tế kiến thức trên thế giới. Và đặc biệt là trong thế giới của các trang hỏi đáp. Mọi người có xu hướng lặp lại thông tin họ đã đọc và thấy hợp lý. Mà không cần chạy bất kỳ bài kiểm tra nào để chứng minh hoặc thậm chí không cần đặt tay vào. Vì vậy, "thường được ghi chú" không nên được coi là một nguồn đáng tin cậy.
Trở lại vấn đề:mặc dù nên có một số hình phạt, nó sẽ không đáng kể trong hầu hết thời gian. Nếu đúng như vậy - bạn phải điều chỉnh hệ thống của mình.
Dù sao, trong chế độ giả lập, bạn đã có được nó cả "nhanh chóng" và an toàn.
Cập nhật
Chà, sau khi chạy thử nghiệm của bạn trên dữ liệu của tôi, tôi phải nói rằng có điều gì đó không ổn với cơ sở dữ liệu của bạn nếu bạn có sự khác biệt 3 lần trên một tập dữ liệu lớn.
Đối với một truy vấn chớp nhoáng
select title from Board where id = 1
kết quả là
emulation on off
query 0.07 0.130
prepare 0.075 0.145
trong khi đối với truy vấn khá nặng nề
select title from Board where id > 1
kết quả là
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Vì vậy, như chúng ta có thể thấy, trên một tập dữ liệu lớn, sự khác biệt trở nên khó nhận thấy.
Đối với truy vấn chớp nhoáng, có một số khác biệt, nhưng, vì nó chỉ chiếm phần thứ 0,0003 của giây (cho một truy vấn duy nhất) - tôi muốn nói đó là ví dụ hoàn hảo cho từ "thờ ơ".
Để có kết quả ngang nhau giữa query () / Chuẩn bị () - Tôi chỉ có một ý tưởng - PDO sử dụng chuẩn bị / thực thi cho tất cả các truy vấn, ngay cả những truy vấn không có ràng buộc.
Bây giờ là vấn đề mã hóa.
Có, vấn đề GBK kỳ lạ không ảnh hưởng đến PDO cho các phiên bản trước 5.3.3. Các phiên bản này không có cách nào để đặt mã hóa phù hợp và không thể tránh khỏi dễ bị tấn công (trong chế độ giả lập). Nhưng vì 5.3.3 PDO hỗ trợ thiết lập mã hóa trong DSN và bây giờ mọi thứ đều ổn với nó.
Đối với mysqli, người ta phải sử dụng mysqli_set_charset()
cho mục đích này với cùng một kết quả (không thể xuyên thủng).
Trong lớp của riêng tôi dựa trên mysqli, tôi đang sử dụng triển khai trình giữ chỗ của riêng mình và không sử dụng câu lệnh chuẩn bị nào cả. Không phải vì lý do hiệu suất mà vì độ tin cậy tốt hơn.