邮寄形式的数据顺序是否与网络表单中的相同?

时间:2010-04-02 09:32:14

标签: php http post

假设网络表格中有5个输入

<input name='the_same[]' value='different' />
<input name='the_same[]' value='different' />
<input name='the_same[]' value='different' />
<input name='the_same[]' value='different' />
<input name='the_same[]' value='different' />

当服务器端收到帖子数据时,我使用foreach接受数据,比如说

$the_same = new array();
foreach($_POST['the_same'] as $data)
    $the_same[] = $data;

服务器端保存的数据顺序是否与Web表单中的顺序相同?和跨浏览器,它可能是所有浏览器遵循的标准。

6 个答案:

答案 0 :(得分:7)

嗯,W3C recommentation on HTML forms确实说:

  

控件名称/值列在   它们出现在文档中的顺序。

不过,我认为让你的应用程序严格依赖于这个细节会有点冒险。

答案 1 :(得分:4)

当您在名称后添加[]时,PHP已经处理将POSTed / GETed变量转换为数组。这样做而不是自己弄错。

答案 2 :(得分:1)

更好的方法在html中执行:

<input name='the_same[]' value='different' />

然后在服务器中:

$the_same = new array();
foreach($_POST['the_same'] as $data) // or $_GET if you prefer
    $the_same[] = $data;

这样就不会覆盖任何变量。

答案 3 :(得分:1)

如果你想在订单中使用它,你可以使用动态变量或只是显式访问数组

the_same1 the_same2 the_same3

因为你知道这些名字,你可以轻松访问它们

$the_same = array();
for($i=1; ; $i++){
    $tmp =$_REQUEST["the_same".$i]
    if( empty($tmp) ){
            // no more stuff
            break;
    }
    $the_same[] = $tmp;
}

答案 4 :(得分:1)

如果您将输入的名称更改为the_same[] - $_REQUEST['the_same']将成为这些值的数组,首先按元素顺序排列(我相信所有当前的浏览器)。

如果需要,您还可以指定特定订单,甚至可以使用字符串键。例如,<input name='the_same[apple][2]'/>将成为$_REQUEST['the_same']['apple'][2]

在输入名称上不使用[],PHP只会看到 last 值。构建$_REQUEST / $_GET / $_POST数组时,其他值将被后一个值“覆盖”。

使用该功能的一个示例可能是使用复选框,因为HTML复选框仅在选中时提交值,您可能希望提交“未检查”值somtime:

<input type='hidden' name='check' value='not checked' />
<input type='checkbox' name='check' value='checked' />

答案 5 :(得分:0)

很可能是的,但你不应该假设这一点。这取决于您的浏览器如何发送输入,并且通常PHP不保证foreach循环以与添加元素相同的顺序迭代。

为您的输入提供相同的名称是一种不好的做法。

您可以在每个名称值之后追加一个索引(如果需要,也可以使用javascript),然后在PHP中阅读以确保订单得到维护。