2015-06-28 26 views
6

Tôi có một hình thức trông như:Make hộp kiểm trả về false khi không được kiểm soát

<form> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
</form> 

Số lượng hộp kiểm sẽ variate bất cứ lúc nào nên khi xử lý dữ liệu này với PHP tôi phải lặp mảng _POST['checked'].

Vấn đề của tôi là tôi muốn thực hiện hành động cả khi hộp kiểm được chọn và khi nào không. Nhưng chỉ có các hộp kiểm được chọn sẽ được thêm vào mảng _POST['checked'].

+1

bạn không thể làm điều đó với html để bạn có 2 tùy chọn 1 sử dụng javascript, 2 sử dụng danh sách thả xuống thay vì hộp kiểm – robert

+1

tại sao không thêm vào php của bạn: $ checked = isset (_POST ['checked']) && _POST ['checked'] == 1; – sabkaraja

+0

@robert Tôi nghi ngờ nhiều, một danh sách thả xuống không phải là một thay thế trong trường hợp này nhưng tôi sau đó mở thêm cho một giải pháp dựa trên JS. Tôi sẽ làm thế nào với JS? (Tôi có một kinh nghiệm rất hạn chế với JS) – Gurgy

Trả lời

1
<form> 
    <input type="checkbox" key="1"/> 
    <input type="hidden" name="checked[1]" value="false"> 
    <input type="checkbox" key="2"/> 
    <input type="hidden" name="checked[2]" value="false"> 
    <input type="checkbox" key="3"/> 
    <input type="hidden" name="checked[3]" value="false"> 
    <input type="checkbox" key="4"/> 
    <input type="hidden" name="checked[4]" value="false"> 
</form> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
    $(document).ready(function() { 
     $('[key]').change(function() { 
      var key = $(this).attr('key'); 
      $($('[name="checked[' + key + ']"]')).val($(this).is(':checked') ? 'true' : 'false'); 
     }); 
    }); 
</script> 

đây là những gì tôi đang làm

Tôi đang sử dụng hai đầu vào một hộp kiểm là không có tên vì vậy nó sẽ không được gửi đến php , người khác bị ẩn sẽ không được hiển thị cho người dùng nhưng đó là nội dung sẽ được gửi tới php

sau đó với jquery khi người dùng chọn hộp jquery thay đổi giá trị của đầu vào bị ẩn thành true và khi bỏ chọn thay đổi giá trị thành false

nên giá trị sẽ luôn luôn được gửi cho php với giá trị đúng hay sai như string

bạn có thể thay đổi các giá trị mà bạn muốn gửi đến php bằng cách thay đổi này .is(':checked')?'true':'false') một cái gì đó giống như .is(':checked')?1:0) đó để gửi 1 và 0 thay vì đúng và sai

giải pháp khác là giải pháp rybo111

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

nó sẽ gửi hai lựa chọn nhưng nếu hộp kiểm được kiểm tra i t sẽ ghi đè tùy chọn đầu tiên

nhưng nó không phải là đáng tin cậy 100% và nó sẽ gửi dữ liệu hơn đến máy chủ

đọc thêm về điều đó trong POSTing Form Fields with same Name Attribute

vì vậy nếu bạn muốn sử dụng giải pháp đơn giản mà không cần js sử dụng "html chỉ" nếu bạn muốn 100% giải pháp đáng tin cậy sử dụng "js"

+0

Cảm ơn bạn rất nhiều, vấn đề này đã làm tôi thất vọng trong nhiều ngày, và tôi thậm chí hiểu những gì bạn đã làm ở đó: P – Gurgy

+0

hahaha: D bạn rất hoan nghênh và tôi vui vì bạn hiểu điều này, và bạn phải học js và jquery điều rất quan trọng đối với việc phát triển web – robert

+0

Không cần JavaScript với câu trả lời của tôi – rybo111

0

Thêm value="true" vào từng yếu tố đầu vào hộp kiểm. Và thay đổi mã PHP của bạn để:

$checked_arr = []; 
foreach($_POST["checked"] as $checked){ 
    if($checked == "true"){ 
     // do what you want to do 
    } 
} 
+4

Sửa tôi nếu tôi sai nhưng sẽ không '$ _POST [' được đánh dấu '] 'vẫn chỉ chứa các hộp kiểm được đánh dấu? – Gurgy

3

Dưới đây là một kỹ thuật tôi đã nhìn thấy trước đây:

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

Lý do là vì khi các giá trị có cùng tên được gửi nhiều lần, chỉ giá trị cuối cùng mới được chấp nhận.

Theo tôi, cách tốt hơn là chỉ cần sử dụng isset($_POST['...']) hoặc in_array($_POST['...']).

+0

+1 đó là giải pháp tốt, nhưng có một vấn đề là giải pháp này không đáng tin cậy vì một số trình duyệt có thể gửi giá trị đầu tiên – robert

+2

@robert để bạn có bất kỳ dữ liệu nào trên trình duyệt gửi giá trị đầu tiên không? – rybo111

+1

Tôi không biết nếu có một số trình duyệt làm điều đó, nhưng ví dụ tôi phải đối mặt với một vấn đề khi tôi sử dụng '' để gửi dữ liệu đến php nhưng bây giờ loại gửi không được gửi đến máy chủ – robert

0

Giải pháp khác là giải pháp phía máy chủ mà tôi cho là quá nhanh và dễ dàng.

phía khách hàng: Chỉ cần sử dụng HTML tươi:

<input type="checkbox" name="checked1" value="value_checked" ... /> 

phía máy chủ:

thực hiện chức năng toàn cầu như thế này:

function getVal(&$var, $default = '') { 
    if (!isset($var) || empty($var) || is_null($var)) 
     $var = $default; 
    return $var; 
} 

sau đó sử dụng mà bạn muốn đọc một số giá trị mà bạn không biết được đặt hay không. như thế này:

$checked_value = getVal($_POST["checked1"],false); 

hoặc

$checked_value = getVal($_POST["checked1"],"value_not_checked"); 

Tôi hy vọng hữu ích với nhau.

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