2013-05-14 32 views
10

Theo w3c "Một số hộp kiểm trong biểu mẫu có thể dùng chung tên điều khiển. Ví dụ: hộp kiểm cho phép người dùng chọn nhiều giá trị cho cùng một thuộc tính". Tuy nhiên, nếu bạn làm điều đó, PHP sẽ chỉ lấy giá trị cuối cùng. Ví dụ:Một số hộp kiểm có cùng tên

<?php 
if ($_POST) { 
echo "<pre>"; 
print_R($_POST); 
echo "</pre>"; 
} 
?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet" value="dog" />Dog<br /> 
<input type="checkbox" name="pet" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet" value="bird" />bird<br /> 
<input type="checkbox" name="pet" value="iguana" />iguana<br /> 
<input type="submit" /> 
</form> 

Nếu bạn gửi biểu mẫu đó, bạn sẽ thấy chỉ hộp được chọn cuối cùng sẽ được đặt. Trình duyệt gửi tất cả, nhưng chúng ghi đè lên nhau. Vì vậy, việc đặt cùng tên cho một số hộp kiểm có thể gây ra sự cố. Nó luôn luôn như vậy? Tôi dường như nhớ rằng thực sự có thể gửi tất cả các giá trị như một mảng.

Tôi biết rằng bạn chỉ có thể thêm một [] ở phần cuối của tên để tạo ra một mảng các giá trị:

<?php 
if ($_POST) { 
echo "<pre>"; 
print_R($_POST); 
echo "</pre>"; 
} 
?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet[]" value="dog" />Dog<br /> 
<input type="checkbox" name="pet[]" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet[]" value="bird" />bird<br /> 
<input type="checkbox" name="pet[]" value="iguana" />iguana<br /> 
<input type="submit" /> 
</form> 

Nhưng w3c không xác định đó. Thành thật mà nói tôi không nhớ nếu tôi luôn luôn sử dụng [] vào cuối tên, nhưng vì một lý do nào đó, tôi nghĩ rằng ở một thời điểm nào đó tôi đã không. Đã có thời gian trong quá khứ khi bạn có thể làm cho nó hoạt động mà không có []?

http://www.w3.org/TR/html401/interact/forms.html#checkbox

+1

Bạn phải sử dụng '[]' và sau đó bạn có thể sử dụng 'in_array' để xác định hộp kiểm nào đã được chọn. Gây phiền nhiễu, nhưng không phải tất cả các hình thức? – thatidiotguy

+1

W3c không xác định điều này vì nó là 'php' cụ thể (và có thể là các ngôn ngữ khác) và không liên quan đến w3c. Các ngôn ngữ khác không có yêu cầu này. Như bạn đã nói, trình duyệt gửi tất cả các giá trị. –

+0

Tôi thấy cả hai điểm của bạn. Cảm ơn. Và vâng, mọi hình thức đều gây phiền nhiễu. – Buzu

Trả lời

5

Điều đó sẽ không bao giờ làm việc mà không có sự [], không phải trong PHP.

W3C không chỉ định bất kỳ điều gì về cách chuỗi truy vấn được xử lý phía máy chủ. (Bỏ qua một không liên quan, obsolete corner of the CGI spec, chỉ liên quan đến PHP ở chỗ nó là một lỗ hổng bảo mật cho đến gần đây).

Dường như mẫu đó là đánh dấu hợp lệ, nhưng không thường được sử dụng, vì lý do bạn mô tả.

Một mẫu tương tự được sử dụng cho các nút radio, trong đó chỉ có một nút có thể được chọn cùng một lúc. (Trên thực tế, việc đưa đầu vào radio cùng tên là cách trình duyệt biết cách xử lý chúng như một nhóm). Có lẽ đó là những gì bạn đang nghĩ đến.

+0

Có lẽ. Tôi biết rằng các nút radio được sử dụng như thế, và tôi đoán bạn là đúng. Tôi đã nhận được cả hai lẫn lộn. – Buzu

+0

Tính năng này cũng hoạt động trong ASP cổ điển. Ngoài ra, nó chỉ trả về các giá trị đã chọn của các hộp kiểm. –

2

Nếu bạn thực sự muốn nó trong PHP, hãy thử này:

<?php 

if (count($_POST)) { 
    header("Content-type: text/plain"); 
    $fp = fopen("php://input", "r"); 
    fpassthru($fp); 
    fclose($fp); 
    exit; 
} 

?> 
<form action="" method = "post"> 
<input type="checkbox" name="pet" value="dog" />Dog<br /> 
<input type="checkbox" name="pet" value="Cat" />Cat<br /> 
<input type="checkbox" name="pet" value="bird" />bird<br /> 
<input type="checkbox" name="pet" value="iguana" />iguana<br /> 
<input type="submit" /> 

</form> 

Thông tin thêm về php://input dòng có thể được tìm thấy trong PHP documentation.

+0

Tôi ổn với việc sử dụng [], tôi chỉ tò mò về điều đó. Nhưng tôi sẽ đọc liên kết mà bạn cung cấp chỉ vì nó luôn luôn là tốt để được thông báo. – Buzu

Các vấn đề liên quan