发布一个表单,其中包含变量顺序,遵循 $_POST 和 $_FILES



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

<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

但我明白了,因为我有 2 个不同的 foreach:

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:当我单击添加按钮插入新输入时,input-1, input-2, input-3, input-4, ...会自动从mysql db中检索name,因此它们可以按不同的顺序排列,例如:输入-1,输入-3,输入-2,输入-4,...

假设文件将始终附带说明,并且描述将始终附带文件(您需要对此进行验证(。像这样的事情应该为你指明正确的方向:

<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>";
}
?>

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

$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 还包含其他变量,你可能需要做一些事情,比如使用正则表达式来过滤那些与你的模式匹配的名称,并且只在你的循环中使用这些匹配项。

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

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

在提交之前,我将使用:

$("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();

然后在索引中.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

相关内容

最新更新