Session $\会话存储无法直接分配阵列

Session $\会话存储无法直接分配阵列,session,php,Session,Php,今天我遇到了一个非常奇怪的情况。 我试图将$\u POST数据存储到$\u会话中。所以我先做了 $data = $db->FilterParameters($_POST); // method 1 $_SESSION['default']['car_rental'] = $data; 因此页面被加载,会话数据被正确保存。当我打印它们时,它们还可以。 但一旦我转到另一页,它们就会被销毁。 然后我试着 // method 2 foreach ($data as $k => $v){

今天我遇到了一个非常奇怪的情况。 我试图将
$\u POST
数据存储到
$\u会话中。所以我先做了

$data = $db->FilterParameters($_POST);
// method 1
$_SESSION['default']['car_rental'] = $data;
因此页面被加载,会话数据被正确保存。当我打印它们时,它们还可以。 但一旦我转到另一页,它们就会被销毁。 然后我试着

// method 2
foreach ($data as $k => $v){

    $_SESSION['default']['car_rental'][$k] = $v;
}
当我跳到第二页时,效果很好。并维护了会话数据。 我已经将
session\u start()
作为boht页面的第一行


为什么会这样?怎么了?我想不出来。

你必须有
会话_start()位于两个文件的顶部。如果未调用该函数,则您的
$\u SESSION[]
只是另一个数组,而不是
SESSION
超级全局,因此您不能在两个页面之间共享它。

您必须拥有
SESSION\u start()位于两个文件的顶部。如果未调用该函数,则您的
$\u会话[]
只是另一个数组,而不是
会话
超级全局,因此您不能在两个页面之间使用它。

您是否在检查
$\u POST
是否已填充?如果没有,它将使用第一种方法用空数组覆盖会话值

foreach方法知道数组何时为空且不执行,这意味着先前分配的值仍保留在会话中

下面是一些代码以突出显示正在发生的事情:

<?php

session_start();
header("Content-Type: text/plain\r\n");

// method one
$_POST = array('test' => true); // dummy post
$_SESSION['data'] = $_POST; // assign
$_POST = array(); // clear post
$_SESSION['data'] = $_POST; // assign
print_r($_SESSION); // print (gives empty array)

// method two
$_POST = array('test' => true); // dummy post
foreach ($_POST as $k => $v) $_SESSION['data'][$k] = $v; // assign
$_POST = array(); // clear post
foreach ($_POST as $k => $v) $_SESSION['data'][$k] = $v; // assign, does nothing
print_r($_SESSION); // print (gives populated array, foreach doesn't execute)

您是否正在进行任何类型的检查,以确保已填充
$\u POST
?如果没有,它将使用第一种方法用空数组覆盖会话值

foreach方法知道数组何时为空且不执行,这意味着先前分配的值仍保留在会话中

下面是一些代码以突出显示正在发生的事情:

<?php

session_start();
header("Content-Type: text/plain\r\n");

// method one
$_POST = array('test' => true); // dummy post
$_SESSION['data'] = $_POST; // assign
$_POST = array(); // clear post
$_SESSION['data'] = $_POST; // assign
print_r($_SESSION); // print (gives empty array)

// method two
$_POST = array('test' => true); // dummy post
foreach ($_POST as $k => $v) $_SESSION['data'][$k] = $v; // assign
$_POST = array(); // clear post
foreach ($_POST as $k => $v) $_SESSION['data'][$k] = $v; // assign, does nothing
print_r($_SESSION); // print (gives populated array, foreach doesn't execute)

你把
会话_start()放进去了吗在两个文件之上?我已经更新了问题。是的,伙计,我把它放进去了。可能是因为它的递归引用,$\u POST数组不可序列化吗?您是将整个$\u POST复制到$数据中还是只复制所需的项目?我是在
$data
中复制整个$\u POST
,但我的
$\u POST
本身是单维度的,而不是多维度的。我只是把
$\u SESSION
存储在里面,把
$\u POST
变成多维的。你把
SESSION\u start()放进去了吗在两个文件之上?我已经更新了问题。是的,伙计,我把它放进去了。可能是因为它的递归引用,$\u POST数组不可序列化吗?您是将整个$\u POST复制到$数据中还是只复制所需的项目?我是在
$data
中复制整个$\u POST,但我的$\u POST本身是单维度的,而不是多维度的。我只是将
$\u SESSION
存储在其中,将
$\u POST
作为多维会话。是的,我输入了,除了使用
foreach()
循环之外,我没有做任何更改,然后它开始正常工作是的,我输入了,除了使用
foreach()
循环之外,我没有做任何更改,然后它开始正常工作了。我完全同意你的看法,但那只是在
$\u POST
重置之后,我添加了表单验证,因此
$\u POST
不可能是空的,它每次都会被填充。@RajanRawal你能给我们看一下整个文件吗?这可能与我们看不到的东西有关。我真的很感谢您的关心,但根据公司规定,我不能共享文件。否则我会给自己制造麻烦。我知道这里面没什么大不了的,但即使是。现在它使用for循环,所以我继续使用这个循环。再次感谢您,我完全同意您的意见,但只有当
$\u POST
重置时,我才添加了表单验证,因此
$\u POST
不可能为空或空白,每次都会填充。@RajanRawal您能给我们看一下整个文件吗?这可能与我们看不到的东西有关。我真的很感谢您的关心,但根据公司规定,我不能共享文件。否则我会给自己制造麻烦。我知道这里面没什么大不了的,但即使是。现在它使用for循环,所以我继续使用这个循环。再次感谢