2009-07-15 17 views
12

Tôi có hộp chọn nhiều sau đây trong biểu mẫu HTML, nơi người dùng có thể chọn một hoặc nhiều tùy chọn.Cách POST trống <select .. multiple> HTML elements if empty?

<select id="eng_0" name="eng_0[]" multiple size="3"> 
    <option value="Privilégier">Privilégier</option> 
    <option value="Accepté">Accepté</option> 
    <option value="Temporaire">Temporaire</option> 
</select> 

Khi người sử dụng chọn không có lựa chọn, hình thức được đưa lên một backend PHP nhưng nó tạo ra không có giá trị mảng rỗng với $ _POST [ 'eng_0'] như thể lĩnh vực này không phải là ngay cả trên biểu mẫu.

Đây là loại hộp kiểm không được chọn không được gửi.

Có cách nào để POST gửi đối tượng được chọn ngay cả khi không có tùy chọn được chọn? Nó có thể được trong jQuery nếu điều đó giúp.

+4

Có, HTML không gửi các phần tử "không thành công" (bao gồm các hộp chọn không có chọn lọc, nút radio không có hộp kiểm đã chọn và không chọn). – Powerlord

+0

Câu hỏi này thực sự không rõ ràng, vì bạn có thể kiểm soát giá trị bằng 'isset ($ _ POST ['eng_0'])' .. Ý của bạn là gì * để POST chọn ngay cả khi không có tùy chọn nào được chọn *? – jolt

+0

Là một lưu ý phụ, có vẻ như thậm chí các lựa chọn không phải là "nhiều" có thể có hành vi này và không được gửi, nếu chúng có "không có giá trị" nào được chọn. Ví dụ nếu bạn chạy javascript này 'document.getElementById ('select_id'). Value = 'a non option';' (thường không phải là vấn đề với đầu vào của người dùng bình thường vì chúng không thể chọn gì từ trình đơn thả xuống). Chỉ cần nghĩ rằng tôi muốn đề cập đến nó :) – rogerdpack

Trả lời

19

Nếu mẫu của bạn được tạo ra tự động , bạn có thể bao gồm phần tử biểu mẫu ẩn có cùng tên chứa giá trị giả. Sau đó, chỉ cần bỏ qua giá trị giả, nếu giá trị bạn nhận được cho biến đó là ['dummy_value'] thì bạn có thể coi đó là "không có gì được chọn" trong mã của bạn.

12

Có lý do nào khiến bạn không thể xử lý tình huống mà mảng không được đặt như thể nó được gửi không có nội dung không?

if (!isset($_POST['eng_0'])) 
    $_POST['eng_0'] = array(); 

EDIT:

Thêm một lĩnh vực tiềm ẩn bất cứ khi nào nhiều chọn có mặt trong mẫu của bạn:

<input type="hidden" name="eng_0_exists" value="1"/> 

Sau đó kiểm tra:

if (!isset($_POST['eng_0']) && isset($_POST['eng_0_exists'])) 
    $_POST['eng_0'] = array(); 
+0

Tôi không biết nếu mảng không được gửi bởi vì: 1) Người dùng không chọn bất kỳ tùy chọn 2) Kiểm soát thậm chí không có trên biểu mẫu (biểu mẫu được tạo tự động, sử dụng một thuật toán khá phức tạp). Đây là hai tình huống khác nhau đối với tôi và tôi muốn có thể biết điều gì đang diễn ra. – Vincent

3

Bạn có thể thêm - vui lòng chọn - nhập và chọn trước.

<select id="eng_0" name="eng_0[]" multiple size="3"> 
    <option value="nothing" selected="selected">- please select -</option> 
    <option value="Privilégier">Privilégier</option> 
    <option value="Accepté">Accepté</option> 
    <option value="Temporaire">Temporaire</option> 
</select> 
+1

Không, ý tưởng đó rất tệ! vì người dùng có thể bỏ chọn tùy chọn bằng phím CTRL! –

