👉 Chà. Xin lưu ý rằng bài đăng này là 14 tuổi. Các quan điểm thể hiện bên trong có thể đã trở nên lỗi thời
Ngày 4 tháng 7 năm 2008Đôi khi bạn muốn có một biểu mẫu có nhiều "hành động". Chẳng hạn, trong một cửa hàng trực tuyến, bạn muốn liệt kê tất cả các sản phẩm của mình, mỗi sản phẩm được ghép nối với một nút gửi riêng để thêm sản phẩm cụ thể đó vào giỏ hàng
Nhưng làm thế nào bạn có thể, ở phía máy chủ, phân biệt giữa các sản phẩm?
Càng khó khăn hơn khi bạn có nhiều dữ liệu ẩn muốn gửi cùng với tên hoặc id của sản phẩm, nhưng bạn chỉ muốn hiển thị một nút
Có một số cách để đạt được điều này, tất cả đều có ưu và nhược điểm riêng. Dưới đây tôi sẽ liệt kê một số tùy chọn
Nhiều hình thức
Cách dễ nhất để đạt được điều này là sử dụng nhiều biểu mẫu trong mã HTML của bạn, đại loại như thế này
My product
My product
[...]
Điều này hoạt động, bởi vì khi nhấp vào nút, chỉ có một biểu mẫu được gửi, vì vậy bạn sẽ chỉ nhận được các giá trị chính xác ở phía máy chủ
Tuy nhiên nhược điểm là hơi luộm thuộm. Cá nhân tôi không thể nói rằng tôi hài lòng với việc có quá nhiều biểu mẫu khác nhau trong tài liệu HTML của mình
Nút loại "Hình ảnh"
Một giải pháp lý tưởng là sử dụng trường nhập loại "hình ảnh". Tạo một đồ họa dạng nút và viết một phần tử đầu vào như thế này
$hiddenvalues = explode ["|",$_POST["my-product"]];
$product_id = $hiddenvalues[0];
$product_secret = $hiddenvalues[1];
$product_another_secret = $hiddenvalues[2];
0Như bạn có thể thấy, tôi đã lạm dụng thuộc tính $hiddenvalues = explode ["|",$_POST["my-product"]];
$product_id = $hiddenvalues[0];
$product_secret = $hiddenvalues[1];
$product_another_secret = $hiddenvalues[2];
1 để nhồi nhét tất cả dữ liệu ẩn của mình, ngăn cách bởi các đường dẫn. Về phía máy chủ, tất cả những gì tôi phải làm trong mã PHP của mình là$hiddenvalues = explode ["|",$_POST["my-product"]];
$product_id = $hiddenvalues[0];
$product_secret = $hiddenvalues[1];
$product_another_secret = $hiddenvalues[2];
để lấy tất cả dữ liệu đã gửi
Tuy nhiên, Internet Explorer 6 sẽ không cho phép. Trình duyệt của Microsoft không gửi dữ liệu chứa bên trong thuộc tính "giá trị" của phần tử đầu vào loại hình ảnh. Xem để biết thêm thông tin bài viết này của Robert Nyman
Chết tiệt
Làm việc với mảng
Một điều tuyệt vời về các biểu mẫu là khả năng gửi các mảng của bạn. Hãy xem xét chút HTML này
Ví dụ: khi nhấp vào một trong các nút, nút "foo", phần sau sẽ được gửi đến máy chủ
Array
[
[foo] => Array
[
[secret] => my hidden value
[product-id] => 1
[submit] => Add this product to your cart
]
[bar] => Array
[
[secret] => my hidden value
[product-id] => 2
]
[baz] => Array
[
[secret] => my hidden value
[product-id] => 3
]
]
Như bạn có thể thấy, tất cả các mảng đều được gửi, nhưng chỉ có mảng "foo" chứa khóa "gửi". Vì vậy, bạn có thể lặp qua mảng và bất cứ khi nào bạn tìm thấy khóa "gửi", bạn sẽ biết đó là mảng mà người dùng định chọn
Bạn có thể làm như vậy bằng cách sử dụng mã như thế này
foreach [$_POST as $collection] {
if [array_key_exists ['submit', $collection]] {
// this is the one we need
$secret = $collection['secret'];
$id = $collection['product-id'];
break;
}
}
Đây là điều tốt nhất tôi có thể nghĩ ra. Rõ ràng, một nhược điểm có thể xảy ra là gửi nhiều dữ liệu thừa và phải lặp lại tất cả dữ liệu đó