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

时间:2012-01-18 20:48:28

标签: php arrays

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

<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数组中的plans数组时,值正在正确提交并存在。

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

$_SESSION['fields'] = $_POST;

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

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

打印$ fields变量时,所有原始帖子值都会显示在原始数组之外(复选框)。它们根本不显示(但是名称,地址等)。

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

修改

流程是这样的:

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

3 个答案:

答案 0 :(得分:1)

这里似乎还有其他错误。请查看以下内容:

的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()来处理提交的表单。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你可以这样做 - 从你所说的,这应该有效。

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

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