У меня есть форма, как показано ниже:
<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 принимают нулевые значения и преобразуют их в нуль. В более новых версиях вы должны отключить строгий режим, а затем обход не нужен.