【问题标题】:PHP - Checkbox input validation - Storing state of checkbox as a session variable?PHP - 复选框输入验证 - 将复选框的状态存储为会话变量?
【发布时间】:2012-05-27 08:31:26
【问题描述】:

我在为我的电子商务相关网站的 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';
}

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

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

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

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

能否提供一些有关我在哪里出错的信息或提出建议?

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

【问题讨论】:

    标签: php validation checkbox


    【解决方案1】:

    如果您想使用$_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 当然不会做任何其他事情,因为它只执行一次,然后用户才能看到实际页。也许您假设会反映客户端变量的更改,但除非您重新执行该服务器端代码(刷新页面),否则它不会反映。

    【讨论】:

    • 好的,谢谢您的回复!您的代码明确指出,如果会话变量存在并且值为 1,那么......现在,当会话变量被设置并且值为 1 时,用户与 post 值交互时会发生什么?我面临的问题是我不知道如何将两者结合起来。它是或者,根据您的代码,如果会话变量已设置并保持值为 1,则无论 post 变量如何,这都会触发...或者应该将与 post 相关的代码放在您的代码之前?
    • 并且正在设置会话变量,我检查了本地会话文件。它只是......如果它被选中,我无法取消选中它。
    • 当用户提交表单时,您重新分配从$_POST 获取的值并将其存储在$_SESSION 中,这样当它到达检查它的行时,它具有最新的价值。
    • 好的...假设我手动将会话变量设置为1。然后我直接导航到页面...复选框将被选中,计费信息可用...但我无法取消选中复选框?它只是保持勾选状态。
    • 如果你的意思是你点击了复选框并且它没有被取消选中,那是一个完全不同的主题,而不是 php,因为它是客户端并且可能反映了糟糕的 js。给我一个链接,我帮你查一下
    猜你喜欢
    • 2012-12-09
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2017-03-17
    • 2011-10-11
    • 2018-10-24
    相关资源
    最近更新 更多