+0

Nếu bạn muốn bỏ chọn mọi thứ thì sao? Bạn sau đó cũng sử dụng một số javascript để chọn lại tùy chọn _empty? Tôi cũng đoán rằng việc sử dụng các bộ làm đẹp như Select2 hoặc Chosen sẽ hiển thị tùy chọn trống bằng cách nào đó –

1

điều gì sẽ xảy ra nếu ngay cả khi người dùng chọn nó, không có gì về lựa chọn đến $ _POST?

  <form action="cart.php" method="POST"> 
       <input type="hidden" id="acao" name="acao" value="add" /> 
       <input type="hidden" id="id" name="id" value="<?=$cnt->cnt_codigo?>" /> 
       <?php 
        $resOpc = mysql_query("SELECT * FROM loja_opcionais ORDER BY descricao")or die(mysql_error()); 
        if(mysql_num_rows($resOpc) > 0){ 
       ?> 
       <select id="opcional" nome="opcional"> 
        <?php 
         while($opc = mysql_fetch_object($resOpc)){ 
        ?> 
        <option value="<?=$opc->descricao?>"><?=$opc->descricao?></option> 
        <?php 
         } 
        ?> 
       </select> 
       <?php 
        } 
       ?> 
       <button class="botao" type="submit">Adicionar ao Carrinho</button> 
      </form> 

Khi tôi in print_r ($ _ POST); ở phía bên kia đầu ra đơn giản là: Mảng ([acao] => thêm [id] => 3) và không có dấu hiệu nào của thẻ được chọn, ngay cả khi tôi thay đổi giá trị ở phía bên kia;

0

nếu không có $ _POST, Đăng chuỗi rỗng (không có gì) là giải pháp đơn giản nhất.

đây giải pháp của tôi cho một Form với một <select name="related[]" multiple>

chỉ cần thêm dòng sau trong phần php để xử lý chứa các hình của bạn:

if (!isset($_POST['related'])) $_POST['related']=""; 
+2

Không phải lúc nào cũng có thể sử dụng được! –

1

Thêm một cái gì đó giống như

$("#field").change(function() { 
 
     if (($("#field").val() || []) == "") $("form").append("<input type='hidden' name='field' value=''>"); 
 
    });

0

Bao gồm <input type="hidden" name="yourfield" value="" /> vào biểu mẫu của bạn trong đó tên giống với tên của bạn multiple="multiple" chọn.


Thật là bất hạnh mà các trình duyệt không gửi các thông số hình thức trống cho multiple="multiple" Selects như họ làm cho người không nhiều lựa chọn, hoặc một đầu vào bình thường.

Sử dụng giá trị giả như được đề xuất trong câu trả lời được chấp nhận không phải là giải pháp rất sạch sẽ.

(Câu hỏi này không có gì để làm với jQuery)

0

Nếu bạn thêm một đầu vào ẩn trước select yếu tố nhiều, nó sẽ gửi các giá trị đầu vào ẩn nếu không ai trong số các mặt hàng nhiều lựa chọn đã được chọn. Ngay khi bạn chọn một tùy chọn, thay vào đó, giá trị đã chọn được sử dụng.

Bằng cách này tôi đã có thể phân biệt được 2 kịch bản khác nhau trong Laravel/php, là:

  • Đặt tất cả myitems để trống (yêu cầu đầu vào ẩn, do đó PHP nhận được một chuỗi rỗng cho myitems)
  • Cập nhật các tài sản khác của mô hình mà không cần chạm myitems (vì vậy không bao gồm bất kỳ hình myitems đầu vào biểu mẫu. PHP sẽ không nhận được chìa khóa myitems)

Mã mẫu:

<input type="hidden" name="myitems" value="" /> 
<select name="myitems[]" multiple> 
    <option value="1">Foo</option> 
    <option value="2">Bar</option> 
</select> 
Các vấn đề liên quan