2011-11-02 3 views
12

Gặp sự cố khi nhận mảng POST của tôi để hiển thị tất cả các giá trị hộp kiểm từ biểu mẫu của tôi.Mảng POST không hiển thị Hộp kiểm tra không được chọn

Tôi đã là một hình thức thiết lập như sau:

<form name='foo' method='post' action=''> 
    <table> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
    </table> 
</form> 

Tôi có một nút ở phía dưới bị ràng buộc vào một hàm jquery có thêm 5 dòng sản phẩm nào hơn với hình thức (vì thế các mảng cho tên đầu vào Cbox []).

Hiện tại, sự cố. Cho phép nói rằng hộp kiểm đầu tiên được bỏ chọn và 2 hộp kiểm cuối cùng được chọn. Khi tôi xuất các giá trị (bằng cách sử dụng PHP print_r để gỡ lỗi), tôi sẽ nhận được:

Array ([0] => on [1] => on) 

Vì một lý do nào đó, mảng không chứa bất kỳ giá trị nào cho các hộp kiểm bỏ chọn.

Tôi đã thấy một số giải pháp mà biến ẩn được chuyển với mỗi hộp kiểm, nhưng giải pháp này có thể được triển khai trong trường hợp của tôi (sử dụng mảng) không?

+0

âm thanh đủ đơn giản .. Tôi sẽ cung cấp cho nó một đi :) cảm ơn – SpaghettiMonster

+0

tiếc là tôi vẫn không nhận được các giá trị không được kiểm soát đến thông qua. cảm ơn mặc dù – SpaghettiMonster

+0

Tôi nhận ra rằng nhận xét trước đó của tôi đã được thúc đẩy bởi một sự hiểu biết hoàn toàn nhầm lẫn về câu hỏi của bạn về phía tôi. Tôi đã thêm một câu trả lời thích hợp dưới đây. – Jon

Trả lời

16

Hành vi đó không đáng ngạc nhiên vì trình duyệt không gửi bất kỳ giá trị nào cho các hộp kiểm không được chọn.

Nếu bạn đang ở trong một tình huống mà bạn cần gửi chính xác số phần tử làm mảng, tại sao bạn không làm điều tương tự khi có một số id của một số loại được liên kết với mỗi hộp kiểm? Chỉ bao gồm các mảng PHP tên chìa khóa như là một phần của tên <input> phần tử:

<tr> 
                 <!-- NOTE [0] ---> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> 
    </tr> 

Điều đó vẫn để lại cho bạn với các vấn đề mà hộp không được kiểm soát sẽ vẫn không có mặt trong mảng. Điều đó có thể hoặc không có thể là một vấn đề. Đối với một, bạn có thể thực sự không quan tâm:

foreach($incoming as $key => $value) { 
    // if the first $key is 1, do you care that you will never see 0? 
} 

Thậm chí nếu bạn quan tâm, bạn có thể dễ dàng khắc phục sự cố. Hai cách tiếp cận đơn giản ở đây. Một, chỉ cần làm ẩn yếu tố đầu vào lừa:

<tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[0]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[0]'/> 
     </td> 
    </tr> 
    <tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[1]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[1]'/> 
     </td> 
    </tr> 

Và hai, mà tôi thấy thích hợp, điền vào chỗ trống từ PHP thay vì:

// assume this is what comes in: 
$input = array(
    '1' => 'foo', 
    '3' => 'bar', 
); 

// set defaults: array with keys 0-4 all set to empty string 
$defaults = array_fill(0, 5, ''); 

$input = $input + $defaults; 
print_r($input); 

// If you also want order, sort: 

ksort($input); 
print_r($input); 

See it in action.

+0

Cảm ơn Jon. Tôi sẽ xem xét giải pháp này. Mối quan tâm duy nhất của tôi là tên duy nhất. Tôi có một số lượng đầu vào không xác định khi chúng được thêm vào với jquery .clone(). Ngoài ra, liên kết của bạn không hoạt động, bạn có thể sử dụng trình rút gọn url không? – SpaghettiMonster

+1

@SpaghettiMonster: Liên kết cố định (sao chép dán không thành công). Ngay cả khi nhân bản, bạn có thể chuỗi một vài phương thức jQuery bổ sung để đặt tên sau khi bản sao được tạo ra. – Jon

+0

Cảm ơn Jon. Tôi đã thêm một vài dòng jQuery để đếm số hàng hiện có và sử dụng để tăng vị trí mảng và sử dụng mã của bạn ở trên. Hoạt động hoàn hảo 100%! :) – SpaghettiMonster

2

Hãy thử

<input type='checkbox' value="XXX" name='cBox[]'/> 
<input type='checkbox' value="YYY" name='cBox[]'/> 
<input type='checkbox' value="ZZZ" name='cBox[]'/> 

Hộp kiểm làm việc theo cách đó. Nếu nó được kiểm tra, chỉ sau đó giá trị được đăng.

+0

Tôi đã thử điều này, và kết quả tôi nhận được là: Array ([0] => YYY [1] => ZZZ). Rất tiếc, tôi không thể cung cấp cho mỗi giá trị đầu vào duy nhất vì có thể được thêm động thông qua hàm jquery mà tôi đã nói đến. – SpaghettiMonster

+1

Sau đó thay thế YYY, ZZZ bằng các giá trị bạn cần. Sau đó, chỉ cần kiểm tra, nếu $ _POST ['cBox'] (là một mảng) chứa các giá trị cần thiết. –

0

Thử đặt giá trị cho mỗi hộp kiểm, bằng 1 hoặc đúng.

<input type='checkbox' value='1' name='cBox[1]'/> 

đó có thể là lý do tại sao nó không gửi gì?

4

ONE TRICK là ghi đè giá trị hộp kiểm, nếu được chọn. nếu không giá trị của nó sẽ là 0.

<form> 
    <input type='hidden' value='0' name="smth"> 
    <input type='checkbox' value='1' name="smth"> 
</form> 
+0

Trong khi logic của bạn là đúng, điều này không trả lời câu hỏi bởi vì nếu bạn có một mảng hơn sau đó foreach với cặp khóa sẽ không chính xác –

1

Nếu bạn đang xử lý mảng checkbox động, bạn có thể thử này:

HTML:

<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<!-- extend --> 

Javascript (jQuery):

$(document).on("change", "input.checkbox", function() { 

    var value = $(this).is(":checked") ? $(this).val() : null; 

    $(this).siblings("input[name='cBox[]']").val(value);  
}); 

kết quả Backend (Nếu chỉ đã chọn lần thứ hai):

// PHP $_POST['cBox'] 
Array 
(
    [0] => 
    [1] => on 
) 

Trong thực hiện này, hộp kiểm được sử dụng để điều khiển từng đầu vào bị ẩn trong nhóm.

Để hiển thị trang, bạn có thể hiển thị lại từng đầu vào bằng cách gán giá trị vào đầu vào bị ẩn và đánh dấu hộp kiểm là checked.

+0

Thực sự giúp đỡ đầy đủ .. Cảm ơn bạn !! –

+0

Vui mừng khi biết điều đó :) –