在其他变量上使用PHP会话变量时会丢失它们

时间:2012-12-12 00:35:44

标签: php variables session

我有这个PHP脚本启动会话并创建其变量。这是代码片段:

<?php
session_start();
if (!is_array($_SESSION['cart'])) $_SESSION['cart'] = array();
$id = 10;
$_SESSION['cart'][$id] = array( 'cod' => 'ABC', 'price' => '80', 'status' => 'active' );
header('Location: http://www.example.com/checkout.php');
?>

当我使用 print_r 输出$ _SESSION数组时,我得到了这个:

Array (
    [cart] => Array (
        [136] => Array (
            [cod] => ABC
            [price] => 80
            [status] => active
        )
    )
)

这非常有效:创建了用户会话,并且很好地设置了所有变量,之后用户被重定向到了que checkout页面。

但是有一个问题:当用户到达que checkout页面时,一切看起来都很好。请参阅代码段:

<?php
session_start();
print_r($_SESSION);
?>

上面 print_r 的输出正是我们之前看到的:和Array填充了其他数组。大!但是这里开始了一个奇怪的部分:当我使用任何会话变量设置为另一个变量的值时,会话数据将丢失。看看:

<?php
session_start();
print_r($_SESSION);
$cart = $_SESSION['cart'];
foreach ($cart as $key => $data) : // if I use foreach($_SESSION['cart'] as $key => $data) will be the same thing
    /*** Do stuff here ***/
endforeach;
?>

上面 print_r 的输出是:

Array (
    [cart] => Array (
        [cod] => ABC
        [price] => 80
        [status] => active
    )
)

事实上,如果我只是输出变量值而不在脚本中使用它们,一切都可以。但是当我在脚本中的某处使用变量时(即使在放置 print_r 片段之后),会话变量也会丢失一些数据。

我试图序列化$_SESSION['cart']变量,但每次想要获取其值时反序列化都非常烦人。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我认为在foreach中处理Do Stuff Here部分时出现问题,您可以在处理时检查这个:

foreach ($cart as $key => $data)
{
if(is_array($data)){}
}