在PHP中发送包含大量值的表单

时间:2012-08-21 14:23:37

标签: php forms

我正在开发一种形式,人们可以通过托盘系统订购餐饮服务(通过尝试大小,中型和大型订购食品),我无法弄清楚如何做到这一点。我的第一个想法是像这样编码:

<form id="tray" name="tray" method="post" action="send_mail_tray.php" onsubmit='return packageValidator()'>
<table>
    <tr>
        <td>Pork Fried Rice</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="PorkFriedRiceMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="PorkFriedRiceLg" style="width: 20px; height: 15px" />
        </td>
        <td>Vegetable Spring Rolls</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="VegetableSpringRollsMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="VegetableSpringRollsLg" style="width: 20px; height: 15px" />
        </td>
        <td>Beef w/ Broccoli</td>
        <td>
            Med.:<br />
            Lg. :
        </td>
        <td>
            <input type="text" name="Beefw/BroccoliMed" style="width: 20px; height: 15px" /><br />
            <input type="text" name="Beefw/BroccoliLg" style="width: 20px; height: 15px" />
        </td>
    </tr>
    <tr>
        <td>
            <input type="Submit" value="Submit" />
        </td>
    </tr>
</table>
</form>

使用这种方法,我必须能够发布变量名称和值。起初我认为这是最好的方法,然而,在考虑之后,提供的食物清单超过150,这意味着我必须创建超过300 $ _POSTs来获取整个菜单和电子邮件我将发送将必须包含列表中的所有项目,即使他们没有订购。是否有更简单的方法来制作我正在做的表格或者是我的第一种方法?

3 个答案:

答案 0 :(得分:3)

这些值是否来自数据库?如果没有,那么他们应该...或者至少你从某种数据结构中动态生成表单,例如

$menu = array(
   0 => array('name' => 'Vegetable Spring Rolls', 'sizes' => array('L', 'M', 'S')),
   1 => array('name' => 'foo', 'sizes' => array(...)),
   etc...
);

然后使用

构建表单
foreach($menu as $key => $item) {

    echo <<<EOL
<input type="text" name="item_{$key}" value="{$item['name']}" />

EOL;
}

请注意,我只是输出商品名称 - 而不是单个商品尺寸。这只是为了简化这个例子。

提交表单后,您可以再进行一次循环:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   foreach ($menu as $key => $item) {
      if (isset($_POST["item_{$key}"]) && !empty($_POST["item_{$key}"])) {
        .... item has non-zero quantity specified ...
      }
   }
}

简而言之,如果您正确构建表单,无论有多少字段都可以,您仍然可以使用非常少的代码开销自动处理它们。

答案 1 :(得分:0)

拥有这么多名字可能会让人感到痛苦。

使用PHP 5可以影响这样的名称

<input type="text" name="food[PorkFriedRice][med]"> ...
<input type="text" name="food[PorkFriedRice][lg]">

使用$ _POST获取它们时,您可以通过执行

来访问它们
foreach ($_POST['food'] AS $piece => $sizes)
{
    $medSize = $sizes['med'];
    $lgSize = $sizes['lg'];
    ...
}

提示: 要保存一些HTML大小,最好在输入中添加一个CSS类来设置样式:

#tray input { width:20px; height:15px }

答案 2 :(得分:0)

请注意,在帖子中发送所有这些数据也可能会导致查询字符串过长错误

另一个最佳解决方案也可以通过 ajax 来实现,因为如果列表太长,您可以在保存循环内向用户反馈进度条。

列表可以很容易地分成一些串,在Json中编码并在登陆页面中获取json数据。您可以通过示例,在$.each jQuery中使用max item变量。

使用jQuery $.getJson或普通$.ajax

可以轻松完成Ajax调用

如果您认为此解决方案可以提供帮助,我们可以添加更多信息,但网络已完整记录