防止表单提交后页面重新加载后复选框值移动

时间:2018-09-01 20:33:09

标签: javascript php forms checkbox

我创建了一个表单,如果发生错误,该表单将重新加载;如果提交成功,则会转至其他页面。

我不希望用户在出现错误的情况下一次又一次地填充所有值,因此我将它们存储在会话变量中并重新填写到表单中。

以下是表单的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

在页面重新加载时,正确填充了usernameemail值。但是,复选框的值会移动。例如,如果用户仅检查optionc,则值optiona会在重新加载时被检查。同样,如果用户选中optionaoptionc,则值optionaoptionb也会被选中。

换句话说,选中的复选框中的“孔”将在页面重新加载时被填充。如何确保复选框值不会移位以填充空值?

如果这很重要,我正在使用WordPress。 :)

一些澄清:

复选框值存储在userpref[]中,并使用$_POST['userpref']访问。我不知道浏览器如何使用$_POST传递有关选中复选框的信息。

比方说,用户选中了第一个和第三个复选框。还要假设userpref[]为每个选中的复选框存储1,为每个未选中的复选框存储0。在这种情况下,该值为[1、0、1]。

一次,我将这些值存储在$_SESSION['userpref']中,它们似乎转移了。换句话说,数组变成[1,1,0]或[1,1]之类的东西,并且没有第三个值表示未选中复选框。

因此,无需在重新加载时选中第一个和第三个复选框。浏览器检查第一个和第二个。第三个复选框仍未选中。

我的问题是,我该怎么做以确保复选框保留其取消选中状态,并且不会移位以填充“漏洞”或“ 0”。

3 个答案:

答案 0 :(得分:0)

我认为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();
}

答案 1 :(得分:0)

像这样测试您的值:

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

说明

您不能依赖诸如[0][1]之类的数字索引,因为正如您所注意到的(和有人评论的那样),只有复选框会发送到服务器。因此,例如,如果第一个未选中,则$_SESSION['userpref'][0]将引用第二个(因为它是第一个选中的)。

答案 2 :(得分:0)

问题在于,您正在尝试根据从浏览器提交的索引来使复选框的相应“打开/关闭”。因此,当您仅选择复选框索引0和2时会发生什么?仅提交那2个,类似于userpref[]=optiona&userpref[]=optionc,现在您在数组中只有2个位置,那么将选择前2个复选框!

基本上,这不是正确的匹配,因此您应该根据复选框的值进行验证。

要说明的另一点是,如果未选中任何复选框,则以下行将成为问题$_SESSION['userpref'] = $_POST['userpref'];

祝你好运!