Tôi đang học cách tránh tiêm SQL và tôi hơi bối rối.bind_param thực hiện điều gì?
Khi sử dụng bind_param, tôi không hiểu mục đích. Trên trang hướng dẫn, tôi thấy ví dụ này:
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
Bây giờ, giả sử những 4 biến là sử dụng đầu vào, tôi không hiểu làm thế nào điều này ngăn cản tiêm SQL. Theo sự hiểu biết của tôi, họ vẫn có thể nhập bất cứ điều gì họ muốn ở đó.
Tôi cũng không thể tìm thấy giải thích cho số 'sssd'
trong đó. Nó làm gì? Đó có phải là điều làm cho nó an toàn không?
Câu hỏi cuối cùng: Tôi đã đọc một câu hỏi khác mà mysqli_real_escape_string
không còn được dùng nữa, nhưng không được nói trong hướng dẫn sử dụng. Làm thế nào là nó không được chấp nhận? Nó có thể không thoát khỏi những nhân vật đặc biệt nữa vì một lý do nào đó không?
Lưu ý: Câu hỏi này giải thích những gì bind_param làm, nhưng tôi vẫn không hiểu tại sao nó an toàn hơn hoặc được bảo vệ hơn. Bind_param explanation
'sssd' chuyển thành chuỗi, chuỗi, chuỗi, gấp đôi. 'Theo hiểu biết của tôi, họ vẫn có thể nhập bất cứ điều gì họ muốn ở đó.' Đúng. Nhưng không có SQL được phân tích cú pháp trong bốn biến đó. –
Trên liên kết bạn đã gửi, bạn quên đọc http://www.php.net/manual/en/mysqli-stmt.bind-param.php chi tiết tại 'loại Một chuỗi chứa một hoặc nhiều ký tự chỉ định các loại cho các biến liên kết tương ứng: ' – Prix
@DaveChen" Không có SQL được phân tích cú pháp "Điều đó có nghĩa là chúng vẫn có thể chèn SQL, nó sẽ không được đọc là SQL, đúng không? Điều đó có nghĩa rằng nếu tôi không có xác nhận mẫu, họ chỉ có thể nhập các lệnh SQL vào cơ sở dữ liệu của tôi/vào trường, nhưng nó sẽ không quan trọng vì SQL không được phân tích cú pháp? – EveyPortman