Предотвратить смещение значений флажков после перезагрузки страницы при отправке формы - PullRequest
0 голосов
/ 01 сентября 2018

Я создал форму, которая перезагружается в случае ошибки и переходит на другую страницу в случае успешной отправки.

Я не хочу, чтобы пользователи заполняли все значения снова и снова в случае ошибки, поэтому я сохраняю их в переменных сеанса и заполняю их обратно в форме.

Вот HTML-код формы:

<form action="preference.php" method="post">
<input id="optiona-cb" name="userpref[]" type="checkbox" value="optiona" <?php if((isset($_SESSION['userpref'][0]) && $_SESSION['userpref'][0])) { echo 'checked'; } ?>/>
<label for="optiona-cb">optiona</label>
<input id="optionb-cb" name="userpref[]" type="checkbox" value="optionb" <?php if((isset($_SESSION['userpref'][1]) && $_SESSION['userpref'][1])) { echo 'checked'; } ?>/>
<label for="optionb-cb">optionb</label>
<input id="optionc-cb" name="userpref[]" type="checkbox" value="optionc" <?php if((isset($_SESSION['userpref'][2]) && $_SESSION['userpref'][2])) { echo 'checked'; } ?>/>
<label for="optionc-cb">optionc</label>
... More Input Fields
</form>

Вот код от preference.php:

$_SESSION['userpref'] = $_POST['userpref'];
$_SESSION['user_login'] = $_POST['user_login'];
$_SESSION['user_email'] = $_POST['user_email'];
.. More code

При перезагрузке страницы значения username и email заполняются правильно. Однако значения флажка смещаются. Например, если пользователь проверяет только optionc, значение optiona проверяется при перезагрузке. Аналогично, если пользователь проверяет optiona и optionc, проверяются значения optiona и optionb.

Другими словами, «дыры» в отмеченных флажках заполняются при перезагрузке страницы. Как я могу убедиться, что значения флажков не сдвигаются, чтобы заполнить пустые значения?

Я использую WordPress, если это имеет значение. :)

Некоторые разъяснения:

Значения флажка хранятся в userpref[] и доступны с помощью $_POST['userpref']. Я понятия не имею, как браузер передает информацию о установленном флажке, используя $_POST.

Допустим, пользователи проверяют первый и третий флажок. Также предположим, что userpref[] хранит 1 для каждого установленного флажка и 0 для каждого установленного флажка. В этом случае значение будет [1, 0, 1].

Однажды я храню эти значения в $_SESSION['userpref'], они, кажется, сдвигаются. Другими словами, массив становится чем-то вроде [1, 1, 0] или как [1, 1], и никакое третье значение не подразумевает непроверенный флажок.

Итак, вместо проверки первого и третьего флажка при перезагрузке. Браузер проверяет первое и второе. Третий флажок остается не отмеченным.

У меня вопрос, что я могу сделать, чтобы убедиться, что флажки сохраняют свой статус снятия флажка и не сдвигаются, заполняя «дыры» или «0».

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Проверьте ваши значения следующим образом:

<input id="optiona-cb" name="userpref[]" type="checkbox" value="optiona" 
  <?php if (in_array('optiona', $_SESSION['userpref'])) echo 'checked' ?> />

Объяснение :

Вы не можете полагаться на числовые индексы, такие как [0] или [1], потому что, как вы заметили (и как кто-то прокомментировал), на сервер будут отправляться только отмеченные флажки. Так, например, если первый не проверен, а второй - $_SESSION['userpref'][0] будет ссылаться на второй (потому что это первый проверенный).

0 голосов
/ 02 сентября 2018

Проблема в том, что вы пытаетесь получить соответствующие «вкл / выкл» флажки на основе индекса, когда они отправляются из браузера. Итак, что происходит, когда вы выбираете только флажки индекса 0 и 2? Будут отправлены только эти 2, что-то вроде userpref[]=optiona&userpref[]=optionc, и теперь у вас есть только 2 позиции в массиве, тогда будут выбраны первые 2 флажка!

По сути, это не правильное совпадение, поэтому вам следует вместо этого проверить на основе значений флажков.

Еще одно замечание: если ни один из флажков не установлен, следующая строка будет проблемой $_SESSION['userpref'] = $_POST['userpref'];.

Удачи !!

0 голосов
/ 02 сентября 2018

Я думаю userpref abc => 000, 001, 010, 011, 100, 101, 110, 111 (8 вещей)

Вы должны отправить userpref optiona + optionb + optionc => "abc", например "010"

итак, я думаю, что вы используете

substr($_POST['userpref'], 0, 1), 
substr($_POST['userpref'], 1, 1),
substr($_POST['userpref'], 2, 1)

Вы можете это.

<input id="userpref" name="userpref" type="hidden" />
handleSubmit() {
    //...

    const a = $("#optiona").prop("checked") ? "1" : "0";
    const b = $("#optionb").prop("checked") ? "1" : "0";
    const c = $("#optionc").prop("checked") ? "1" : "0";
    $("#userpref").val(a+b+c);

    //...
    window.document.forms[0].submit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...