0

我在设置一个非常小的应用程序时遇到了一些麻烦。这将是一个小调查。

表格分为两页。提交第一个后,数据存储在$_SESSION数组中:

save_items(array('my_data' => $my_data_oject));

该函数save_items()如下所示:

function save_items(array $array) {
    foreach ($array as $name => $item) {
        $_SESSION[$name] = $item;
    }
}

然后我unset($_POST) 像这样重定向:

header('Location: index.php?action=survey_part2');
exit;

我的问题是:重定向后,之前存储的登录数据仍在$_SESSION,但my_data_object不是。如果我避免重定向,我可以看到它在重定向开始之前my_data_object存储在$_SESSION数组中。因此 和 的组合header()似乎exit部分地破坏了会话。有谁知道这怎么会发生?

最后,我的控制器的一部分:

<?php
error_reporting(E_ALL);
session_start();

require_once 'models/functions.php';
require_once 'models/classes.php';

$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : NULL;
$view = $action;
$language = isset($_REQUEST['lang']) ? $_REQUEST['lang'] : 'de';

switch ($action) {
    case 'login' :
        if ((!empty($_POST['email'])) && (!empty($_POST['password']))) {
            $user = new User();
            $login = $user->find_user($_POST);
            if (!empty($login)) {
                set_message('Welcome ' . $login['Firstname'] . ' ' . $login['Lastname'] . '!');
                save_items(array('user_id' => $login['CID']));
                unset($_POST);
                redirect("index.php?action=survey&lang=de"); //<- works fine. Login is kept, Message is kept.
            } else {
                set_message('Please try again.');
                unset($_POST);
            }
        } else {
            unset($_POST);
            set_message('Try again.');
        }
    break;

/* ... shortage */
    case 'survey' :
        check_login(); //<- doesn't matter
        if (empty($_POST)) {
            /* ... shortage */
        } else {
            /* ... creation of my_data_object + setting one more message */
            save_items(array('my_data' => $my_data_object));
            unset($_POST);
            save_items(array('test' => 'you see me?')); //<- index.php?action=survey_2 won't get it
            //var_dump($_SESSION);
            header('Location: index.php?action=survey_2&lang=de'); //<- does not work. Login is kept in $_SESSION, but not my_data
            exit;
        }
    break;

谢谢!

这个话题可能和这里的那个差不多,但是我$_SESSION的后面不是空的header(),而是被部分删除了。

4

1 回答 1

0

现在我发现了问题。我尝试使用 save_items() 序列化 PDO,1 天后我发现了错误消息。我今天的提示:如果可以,请查看 php_error_log,因为有时屏幕上不会显示非常重要的错误消息。

所以我的问题与那个有关!

解决方案:将数据作为数组放入 $_SESSION 或使用 __sleep() 和 __wakeup() 指定哪些属性(不是:$db = new PDO();)应该序列化,哪些不应该序列化。

于 2013-05-13T10:54:10.653 回答