您是否无法在SESSION变量之间传递数组中的数组


Are you unable to pass an array within array between SESSION variables?

我正在将值从表单传递到处理页面。还有更多的领域,但值得关注的是:

<label><input type="checkbox" name="plans[]" value="1" /> Number 1</label>
<label><input type="checkbox" name="plans[]" value="2" /> Number 2</label>
<label><input type="checkbox" name="plans[]" value="3" /> Number 3</label>
<label><input type="checkbox" name="plans[]" value="4" /> Number 4</label>

我知道这些值是正确提交的,并且在处理页面上打印$_POST时存在,在我的$_POST数组中显示计划数组。

在我的处理页面(从表单提交)上,如果数据中发生错误,原始$_POST值将存储为新的$_SESSION["字段"]变量,以便在页面重定向到上一页时可以重新填充字段。

$_SESSION['fields'] = $_POST;

如果确实发生了错误,我的实际表单页面会从SESSION变量中提取原始字段值,代码如下:

if(isset($_SESSION['fields'])) {
        $fields = array();
        $fields = $_SESSION['fields'];
        unset($_SESSION['fields']);
}

打印$fields变量时,除原始数组(复选框)外,将显示所有原始post值。他们根本没有出现(但是姓名、地址等会出现)。

您是否无法以这种方式通过引用传递数组中的数组?

编辑

流程如下:

  1. form.php
  2. (所有值都会POST发送到处理页面)processing.php
  3. POST值经过验证,如果存在任何错误或问题,$_SESSION["字段"]=$_POST
  4. 重定向回form.php以修复错误,突出显示问题,并在字段中显示所有原始值

在将数据传递给SESSION变量之前,请确保没有进行任何类型的数据操作,例如array_pop()或array_map()。array_map(strtoupper)破坏数组的原因是strtouppers试图在数组上执行,而不是在单个元素上执行。为了解决这个问题,你可以在映射中检查is_array,然后在那里循环,或者在嵌套数组元素的情况下设置递归函数。

这里似乎还有其他问题。查看以下内容:

index.html:

<form method="post" action="l.php" >
<label><input type="checkbox" name="plans[]" value="1" /> Number 1</label>
<label><input type="checkbox" name="plans[]" value="2" /> Number 2</label>
<label><input type="checkbox" name="plans[]" value="3" /> Number 3</label>
<label><input type="checkbox" name="plans[]" value="4" /> Number 4</label>
<input type="submit" />
</form>

l.php

<?php
session_start();
$_SESSION['fields'] = $_POST;
header("Location: o.php");

o.php

<?php
session_start();
var_dump($_SESSION);

如果你在index.html中提交表单,你最终会在o.php上得到这样的结果:

array(1) { ["fields"]=> array(1) { ["plans"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "3" } } }

它对你有用吗?

顺便说一句,你可以用不同的方式完成同样的事情。使用相同的文件来显示和处理表单,这样您就不必只从form.php到process.php再到form.php。

您可以通过检查$_POST isset()来检测是否应该处理提交的表单。

我不知道这对你来说是否有意义,但这样你就可以完全避免使用会话。

你可以做到这一点——根据你所说的,这应该是可行的。

请注意,$fields = array();行是完全多余的——您将其初始化为一个空数组,然后将其设置为完全不同的值。

当你做print_r($_SESSION)时,你会得到什么?