首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析包含未知字段数的表单

解析包含未知字段数的表单
EN

Stack Overflow用户
提问于 2012-08-21 06:30:28
回答 1查看 2.2K关注 0票数 4

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

HTML

代码语言:javascript
复制
<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看起来像这样

代码语言:javascript
复制
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解析是这样的

代码语言:javascript
复制
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会是这样的

代码语言:javascript
复制
Array
(
    [1] => Array
           (
               [fname] => David
               [lname] => Last
               [email] => email address
               [invites => 15
           )
    [2] => Array
           (
               [fname] => Shirley
               [lname] => Last
               [email] => other email
               [invites => 10
           )

但我得到的只是1个=> 15和2个=> 10,我想我只是看到了邀请函,因为其他的都被覆盖了,但我不明白为什么会这样。我的解析出了什么问题?或者,我应该怎么做?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-21 06:46:57

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

代码语言:javascript
复制
<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>

您将获得已经格式化的帖子数据:

代码语言:javascript
复制
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
                )

        )

)

然后你可以像这样做:

代码语言:javascript
复制
foreach($_POST['invites'] as $invite){
    //process invite
    echo "{$invite['fname']} {$invite['lname']} was invited. <br />";
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12046124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档