web-dev-qa-db-ja.com

フォームの投稿時にチェックボックス要素の未チェックのチェックボックスの値を取得する方法

私は以下のようなフォームを持っています:

<form action="" method="post">
    <input type="checkbox" id="status_1" name="status_1" value="1" />
    <input type="checkbox" id="status_2" name="status_2" value="1" />
    <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>

すべてのチェックボックスをオンにしてフォームを投稿すると、結果は次のようになります。

Array ([status_3] => 1 [status_2] => 1 [status_1] => 1 ) 

次に、2番目のチェックボックスをオフにしてフォームを送信すると、結果は次のようになります。

Array ( [status_3] => 1 [status_1] => 1 ) 

2番目のチェックボックスをオフにすると、以下のような結果を出すことは可能ですか?

Array ( [status_3] => 1 [status_2] => 0 [status_1] => 1 ) 

それを行うためのアイデアはありますか?

26
Fredy

最初の方法-隠しフィールド(欠点:ユーザーはフィールドの値を操作できます(ただし、チェックボックスの値も操作できるため、1または0のみが期待される場合、実際には問題になりません))

<form action="" method="post">
<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="hidden" name="status_2" value="0" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
var_dump($_POST);
/*
 * checking only the second box outputs:
 * 
 * array (size=3)
  'status_1' => string '0' (length=1)
  'status_2' => string '1' (length=1)
  'status_3' => string '0' (length=1)
 */

2番目の方法-非設定インデックスにデフォルト値を割り当てるには:

<form action="" method="post">
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
for($i = 1; $i<=count($_POST); $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0;
}
var_dump($_POST);

/**
 * Here we will be checking only the third checkbox:
 * 
 * array (size=3)
  'status_3' => string '1' (length=1)
  'status_1' => int 0
  'status_2' => int 0
 */
47
Royal Bg

このように隠しフィールドを追加するとうまくいくと思います

<input type="hidden" id="status_1_" name="status_1"  value="0">
<input type="checkbox" id="status_1" name="status_1" value="1" />

<input type="hidden" id="status_2_" name="status_2" value="0">
<input type="checkbox" id="status_2" name="status_2" value="1" />

<input type="hidden" id="status_3_" name="status_3" value="0">
<input type="checkbox" id="status_3" name="status_3" value="1" />
8
nithin

私はあなたがHTMLフォームから望むもののような配列を取得することは不可能だと思います。しかし、このいくつかのトリックを使用することができます:

$defaultForm = array(
'status_1' => 0,
'status_2' => 0,
'status_3' => 0, 
);

// example array from $_POST
$form = array(
'status_1' => 1,
'status_3' => 1, 
);

$form = array_merge($defaultForm, $form);

結果:

array(3){

'status_1' => int(1)
'status_2' => int(0)
'status_3' => int(1)

}

2
Somy A

これを試して。チェックボックスがチェックされていない場合、同じ名前の非表示フィールドが代わりに渡されます。

<form action="" method="post">
  <input type="hidden" id="hidden_status_1" name="status_1" value="0" />
  <input type="checkbox" id="status_1" name="status_1" value="1" />
  <input type="hidden" id="hidden_status_2" name="status_2" value="0" />
  <input type="checkbox" id="status_2" name="status_2" value="1" />
  <input type="hidden" id="hidden_status_3" name="status_3" value="0" />
  <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>
2
luttkens

皆さんありがとう。 @RoyalBgに感謝します。このような :

<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" /> Check 1 <br />
<input type="hidden" name="status_2" value="0" /> 
<input type="checkbox" id="status_2" name="status_2" value="1" /> Check 2 <br />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" /> Check 3 <br />

それは完璧に動作します.. :)

1
Fredy

質問はすでに答えられているかもしれませんが、私はそれを突きたいだけです...サーバー側のみの解決策:

$p = $_POST;
$a = array();
$a['status_3'] = (int) ($p['status_3'] === 1);
$a['status_2'] = (int) ($p['status_2'] === 1);
$a['status_1'] = (int) ($p['status_1'] === 1);

テスト中

 // if input is Array("status_1"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 0 )

 // if input is Array("status_1"=>1, "status_2"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 1)
1
Jay Harris
<!--html code-->                                                                  
<input type="checkbox" name="correct" value="1">Option 1
<input type="checkbox" name="correct" value="2">Option 2
<input type="checkbox" name="correct" value="3">Option 3
<input type="checkbox" name="correct" value="4">Option 4                                   

//php code in function called on form submit       
  public function addOptions(Request $request)
   {
    $option = array('1' => 0,'2'=>0,'3'=>0,'4'=>0 );
    $option[$request->correct] = 1;
    return $option;
   }
1
Inderjeet Singh

以下のコードを試してください

    $myresult = array();

    if(!isset($_POST['status_1'])){ 
        $myresult['status_1'] = 0;
    }
    if(!isset($_POST['status_2'])){ 
        $myresult['status_2'] = 0;
    }
    if(!isset($_POST['status_3'])){ 
        $myresult['status_3'] = 0;
    }

    echo "<pre>";
    print_r($myresult);
    echo "</pre>";
    exit;
0
Mandip Darji

なぜあなたはそれをアレイに入れたのですか? 「isset」を使用して、チェックされていないボックスを0として取得できます。

    if(!isset($_POST['status_2'])
    {
      //Set status_2 parameter as 0
    }
0
Ankur

ゼロまたは1のチェックボックスを使用すると仮定します...

値がゼロの非表示のチェックボックスを使用することは、単なる回避策です。別の回避策は、投稿または取得を受信するときに値に0を追加することです。

例:

$ chkbx1 = $ _POST ['chckbx1']; $ chkbx1 + = 0;

これはNULL値を取り、それをゼロに変換しますが、値が1の場合、チェックされているように、値は同じままです。

ここでの本当の問題は、回避策を考案することではありません。なぜこれが起こっているのか理解しています。古いバージョンのmySQLはnull値を取り、それらをゼロに変換します。新しいバージョンでは、厳格モードを無効にする必要があり、回避策は必要ありません。

0
tom

これを試してください:

for ($i = 1; $i<=3; $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0; // 0 if not set
}

var_dump($_POST);
0