【问题标题】:Parsing through form with unknown number of fields解析具有未知数量字段的表单
【发布时间】:2012-08-20 22:30:27
【问题描述】:

我正在开发一个邀请系统,用户可以在该系统中邀请一个或多个人担任其帐户的协调员。为了允许用户一次邀请多个人,我使用 mootools 在用户单击加号时创建另一行字段。在下面的示例中,我将只使用两行,但如果他们愿意,他们可以邀请更多。

HTML

<table>
    <thead>
        <tr>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Email Address</td>
            <td>Invites</td>
        </tr>
    </thead>
    <tbody id="coords">
        <tr id="row-1">
            <td id="1-1"><input type="text" name="fname-1"></td>
            <td id="1-2"><input type="text" name="lname-1"></td>
            <td id="1-3"><input type="text" name="email-1"></td>
            <td id="1-4"><input type="text" name="invites-1"></td>
            <td id="1-5"><span id="minus-1" class="minus">( - )</span></td>
        </tr>
        <tr id="row-2">
            <td id="2-1"><input type="text" name="fname-2"></td>
            <td id="2-2"><input type="text" name="lname-2"></td>
            <td id="2-3"><input type="text" name="email-2"></td>
            <td id="2-4"><input type="text" name="invites-2"></td>
            <td id="2-5"><span id="plus-2" class="plus">( + )</span></td>
        </tr>
    </tbody>
</table>

$_POST 看起来像这样

Array
(
    [fname-1] => David
    [lname-1] => Last
    [email-1] => email address
    [invites-1] => 15
    [fname-2] => Shirley
    [lname-2] => Last
    [email-2] => other email
    [invites-2] => 10
    [action] => invite
)

PHP解析是这样的

if (isset($_POST['action'])) {
    $_SESSION['inviteCoordinators'] = $_POST;
    $newCoordinators = array();


    //loop through all fields
    while(list($key,$value) = each($_SESSION['inviteCoordinators'])) {
        if($key != 'action') {
            list($field, $user) = explode("-",$key);
            $newCoordinators[$user] = array (
                $field => $value
            );
        }
    }
}

我期待 $newCoordinators 看起来像这样

Array
(
    [1] => Array
           (
               [fname] => David
               [lname] => Last
               [email] => email address
               [invites => 15
           )
    [2] => Array
           (
               [fname] => Shirley
               [lname] => Last
               [email] => other email
               [invites => 10
           )

但我得到的只是 [1][invites] => 15 和 [2][invites] => 10。我假设我只看到邀请,因为其他人正在被覆盖,但我可以不明白为什么会这样。我的解析有什么问题?或者,我应该怎么做?

附注,唯一必填字段是电子邮件地址。

【问题讨论】:

  • 您没有使用foreach 循环是否有原因?
  • 使用 name="fname[]", name="lname[]", name="email[]" 等这样它会创建你正在寻找的数组

标签: php forms post


【解决方案1】:

为什么不用数组来命名你的 html 表单元素呢?您可以使表单类似于:

<table>
    <thead>
        <tr>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Email Address</td>
            <td>Invites</td>
        </tr>
    </thead>
    <tbody id="coords">
        <tr id="row-1">
            <td id="1-1"><input type="text" name="invites[1][fname]"></td>
            <td id="1-2"><input type="text" name="invites[1][lname]"></td>
            <td id="1-3"><input type="text" name="invites[1][email]"></td>
            <td id="1-4"><input type="text" name="invites[1][invites]"></td>
            <td id="1-5"><span id="minus-1" class="minus">( - )</span></td>
        </tr>
        <tr id="row-2">
            <td id="1-1"><input type="text" name="invites[2][fname]"></td>
            <td id="1-2"><input type="text" name="invites[2][lname]"></td>
            <td id="1-3"><input type="text" name="invites[2][email]"></td>
            <td id="1-4"><input type="text" name="invites[2][invites]"></td>
            <td id="2-5"><span id="plus-2" class="plus">( + )</span></td>
        </tr>
    </tbody>
</table>

你会得到你的帖子数据已经格式化为:

Array
(
    [invites] => Array
        (
            [1] => Array
                (
                    [fname] => first1
                    [lname] => last1
                    [email] => test@test.com
                    [invites] => 2
                )

            [2] => Array
                (
                    [fname] => first2
                    [lname] => last2
                    [email] => test2@test.com
                    [invites] => 5
                )

        )

)

然后你可以这样做:

foreach($_POST['invites'] as $invite){
    //process invite
    echo "{$invite['fname']} {$invite['lname']} was invited. <br />";
}

【讨论】:

  • 您可以只使用 fname[] 而不是邀请[1][fname]。使动态添加字段更容易。
  • @Grumpy fname[] 不会产生相同的输出。此外,您必须假设fname[0] 对应于lname[0],这还不错,但是如果有任何名为checkbox[] 的复选框,则仅提交选中的复选框,因此您不能假设checkbox[0] 对应于 fname[0]checkbox[0] 将是第一个选中的复选框,它可能在 fname[1] 旁边。我只是更喜欢在编号时冗长以确保没有错误。
  • @Jonathan 总的来说,你是对的,但对于这种情况,name[] 更有用,如果单击加号,将显示另外 4 个输入字段。
  • @Grumpy,将输入字段重命名为对应于计数真的很难吗?我只是认为在我的示例中使用循环代码比执行以下操作更容易:for($i=0;$i&lt;count($_POST['fname']);$i++){echo "{$_POST['fname'][$i]} {$_POST['lname'][$i]} was invited &lt;br /&gt;";}
  • @Jonathan 首先加号按钮在 java 中处理,添加 name[] 更容易,无需跟踪计数器。在 php 中我会为每个使用,这将使 post 数组的读取更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多