当你不知道你需要提前获取什么时,从$ _POST中获取数据

时间:2011-02-22 05:17:49

标签: php optimization forms post

这将通过一个例子来理解:

你有一个配方网站,可追踪3个数据点:

  • 食谱名称(沙拉,杂烩等)
  • 成分(番茄,土豆,猪肉等)
  • 成分量(仅限整数,以保持我们的示例简单)

Recipe Editor的第一页上,我们有一张表格列出了所需的成分。

Recipe: salad
  REQUIRES
    __ tomato
    __ lettuce
    __ cheese
    __ schweddy balls

在第二页上,我们列出了所有必需成分和输入框,以输入所需的数量:

Recipe: salad
Ingredient    Volume
 tomato         2
 lettuce        1
 cheese         1

(做作,我知道,但请忍受我)

现在第二个表单的成分列表和<input ... />框是根据选择进行编辑的配方从数据库动态生成的。

每种成分都有一个数字ID,因此您的音量输入将如下所示:

<input type="text" name="17" value="" /> // how many tomatoes?

一旦你SUBMIT,你需要处理$_POST数组并上传所有的成分和数量 - 但是你(或者至少我)事先并不知道将会是什么$_POST数组,因为每个食谱都需要不同的成分== $_POST[???]

我想到的超级kludge是将所有成分ID放入逗号分隔的字符串中,将其粘贴到隐藏的输入字段中,并在处理过程中将其爆炸并将其用作$ _POST键来提取值。这当然有效,但它让我觉得内心都很脏。

如果您事先不知道密钥,是否有更好的方法可以从$ _POST中获取输入值?

4 个答案:

答案 0 :(得分:2)

最简单的方法是使用foreach,因为$ _POST就像任何其他数组一样:

foreach($_POST as $key => $value)
{
    switch($key)
    {
        case 17:
        // ...
    }
}

您还可以使用isset()检查是否存在特定键:

if(isset($_POST['17'])) {
    // ...
}

并且为了记录:逗号分隔的输入字段没有任何问题。最好的解决方案是有效的解决方案。 :)

答案 1 :(得分:2)

这不是一个不常见的问题,对于收件人而言,这种方法看起来似乎有道理。但是,如果您能够调整表单生成逻辑,还有另一种方法:

<input type="number" name="volume[tomatos]" value="">

或继续使用name="volume[17]"或类似内容的ID。

无论如何,我认为使用AJAX / DHTML也很容易生成,并且PHP可以更好地处理像$_GET["volume"][...]这样的输入数组 - 在某些情况下,它也比接收不确定的ID列表更可靠。 (你当然仍需要foreach。)

答案 2 :(得分:0)

foreach ($_POST as $key => $value){
    echo "This recipe includes $value of ingredient $key."
}

要获取成分ID列表,请从$ _POST数组中提取它:

$ingredientIDs = array_keys($_POST);

答案 3 :(得分:0)

<input type="text" name="17" value="" />

假设您的表单方法是POST ...

foreach($_POST as $key => $value){
    echo "We need $value of item $key";
}

应该让你朝着正确的方向前进。