我创建了一个表单,如果发生错误,该表单将重新加载;如果提交成功,则会转至其他页面。
我不希望用户在出现错误的情况下一次又一次地填充所有值,因此我将它们存储在会话变量中并重新填写到表单中。
以下是表单的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”。
答案 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'];
。
祝你好运!