【问题标题】:PHP single checkbox sticky form - sessionPHP单复选框粘性表单-会话
【发布时间】:2013-01-24 03:17:26
【问题描述】:

我的复选框有问题,我需要成为棒状表单的一部分,该复选框将通过会话记住,以便用户可以浏览不同的页面,并在返回时记住他们的复选框选择。

如果用户希望他们的交货详细信息与他们在表单顶部输入的帐单详细信息相同,则可以单击该复选框。无需担心我如何将交货详细信息与帐单详细信息分配到相同的位置,就像我在后面的页面中所做的那样。

注意:Javascript 完全不适合这个,无论如何都不需要它,但只是提醒一下 :)。这是一种粘性表单,它会向自己发布直到满足所有条件($flag == "ok"),然后将用户发送到下一页。

我现在将提供我认为相关的代码:

PHP(这部分代码可能不相关,但正如我所见,我将其包括在内,在将用户发送到下一页之前设置最终的$_SESSION['sameasbilling'] 将是什么(order-confirm.php

if ($flag == "ok"){
    $sameasbilling = cleanString($_POST['sameasbilling']);
    $_SESSION['sameasbilling'] = $sameasbilling;

    if (!headers_sent()){
        //send user to next page
        header("Location: order-confirm.php");
    }else{
        echo "Not Sent";
    }
}

HTML/PHP

<p>Same as billing address? &nbsp;&nbsp;&nbsp;
<input type="checkbox" id="sameasbilling" name="sameasbilling" value="1" 
<?php 
if (isset($_POST['sameasbilling'])) {
    print ' checked="checked"';
    $_SESSION['sameasbilling'] = "1";
} else {
    $_SESSION['sameasbilling'] = "";
}
?> />

据我所知,最重要的一段代码在上面我尝试确定是否输出checked='checked'以及是否重置/设置'sameasbilling'会话值。

PS 我已经经历了很多次了,所以我在输入元素中的 IF 语句非常糟糕,但是当你停留在同一页面并收到错误时,现在确实记得你的选择,但是当你移至下一页并返回您的选择不被记住,我知道我根本没有任何代码可以真正做到这一点,但我希望有人能建议我如何实现这一点。

【问题讨论】:

  • 看起来你已经回答了这个问题,或者实际上......没有问题。
  • +1 并且在设置 header(Location) 后总是 exit()
  • @soyuka *设置 header("location");例如,您不想死在 header("Content-type") 之后!
  • 你说得对,这篇文章实际上没有问号。我现在修改一下。但是我的问题是,如果设置了会话变量并记住它,如果用户取消选中该复选框,我如何让该 IF 语句说明并允许表单更改会话变量。这有意义吗?
  • So: if (!headers_sent()) { //将用户发送到下一页 header("Location: order-confirm.php");出口(); }

标签: php forms validation checkbox


【解决方案1】:

这仅适用于输入框提交时的第一页。要在返回页面后使其工作,您还需要检查您设置的 $_SESSION 变量。您可以尝试在 if 语句中添加 or 部分,例如。

if (!isset($_POST['sameasbilling']) && $_SESSION['sameasbilling'] != "1") {
     $_SESSION['sameasbilling'] = "";
} else { 
print ' checked="checked"';
    $_SESSION['sameasbilling'] = "1";

}

**编辑

if(isset($_POST['your_submit_button'])){
        if (isset($_POST['sameasbilling'])) {
            print ' checked="checked"';
            $_SESSION['sameasbilling'] = "1";
        } else {
            $_SESSION['sameasbilling'] = "";
        }
    }else if ($_SESSION['sameasbilling'] == "1") {
        print ' checked="checked"';
    }

【讨论】:

  • 这行得通,但我遇到了一个我以前遇到过的问题,如果我取消选中该框并提交表单,则会话无法重置为 == ""。它始终保持勾选状态,因为 session['sameasbilling'] 没有得到更新。这有意义吗?
  • 抱歉,错过了。尝试更新版本,而不是检查两者都没有设置。
  • 您好,感谢您的回复。但是,如果用户在页面上更改了复选框,则它不会被捕获。因此,例如,用户提交表单时名字字段为空并勾选了复选框,页面自行运行并返回自身,并出现关于名字字段的错误,并且由于您的代码而勾选了复选框。然而,用户随后决定取消选中该框并重新提交表单,但名字字段仍为空。页面刷新,但应取消勾选的复选框仍处于勾选状态。如果发生这种情况,有没有办法重置 $_SESSION['sameasbilling']?
  • 我今天早上跑得有点慢。尝试了另一个版本。检查用户是否首先提交了表单,如果他们离开了表单字段,否则使用会话变量。
  • 非常感谢您,这似乎工作得很好!非常感谢。
【解决方案2】:

为了使这更符合逻辑,假设$_POST['sameasbilling'] 是一个复选框,我会这样做:

if(isset($_POST['sameasbilling']) && !empty($_POST['sameasbilling']))
    $_SESSION['sameasbilling'] = 1;
else
    $_SESSION['sameasbilling'] = 0;

if (isset($_POST)) //or check if the submit has been sent or even the session
{
    //send user to next page
    header("Location: order-confirm.php");
    exit();
}
else
    die("Not Sent"); //or set the header location to the previous page with an error

<input type="checkbox" id="sameasbilling" name="sameasbilling" value="1" <?php echo $_SESSION['sameasbilling'] == 1 ? 'checked="checked"' : '';?> />

【讨论】:

    【解决方案3】:

    我想你是说

    if ($_SESSION['sameasbilling']){
        header("Location: order-confirm.php");
        exit();
    }
    

    或者如果您再次发送复选框值,请在此处跳过会话位

    if (isset($_POST['sameasbilling'])){
    

    【讨论】:

    • 感谢您的回复,是的,我有。
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多