2009-07-15 52 views
12

我在HTML表單中有以下多選框,用戶可以在其中選擇一個或多個選項。如何POST空<select .. multiple> HTML元素如果爲空?

<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> 

當用戶選擇任何選項,形式發佈到PHP後端但它爲$ _POST [「eng_0」]爲如果該字段沒有連上的形式沒有空數組值。

這有點像沒有提交的未勾選複選框的問題。

即使沒有選擇的選項,是否有任何辦法讓它POST選擇對象?如果有幫助,它可以在jQuery中。

+4

是的,HTML不會發送「不成功」的元素(包括沒有選擇的選擇框,沒有選擇的單選按鈕和未選中的複選框)。 – Powerlord 2009-07-15 17:00:43

+0

這個問題實際上並不清楚,因爲你可以用`isset($ _ POST ['eng_0'])``來控制這個值。你說什麼*即使沒有選擇選項, – jolt 2011-10-04 06:17:30

+0

作爲一個方面說明,即使選擇不是「多個」,也會出現這種行爲,如果選擇了「無值」,則不會提交。例如,如果你運行這個javascript`document.getElementById('select_id')。value ='非選項';`(通常不是隻有普通用戶輸入的問題,因爲它們不能從下拉列表中選擇任何東西)。只是認爲我會提到它:) – rogerdpack 2017-03-29 20:41:24

回答

19

如果是動態生成的表單,您可以包含一個隱藏的表單元素,其中包含一個虛擬值的相同名稱。然後,只要忽略虛擬值,如果您爲該變量獲得的值爲['dummy_value'],那麼您可以將其視爲代碼中的「沒有選定內容」。

12

有沒有理由不能將數組設置爲沒有內容發送?

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

編輯:

添加一個隱藏字段,只要多選擇存在於您的形式:

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

然後檢查:

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

我不知道該數組是否沒有提交,因爲: 1)用戶沒有選擇任何選項 2)控件甚至沒有在窗體上(表單生成動態地使用相當複雜的算法)。 對我來說,這是兩種不同的場景,我希望能夠告訴發生了什麼。 – Vincent 2009-07-15 16:00:52

3

您可以添加 - 請選擇 - 條目並預先選擇它。

<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

如果即使當用戶選擇它,什麼都沒有關於選擇到$ _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> 

當我做print_r($ _ POST);另一方面,輸出是簡單的: Array([acao] => add [id] => 3)並且沒有選擇標記的符號,即使當我改變另一側的值時也是如此。

0

如果沒有$ _POST,發佈一個空字符串(沒有)絕對是最簡單的解決方案。

這裏我的表單解決方案與<select name="related[]" multiple>

只需添加下面一行在PHP節處理您的形式存儲:

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

添加類似

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

0

<input type="hidden" name="yourfield" value="" />添加到您的表單中,其名稱與您的multiple="multiple"選擇的名稱相同。


不幸的是,瀏覽器不發送空形式參數multiple="multiple"選擇像它們用於非多個選擇或正常輸入做。

在接受的答案中使用虛擬值並不是一個非常乾淨的解決方案。

(這個問題有什麼用jQuery做)

0

如果前添加一個隱藏的輸入多重選擇的元素,如果沒有多選項目已選定它將把隱藏的輸入值。只要您選擇了一個選項,就會使用該選定的值。

這樣我能夠區分兩個不同的場景中Laravel/PHP中,爲:

  • 設置所有myitems清空(需要隱藏的輸入,所以PHP接收用於myitems空字符串)
  • 更新模型的其它性能而不觸及myitems(因此不包括任何myitems輸入表格的形式。PHP將不會收到myitems鍵)

示例代碼:

<input type="hidden" name="myitems" value="" /> 
<select name="myitems[]" multiple> 
    <option value="1">Foo</option> 
    <option value="2">Bar</option> 
</select>