Не удается обратиться к массиву $_SESSION после уничтожения и session_start()

Я использую $_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 и 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;
 }

person o2fill    schedule 20.02.2013    source источник
comment
Они являются пустыми или не являются? Меня одного смущает формулировка?   -  person Colin M    schedule 21.02.2013
comment
Нужно увидеть больше кода, в частности, те его части, которые не работают.   -  person Mike    schedule 21.02.2013
comment
@ColinMorelli Я думаю, что там ничего не должно быть.   -  person Ryan B    schedule 21.02.2013
comment
@ user2091830: Вот, я обновил свой ответ.   -  person    schedule 21.02.2013


Ответы (1)


Ты делаешь это неправильно.

session_destroy() уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает глобальные переменные, связанные с сеансом, и не сбрасывает файл cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать session_start().

Чтобы завершить сеанс полностью, например, чтобы выйти из системы, идентификатор сеанса также должен быть отключен. Если файл cookie используется для распространения идентификатора сеанса (поведение по умолчанию), то файл cookie сеанса необходимо удалить. setcookie() можно использовать для этого.

Решение:

session_start();
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
person Community    schedule 20.02.2013
comment
Срок действия файла cookie 0 означает, что браузер будет закрыт. - person Mike; 21.02.2013
comment
Спасибо — значит, с $_SESSION разобрались и можно сохранять данные. Но $_POST по-прежнему ничего не принимает. b Может ли это быть связано? - person o2fill; 21.02.2013