Thoát cũng hiệu quả trong việc bảo vệ tiêm SQL như sử dụng các tham số truy vấn.
Cả hai phương pháp này cũng sẽ kém hiệu quả hơn nếu bạn không thực hiện chúng một cách nhất quán.
Cả hai phương pháp chỉ hữu ích để bảo vệ các giá trị riêng lẻ trong biểu thức SQL. Chúng không hỗ trợ các phần động khác của truy vấn. Ví dụ:nếu bạn muốn ĐẶT HÀNG THEO một cột do người dùng chỉ định. Các tham số truy vấn và các hàm thoát đều không xử lý điều đó.
Vì vậy, về cơ bản, nó là một vấn đề của phong cách và sở thích cá nhân.
Tôi thích tham số truy vấn hơn vì tôi nghĩ thế này:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
Rõ ràng hơn thế này:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);
Bạn không thể nghiêm túc nói rằng đang loay hoay với tất cả những dấu ngoặc kép mở / dấu ngoặc kép và .
nối chuỗi dễ dàng hơn so với việc sử dụng chuẩn bị () với các tham số truy vấn.
Nhận xét của bạn về một query()
giả định hàm với các tham số.
Trước hết, nó không cần thiết. Việc sử dụng chuẩn bị () và thực thi () cùng nhau là một cái giá nhỏ để trả cho việc viết mã an toàn và bằng cách khăng khăng thực hiện nó với một hàm duy nhất, bạn nghe có vẻ lười biếng. Tôi cho rằng bạn không kiểm tra giá trị trả về của các hàm trả về false
do lỗi?
Đối với những gì nó đáng giá, sẽ dễ dàng viết một hàm wrapper để thực hiện cả hai, vì PHP hỗ trợ ngầm định varargs.
function myquery() {
global $pdo;
$params = func_get_args();
$sql = array_shift($params);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt; // so we can fetch(), etc.
}