2014-09-06 20 views
0

我有一個由多個步驟組成的管理表單,可以前後移動。我決定使用會話,因爲如果有人來回發送,我不必擔心發送所有變量,因爲它們保存在會話中。使用php和會話的多步表單形式

在第一步中,我刪除會話(如果有的話)。我這樣做是因爲如果某人之前已經註冊並且想要爲其他人重新註冊,那麼之前的所有輸入都會出現在輸入框中。因此,這是起始頁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>  

然後,我保存了$ _SESSION陣列中step2.php所有輸入:

<?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'],..)所有保存的變量都將丟失。

有沒有可能防止這種情況發生?

回答

1

總是POST到相同的URL並執行不同的代碼分支,具體取決於您收到的字段。

+0

非常好!謝謝。 – Adam 2014-09-06 10:31:36

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"]); 
+1

謝謝你的解決方案。但我想我把所有的stepX.php文件放在一個文件中,註冊完成後我只需刪除會話。 – Adam 2014-09-06 10:37:05

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>