Как получить значение для снятого флажка в элементе флажка при отправке формы?

У меня есть форма, как показано ниже:

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

Затем снимите второй флажок и отправьте форму, результат будет таким:

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

Можно ли сделать результат, как показано ниже, когда снимите флажок:

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

Есть идеи сделать это?

Спасибо за вашу помощь.

Первый путь – скрытые поля (недостаток: пользователь может манипулировать значением поля (но можно также манипулировать значением флажка, так что это не проблема, если вы только ожидаете 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) */ 

Второй способ – присвоить значение по умолчанию для неустановленных индексов:

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

Я думаю, что добавление скрытых полей, подобных этому, будет работать

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

Я думаю, что невозможно получить массив, как вы хотите, из 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)

}

Попробуй это. Если флажок не установлен, то вместо этого будет передано скрытое поле с тем же именем.

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

Спасибо всем. Спасибо @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 /> 

Это отлично работает .. 🙂

вопрос уже может быть дан ответ, но я просто хотел нанести удар по нему … только на стороне сервера:

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

Почему вы взяли его в массиве? Вы можете получить флажок без отметки 0, используя "isset"

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

попробуйте под кодом

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

Попробуй это:

 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 к значению при получении сообщения или получения.

Пример:

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

Это принимает значение NULL и превращает его в ноль, но если значение равно единице, как в его проверке, тогда значение остается неизменным.

Реальная проблема здесь не придумывает обход. Его понимание, почему это происходит. Старые версии mySQL принимают нулевые значения и преобразуют их в нуль. В более новых версиях вы должны отключить строгий режим, а затем обход не нужен.