2009-07-15 14 views
12

私は以下の複数選択ボックスをHTML形式で用意しています。ここで、ユーザーは1つ以上のオプションを選択できます。空の場合は<select .. multiple> HTML要素をPOSTする方法は?

<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

+0

あなたは 'isset($ _ POST ['eng_0'])'で値を制御することができるので、質問は実際には不明です。オプションが選択されていなくてもselectをPOSTする*ことは何ですか? – jolt

+0

副作用として、「複数の」ではない選択項目でも、この動作を実行でき、「値なし」が選択されている場合、送信されないことがあります。たとえば、このjavascript 'document.getElementById( 'select_id')。value = 'a non option';'(ドロップダウンから何も選択することができないので通常は通常のユーザー入力には問題ありません)。私はそれを言いたいと思った:) – rogerdpack

答えて

19

をあなたのフォームが動的に生成された場合ダミー値を含む同じ名前の隠しフォーム要素を含めることができます。次に、ダミー値を無視します。その変数の値が['dummy_value']の場合は、コードで「選択なし」という意味で扱うことができます。

12

配列が内容なしで送信されたように設定されていない状況を扱うことができない理由はありますか?

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

EDIT:複数選択はあなたの形で存在するたび

は隠しフィールドを追加します。次に

<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)コントロールがフォームにも存在しない(フォームが生成されているため動的に、非常に複雑なアルゴリズムを使用して)。 これは私のための2つの異なるシナリオであり、何が起こっているのかを伝えることができるようにしたいと思います。 – Vincent

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

いいえ、それは非常に悪い考えです!ユーザーはCTRLキーを使用して選択を解除できます。 –

+0

すべてを選択解除したい場合はどうすればいいですか?あなたはまた、いくつかのjavascriptを使用して_emptyオプションを再選択しますか?私はまた、Select2やChosenのような美しいものを使用すると何とか空のオプションが表示されると推測します –

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)であり、他の側の値を変更してもselectタグの符号はありません。

0

$ _POSTがない場合は、空の文字列(何もない)を投稿するのが最も簡単な解決策です。

ここ<select name="related[]" multiple>

とフォームのための私の解決策は自分のフォームの保存を扱うPHPのセクションに次の行を追加します。

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

必ずしも利用可能ではありません! –

1

$("#field").change(function() { 
 
     if (($("#field").val() || []) == "") $("form").append("<input type='hidden' name='field' value=''>"); 
 
    });
のようなものを追加します。

0

<input type="hidden" name="yourfield" value="" />をフォームに追加してください。名前はmultiple="multiple" selectと同じです。


彼らが非複数選択または通常の入力のために行うようにブラウザがmultiple="multiple"選択するための空のフォームパラメータを送信しないことを残念です。

受け入れられた回答で提案されているようにダミー値を使用することは、きれいな解決策ではありません。

(この質問は、jQueryのとは関係ありません)

0

あなたは前に、複数のselect要素の隠し入力を追加する場合は、複数の選択項目のいずれも選択されていない場合、それは隠された入力値を送信します。しかし、オプションを選択するとすぐに、その選択された値が代わりに使用されます。

Iがある、Laravel/PHPに2つの異なるシナリオを区別することができた。この方法:

  • (PHPはmyitemsに空の文字列を受け取るように、隠された入力を必要とする)

    • すべて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> 
    
  • 関連する問題