PHP - 复选框输入 将复选框的状态存储为会话变量


PHP - Checkbox input Storing state of checkbox as a session variable?

我在整理一个页面时遇到了一些问题,该页面验证和存储了我的电子商务相关网站的CMS部分的用户信息。

页面的一部分包含一个选项,供用户选择是否需要与其送货地址不同的帐单地址。这是页面上的两个表单之一。

第一种形式是一个表格,用户可在其中选择是否需要备用帐单邮寄地址。

基于此选择,将生成第二个表单,如果需要,则包含帐单地址的额外空格,或者不包含。

以下是与将事物置于上下文中的第一个表单相关的 html:

<form name="isSameAsPostal" action="" method="post">
<table class="adminTable" align="center">
<thead class="tableAddEdit">
    <tr>
        <th colspan="4">Details</th>
        <th colspan="1">Active</th>
    </tr>
</thead>
<tfoot class="tableFooter">
    <tr>
        <td colspan="5">This table stores the users addittional information.</td>
    </tr>
</tfoot>
<tbody>
<tr>
    <td colspan="4">User has different billing address?</td>
    '.$topCont.'
</tr>
</tbody>
</table>
</form>

如您所见,输入本身不包含在表单中,它作为在脚本控制器中设置的变量应用。

这是将事情放在上下文中的 php:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
    $_SESSION['sameAsPostal'] = 1;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}

正如你所看到的,javascript用于在输入状态发生变化时自动提交表单。

现在基于此,一切几乎都正常工作,就像我最初开始这样做时的想法一样。

根据控制器,勾选复选框,会话变量$sameAsPostal设置为"1",用于触发在第二个表单中生成额外的计费选项。

与此同时,复选框

的值变为"0",从而允许取消选中该复选框并删除第二种形式的计费信息,因为$sameAsPostal将设置为 0,如控制器脚本的第二部分所示。控制器的最后一部分作为要添加到页面的输入的第一个实例包含在内。没有它,就不会有输入。

太好了,就像我说的,这一切都有效。但是我现在面临的问题是下一个合乎逻辑的补充。当第二个表单经过验证并遇到输入错误时,将刷新页面并应用正确的错误突出显示。在此范围内,复选框也会重置,导致帐单信息部分消失。(填充单个输入的信息仍然存储,但随着复选框的重置,它的实际 HTML 消失了)

所以我尝试了对控制器的添加:

if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
    $_SESSION['sameAsPostal'] = 1;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else if (isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1)
{
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal';
}
else if ((isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1) && (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0))
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}
else
{
    $_SESSION['sameAsPostal'] = 0;
    $topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
    $otherCont = 'postal and billing';
}

老实说,还有很多其他人...但似乎我的逻辑和这项任务所涉及的实际逻辑似乎有所不同。

对控制器的这一添加使得复选框在选中时无法取消选中。

我添加了会话变量以捕获复选框的状态,然后首先将正确的输入应用于第一个表单,然后根据需要生成计费信息部分。

但似乎无论我如何配置控制器脚本,我似乎都无法让它以这种方式工作。

可以提供有关我出错的地方的一些信息或提出建议吗?

提前感谢您抽出宝贵时间阅读本文!!

如果要使用$_SESSION变量,则需要确保每次都启动会话,以存储这些值。我将假设您在第一次提交表单后存储复选框值,从$_POST数组获取它。

您可以改为从提交的表单中检查该值,但为了将其与您的问题联系起来,我所能想到的就是您没有正确启动会话。

顺便说一句,你只需要像这样检查它,因为即使它没有设置,它也不会破坏你的代码。我认为你把事情复杂化了一点。

if($_SESSION['sameAsPostal'] == 1){
    //Do your code for checked
}else{
    //Do your code for unchecked
}

总而言之,请确保在代码中session_start()第一件事,并从提交的表单中获取值 (0,1)。要根据变量的值标记复选框,您可以执行以下更简单的操作:

$checked = ($_SESSION['variable'] == 1)?1:0;
echo "<input type='checkbox' value='$checked' title='My checkbox' />";

请注意,如果您使用 AJAX 发送表单并且页面从未真正重新加载,那么 PHP 当然不会执行任何其他操作,因为它只执行一次,在用户看到实际页面之前。也许您假设变量客户端中的更改会反映出来,但除非您重新执行该服务器端代码(刷新页面),否则不会。