Đầu tiên và quan trọng nhất:
Việc bạn làm theo lời khuyên này trở nên quan trọng hơn bao giờ hết, ext / MySQL hiện đã không được dùng nữa và việc sử dụng nó sẽ phát ra E_DEPRECATED
lỗi bắt đầu với PHP 5.5, một ngày nào đó nó sẽ bị xóa hoàn toàn khỏi ngôn ngữ cốt lõi. Phải nói rằng, điều sau áp dụng cho tất cả các trình điều khiển cho tất cả cơ sở dữ liệu.
Đối với phần còn lại của giải thích này, tôi sẽ giả định rằng bạn không thể sử dụng MySQLi hoặc PDO vì một số lý do (lưu ý rằng chỉ lý do thỏa đáng ở đây là chúng không có sẵn, "Tôi không biết cách sử dụng chúng" không phải là một cái cớ) và bạn buộc phải sử dụng ext / MySQL. Nếu bạn có thể sử dụng một trong hai trình điều khiển mới hơn, thì bạn có thể sử dụng các câu lệnh đã chuẩn bị và không áp dụng điều này. Vì vậy, với suy nghĩ đó ...
Tiếp theo chúng ta hãy nhìn vào những gì là sai với câu trả lời trước. Điều này xoay quanh việc thoát đầu vào của người dùng. Nó sử dụng mysql_real_escape_string()
là một cách thực sự không có ý nghĩa gì. Điều này sẽ được sử dụng để thoát một chuỗi ký tự đơn lẻ và hoàn toàn không bao giờ có gì khác. Nó không thể được sử dụng để thoát số một cách hiệu quả và nó không thể được sử dụng để thoát các phần của SQL không chỉ là giá trị.
Hai đoạn mã sau đây chỉ ra cách chính xác để thực hiện việc này, phụ thuộc vào dữ liệu là gì và quan trọng là loại dữ liệu.
Đây là những gì chúng tôi sẽ làm nếu các giá trị là chuỗi (thường là CHAR
hoặc VARCHAR
trường):
// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
$deds[] = "'".mysql_real_escape_string($ded)."'";
}
// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);
// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
Nhưng thường trong trường hợp này, các giá trị sẽ chỉ đơn giản là số và trong trường hợp này, tất cả những gì chúng ta cần làm là đảm bảo rằng PHP đang đại diện cho chúng với kiểu dữ liệu chính xác, vì chúng sẽ tự động an toàn khi chúng được chuyển đổi trở lại thành chuỗi. được sử dụng trong truy vấn:
// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
$deds[] = (int) $ded;
}
// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);
// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
Mã này rõ ràng giả định rằng dữ liệu là kiểu số nguyên, các float có thể dễ dàng được xử lý bằng cách thay đổi (int)
truyền tới (float)
.
Cũng cần lưu ý rằng cách tiếp cận chuỗi cũng có thể được sử dụng an toàn và thành công cho các giá trị số, vì MySQL cũng sẽ chuyển đổi các giá trị thành kiểu chính xác. Nhưng nói chung, tốt hơn và hiệu quả hơn nếu chuyển dữ liệu vào với biểu diễn kiểu chính xác trong truy vấn.