web-dev-qa-db-ja.com

空のチェックボックスを使用してHTMLフォームを送信する

HTMLフォームがあります。PHPを使用して、フォームのデータをMySQLデータベースに送信しています。フォームの質問に対する回答の一部にはチェックボックスがあります。明らかに、ユーザーは1つの質問に対してすべてのチェックボックスをチェックする必要はありません。また、他の質問(ラジオグループを含む)をオプションにします。

ただし、空のボックス、ラジオグループなどを含むフォームを送信すると、それぞれについて「Undefined index」エラーメッセージの長いリストを受け取りました。

どうすればこれを回避できますか?ありがとう。

39
Tray

チェックされていないラジオまたはチェックボックス要素は、 成功 と見なされないため送信されません。そのため、issetまたはempty関数を使用して送信されたかどうかを確認する必要があります。

if (isset($_POST['checkbox'])) {
    // checkbox has been checked
}
41
Gumbo

私は時々このテクニックを使用しました:

<input type="hidden" name="the_checkbox" value="0" />
<input type="checkbox" name="the_checkbox" value="1" />

note:これは異なるサーバーサイド言語で 異なる と解釈されるため、必要に応じてテストと調整を行います。 SimonSimCity に感謝します。

92
ceejayoz

チェックされていないチェックボックスはPOSTデータで送信されません。空かどうかを確認するだけです:

_if (empty($_POST['myCheckbox']))
     ....
else
     ....
_

In PHP empty() および isset() 通知を生成しません。

7
Greg

JavaScriptを使用した簡単な回避策を次に示します。

チェックボックスを含むフォームが送信される前に、「オフ」のものを0に設定し、送信することを確認します。これは、たとえばチェックボックス配列に対して機能します。

/////例//////

id = "formId"のフォームが与えられた

<form id="formId" onSubmit="return formSubmit('formId');" method="POST" action="yourAction.php">

<!--  your checkboxes here . for example: -->

<input type="checkbox" name="cb[]" value="1" >R
<input type="checkbox" name="cb[]" value="1" >G
<input type="checkbox" name="cb[]" value="1" >B

</form>
<?php


if($_POST['cb'][$i] == 0) {
    // empty
} elseif ($_POST['cb'][$i] == 1) {
    // checked
} else {
    // ????
}

?>


<script>

function formSubmit(formId){

var theForm = document.getElementById(formId); // get the form

var cb = theForm.getElementsByTagName('input'); // get the inputs

for(var i=0;i<cb.length;i++){ 
    if(cb[i].type=='checkbox' && !cb[i].checked)  // if this is an unchecked checkbox
    {
       cb[i].value = 0; // set the value to "off"
       cb[i].checked = true; // make sure it submits
    }
}

return true;

}

</script>
5
idf

Fmsfのコードに追加するには、チェックボックスを追加するときに、名前に[]を入れて配列にします

<FORM METHOD=POST ACTION="statistics.jsp?q=1&g=1">
    <input type="radio" name="gerais_radio" value="primeiras">Primeiras Consultas por medico<br/>
    <input type="radio" name="gerais_radio" value="salas">Consultas por Sala <br/>
    <input type="radio" name="gerais_radio" value="assistencia">Pacientes por assistencia<br/>
    <input type="checkbox" name="option[]" value="Option1">Option1<br/>
    <input type="checkbox" name="option[]" value="Option2">Option2<br/>
    <input type="checkbox" name="option[]" value="Option3">Option3<br/>
    <input type="submit" value="Ver">
3
user58670

これを使って

$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;

または、noの値を0に置き換えます

2
Cruachan

どちらがチェックされたかを検出するのは困難です。

Forループでフォームにデータを入力する場合、valueプロパティをデータホルダーとして使用してください。

    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i ?>"
    <?endfor;?>

フォームを送信すると、チェックしたチェックボックスの注文番号が表示されます(この場合、3番目と4番目のチェックボックスをチェックしました):

   array(1) {       
       ["active"]=>
          array(2) {
            [0]=>       
             string(1) "3"
            [1]=>
             string(1) "4"
          }
   }

ループでフォームデータを処理しているとき、たとえばpost.phpで、次のコードを使用して、関連する行が選択されているかどうかを検出します。

    if(in_array($_POST['active'] ,$i)) 
            $answer_result = true;
        else 
            $answer_result = false;

テスト用の最終コード:

    <?php if (isset($_POST) && !empty($_POST)):
        echo '<pre>';
        var_dump($_POST);
        echo '</pre>';
    endif;
    ?>
    <form action="test.php" method="post">
    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i; ?>" />
    <?php endfor;?>
    <button type="submit">Submit</button>
    </form>
2
tolginho

多くの回答が提出されましたが、カスタマイズされたチェックボックスを使用したため、自分のソリューションを即興で作らなければなりませんでした。言い換えれば、答えはどれも私にとってはうまくいきませんでした。

私が取得したかったのは、オンとオフの値を持つチェックボックスの配列です。トリックは、各チェックボックスのオン/オフ値にセパレータを送信することでした。セパレータが「;」だとしましょうあなたが得る文字列は

;, on、;、;、;

次に、投稿を取得したら、「、」を分割用の文字として使用してデータを配列に分割し、配列要素に「on」が含まれている場合はチェックボックスがオンになり、そうでない場合はオフになります。

各チェックボックスについて、IDを変更します。他のすべては同じです...繰り返される構文は次のとおりです。

    <div>
    <input type="hidden" name="onoffswitch" class="onoffswitch-checkbox" value=";" />
    ...some other custom code here...
    <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch1" checked>
    </div>

編集:「;」の代わりに、いくつかのKEY文字列値を使用できます。そうすれば、サーバーでPOSTが取得されると、順序を台無しにしないことがわかります。サイド...この方法で、Map、Hash、その他何でも簡単に作成できますPS:両方を同じdivタグ内に保持します。

1
Damir Olejar