使用php和会话的多步骤表单

时间:2014-09-06 10:21:59

标签: php session-variables

我有一个管理表格,其中包含多个步骤,可以来回走动。我决定使用会话,因为如果有人来回走动,我不必担心发送所有变量,因为它们会保存在会话中。

在第一步中,我删除会话(如果有)。我这样做,因为如果有人之前已经注册并想要再次注册其他人,那么所有先前的输入都将出现在输入框中。所以这是起始页面step1.php:

<?php isset($_SESSION))session_destroy(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head> ... </head>
    <body>
    <form  action='step2.php' enctype="multipart/form-data" method='post'> 
    ...
    </form>
    </body>
</html>    

然后,我将所有输入保存在step2.php中的$ _SESSION数组中:

<?php 
    $_SESSION['var1']=$_POST['var1']
    $_SESSION['var2']=$_POST['var2']   
    ...
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head> ... </head>
    <body>
    <form  action='step3.php' enctype="multipart/form-data" method='post'> 
    ...
    </form>
    </body>
</html>   

问题是,如果有人注册并在页面step2.php并且意外地在新选项卡中打开step1.php,则所有已保存的变量来自step1.php($ _SESSION ['var1'],$ _ SESSION ['var2} '],..)丢失了。

有没有可能阻止这种情况发生?

3 个答案:

答案 0 :(得分:1)

始终POST到相同的URL并执行不同的代码分支,具体取决于您收到的字段。

答案 1 :(得分:1)

创建一个会话变量,该变量在提交step2.php中的表单后不再存在。然后在step1.php中删除会话之前检查是否存在此变量。

例如:

在第1步:

if (!isset($_SESSION["do_not_destroy"]) session_destroy();
$_SESSION["do_not_destroy"] = 1;

在第3步:

unset($_SESSION["do_not_destroy"]);

答案 2 :(得分:0)

这是一个非常简单的多步骤表单示例,具有会话和重置功能......不确定如何,但可能会给你一些想法。您可以参与JavaScript验证。

<?php 
// startup
if ( empty($_POST["f1"]) && empty($_POST["f2"]) && empty($_POST["f3"]) && empty($_SESSION["mode"]) ) {
    $mode = 1;
    $_SESSION["mode"] = 1;
}

// reset
if ( !empty($_POST["reset"]) ) {
    $mode = 1;
    $_SESSION["mode"] = 1;
}

// section A
if ( $_SESSION["mode"] == 1 ){
    if ( !empty($_POST["f1"]) ) {
        $mode = 2; // switch to next
        $_SESSION["mode"] = 2;
    }else{
        $mode = 1; // stay current step
    }
}
// section B
if ( $_SESSION["mode"] == 2 ){
    if ( !empty($_POST["f2"]) ) {
        $mode = 3;// switch to next
        $_SESSION["mode"] = 3;
    }else{
        $mode = 2; // stay current step
    }
}
// section C - last part
if ( $_SESSION["mode"] == 3 ){
        $mode = 3;// stay current step
}

?>  

<form action="" method="post">
<?php if( $mode == 1 )  { ?> A: <input type="text" name="f1"><br> <?php } ?>        
<?php if( $mode == 2 )  { ?> B: <input type="text" name="f2"><br> <?php } ?>        
<?php if( $mode == 3 )  { ?> C: <input type="text" name="f3"><br> <?php } ?>    
<br><br>
<input type="submit">
<input name="reset" type="submit" value="Reset">
</form>