使用$ _POST和$ _FILES发布包含变量顺序的表单

时间:2018-05-08 15:18:30

标签: php jquery

我想发布一个包含输入和文件的表单,并在目标页面中以相同的顺序检索中的,例如:

<form id="form" method="post" action="">
   Description file: <input type="text" name="input-1" value="description 1">
   <br>
   File: <input type="file" name="input-2">
   <br>
   <br>
   Others data: <input type="text" name="input-3" value="some others unique data">
   <br>
   Description file: <input type="text" name="input-4" value="description 2">
   <br>
   File: <input type="file" name="input-5">
   <br>
   Description file: <input type="text" name="input-6" value="description 3">
   <br>
   File: <input type="file" name="input-7">
   <br>
</form>


<?php

   $post = $_POST;
   $files = $_FILES;

   foreach ( $post as $i => $value ) {
     echo "Variables passed: " . $value . "<br>";
   }

   foreach ( $files as $i => $value ) {
     echo "File: " . $value['name'] . "<br>";
   }

?>

我喜欢输出:

Variables passed: description 1
File: file1.jpg
Variables passed: some others unique data
Variables passed: description 2
File: file2.jpg
Variables passed: description 3
File: file3.jpg

但我得到了这个,因为我有两个不同的预言:

Variables passed: description 1
Variables passed: some others unique data
Variables passed: description 2
Variables passed: description 3
File: file1.jpg
File: file2.jpg
File: file3.jpg

这只是一个简单的例子。我是一个动态表单,我可以使用按钮添加不同排序的输入字段。

有没有办法将相同的订单保留到目标网页?

更新:我已经编辑了我的原始帖子:在输入字段文本之后,它始终是一个文件输入。

更新2:当我单击添加按钮以插入新输入时,{mys}数据库中会自动检索name input-1, input-2, input-3, input-4, ...,因此它们的顺序可以不同,如:input-1,input- 3,输入-2,输入-4,......

3 个答案:

答案 0 :(得分:0)

假设文件始终伴随着描述,并且描述将始终伴随着文件(您需要对此进行验证)。这样的事情应该指向正确的方向:

<form id="form" method="post" action="">
    Description file: <input type="text" name="input-1" value="description 1">
    <br>
    File: <input type="file" name="file-2">
    <br>
    Description file: <input type="text" name="input-3" value="description 2">
    <br>
    File: <input type="file" name="file-4">
    <br>
    Description file: <input type="text" name="input-5" value="description 3">
    <br>
    File: <input type="file" name="file-6">
    <br>
</form>


<?php

   $post = $_POST;
   $files = $_FILES;

   foreach ( $post as $i => $value ) {
     echo "Description: " . $value . "<br>";
     echo "File: " . $files[$i]['name'] . "<br>";
   }

?>

答案 1 :(得分:0)

如果您事先知道这些字段将具有该格式的名称,那么您可以执行以下操作:

$len = sizeof($post);
for ($i = 0; $i<len;$i++)
{
  $item = $i + 1;
  echo "Description: ".$item.": ".$post["input-".$item]."<br>";
  echo "File: ".$item.": ". $files["file-".$item]."<br>";
}

当然,如果你的$ _POST还包含其他变量,你可能需要做一些事情,比如使用正则表达式来过滤那些与你的模式匹配的名字,并且只在你的循环中使用那些匹配。

正如其他人在评论中提到的那样,你应该始终牢记意外输入的可能性。

答案 2 :(得分:0)

好的,我终于找到了解决方案。

在提交之前,我会使用:

$("body").find(":input[name^='input-']").each(function (index, value) {

        var value = $(this).attr("name");

        $(form).append('<input type="hidden" name="varsOrder[]" value="' + value + '">');

});

form.submit();

然后在index.php中:

// RETRIEVE ONLY $_POST starting with input-

foreach($_POST as $key => $value) {

    if (strpos($key, 'input-') === 0) {

        $idVars = ltrim($key, "input-");

        $vars[$idVars] = $value;

    }
}

// RETRIEVE ONLY $_FILES starting with input-

foreach($_FILES as $input => $array) {

    if (strpos($input, 'input-') === 0) {

        $idVars= ltrim($input, "input-");

        // PROCESS FILE
        ...

        $vars[$idVars] = $array['name'];

    }
}


//  FINAL REORDER

$orderedVars = $vars;

$order = isset($_POST['vars']) ? $_POST['vars'] : array();

if ( count($order ) ) {

    $orderedVars = array();

    foreach ( $order as $index => $nameVar) {

        $idVar = ltrim($nameVar, "input-");

        if ( array_key_exists($idVar, $vars) ) {

            $orderedVars[] = $vars[$idVar];

        }

    }

}

// $orderedVars AT THIS POINT IS AN ARRAY OF ORDERED INPUTS LIKE ORIGINAL FORM