【问题标题】:grabbing data from $_POST when you don't know what you need to grab in advance当您不知道需要提前抓取什么时,从 $_POST 抓取数据
【发布时间】:2011-02-22 13:30:14
【问题描述】:

举个例子就明白了:

你有一个食谱网站,它跟踪 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[???]

我想到的超级组合是将所有成分 ID 放入逗号分隔的字符串中,将其粘贴到隐藏的输入字段中,然后在处理过程中将其分解并用作 $_POST 键以提取值。这当然行得通,但它让我觉得里面很脏。

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

【问题讨论】:

    标签: php optimization forms post


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      这不是一个不常见的问题,而且对于接收者来说,这种方法看起来是合理的。但是,如果您能够调整表单生成逻辑,还有另一种方法:

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

      或者继续使用带有name="volume[17]" 或类似名称的 ID。

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

      【讨论】:

      • 有趣。我知道使用数组作为带有复选框的名称,但不知道您可以使用任何旧输入来执行此操作,或者您可以在 HTML 中定义数组键。这是一个绝妙的技巧!
      【解决方案3】:
      <input type="text" name="17" value="" />
      

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

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

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

      【讨论】:

        【解决方案4】:
        foreach ($_POST as $key => $value){
            echo "This recipe includes $value of ingredient $key."
        }
        

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

        $ingredientIDs = array_keys($_POST);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-17
          • 2013-02-22
          • 1970-01-01
          • 2017-09-04
          • 2016-12-06
          相关资源
          最近更新 更多