我正在将值从表单传递到处理页面。还有更多的领域,但值得关注的是:
<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值。他们根本没有出现(但是姓名、地址等会出现)。
您是否无法以这种方式通过引用传递数组中的数组?
编辑
流程如下:
- form.php
- (所有值都会POST发送到处理页面)processing.php
- POST值经过验证,如果存在任何错误或问题,$_SESSION["字段"]=$_POST
- 重定向回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)
时,你会得到什么?