在destroy和session_start()之后无法解决$ _SESSION数组

时间:2013-02-20 20:52:15

标签: php session session-management

我正在使用$_SESSION来存储多页表单中的数据。在我完成提交并结束会话以防止在该人尝试重新输入表单时复制相同的表单数据时,一切都运行良好。表单完成并提交后,终止会话并清除会话数据:

$_SESSION = array();

setcookie(session_name(), '', time() - 42000);

session_destroy();

以下是:

<?php
session_start();

include "connect-moo.php";
$learning = true;

//get any post variables and save them to the session
foreach ($_POST as $key => $val) {
$_SESSION[$key] = $val;
 }

sessionDump();  //dumps session to db

//check to see if step is set (in the post eg ?step=getaquote). If not, set it to current session step

if(!isset($_POST["step"])) {
if(isset($_SESSION['step'])) {
    $_POST['step'] = $_SESSION['step'];
}
}

//show the page appropriate to the current step
if ($_SESSION['mode'] == 'edit' && $_SESSION['lastpage'] != "review" && $_SESSION['step'] != "session") {
$_SESSION['lastpage'] = 'review';
getReview();    
}
else { 
if($_SESSION['step'] != 'session') $_SESSION['lastpage'] = $_SESSION['step'];

switch ($_POST["step"])
{

    case "session":

        foreach($_SESSION as $key => $val){
            echo $key.": ".$val."<br>";
            //phpinfo();

        }

        echo "Post Data<br>";
        foreach($_POST as $key => $val) {
            $sval = mysql_real_escape_string($val);
            $skey = mysql_real_escape_string($key);
            echo $skey.": ".$sval."<br>";
        }

        break;

    case "getaquote":

        getAQuote();
    break;

    // and so on... 

            default:
        start();
}
}

... (all of the abovementioned functions)


?>

我已确认正在建立新的会话Cookie,但重新启动会话后$_POST$_SESSION为空。使用最近的修复(谢谢!)我可以以编程方式将数据推送到$ _POST和$ _SESION数组(例如$ _POST ['foo'] ='bar';)但是忽略了通过URI传递的变量。


解决方案:

re session_destroy,见Alex B回答。

重。 $ _POST问题 - 事实证明,当通过URL直接输入信息时,服务器将其(正确地)解释为GET而不是POST。我修改了我的代码以获取所有GET&amp; POST数据但在生产中只需要POST。这是新代码:

//get any submitted variables and save them to the session
foreach ($_GET as $key => $val) {
$_SESSION[$key] = $val;
 }
foreach ($_POST as $key => $val) {
$_SESSION[$key] = $val;
 }

1 个答案:

答案 0 :(得分:0)

你做错了。

session_destroy()销毁与当前会话相关的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话cookie。要再次使用会话变量,必须调用session_start()

为了完全终止会话,要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。可以使用setcookie()

解决方案:

session_start();
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);