多个表单,多个提交按钮,1个使用ajax的处理表单

时间:2014-04-19 10:36:14

标签: javascript php jquery ajax forms

在我的页面上,我总共有18个表单,这些表单是从数据库生成的,每个表单都是一个类别,允许用户更新任何类别的价格。所有表单具有相同的ID,我假设然后我将能够通过单击处理所有表单,但是如果单击提交按钮1它将只更新表单1,任何其他按钮只是重新加载页面,是否有这样做的方法是给每个表单一个数字id,然后在我的提交函数上使用一个大量的if语句?

我的表格代码:

<?php

$shopid = $_GET['user'];

$db = new PDO('mysql:host=localhost;dbname=servershop', 'user', '****');
$stmt = $db->prepare("SELECT DISTINCT group_ID FROM `items` Order By group_id");
$stmt->execute();
$gpID = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($gpID as $igroup)
{
    $groupID = $igroup['group_ID'];

    $db = new PDO('mysql:host=localhost;dbname=servershop', 'shop', '1butter22');
    $stmt = $db->prepare("SELECT name FROM groups WHERE id = '$groupID'");
    $stmt->execute();
    $groupname = $stmt->fetchColumn();
    ?>
    <details>
    <summary><?php echo $groupname;?></summary>
    <div class="ccontainer">
    <div class="ccontent">
    <form id="savechanges">
    <input type="hidden" value="prices" id="tag" name="tag">
    <input type="hidden" value="<?php echo $shopid;?>" id="shopid" name="shopid">
    <input type="submit" value="Save" id="submit">

    <?php 


        $stmt = $db->prepare("SELECT * FROM `items` WHERE group_id = '$groupID'");
        $stmt->execute();
        $arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo '<table class="itemTable">';
        echo '<tr><td>Name & Quantity</td><td>Image</td><td>Price</td></tr>';
        foreach ($arr as $item)
        {

            echo '<tr><td>' . $item['name'] . '('. $item['quantity'] .')</td>';
            echo '<td><img src="images/items/' . $item['image'] . '" /></td>';
            echo '<input type="hidden" value=' . $item['id'] .' name="itemid[]">';


                $stmt = $db->prepare("SELECT price FROM prices WHERE shop_id = :shop AND item_id = :item");
                $stmt->bindParam(':shop', $shopid);
                $stmt->bindParam(':item', $item['id']);
                $stmt->execute();
                $barr = $stmt->fetchColumn();
                if(!empty($barr))
                    {
                        echo '<td><input type="text" name="price[]"  value="'. $barr .'" /></td></tr>';
                    }
                else
                    {
                        echo '<td><input type="text" name="price[]" value="0.0" /></td></tr>';
                    }
        }


    ?>
</table>
</form>
</summary>
</details>
<?php } ?>

和我的处理代码:(取自更大的脚本)

 document.getElementById('savechanges').onsubmit=function (e)
            {
                e.preventDefault();
                var f = $("#savechanges");
                request = $.ajax(
                    {
                        url: "processing/db.php",
                        type: "POST",
                        data: f.serialize(),
                        cache: false
                    }
                                );

编辑:

在接受的答案中使用这个想法,诀窍就是创建一个表单并将所有输入序列化为表单类,理论上,这应该可以使用id以及类,处理的执行时间所有120个奇数项目从平均60分钟上升到105毫秒,这不是一个不可接受的增长!

2 个答案:

答案 0 :(得分:0)

id属性是唯一的。尝试为所有表单而不是id提供一个公共类,然后使用公共类提交序列化所有这些表单。

如果您在包含多个表单的页面上运行$('form').serialize(),它会将所有表单正确序列化为一个字符串。

要包含具有某些特定类的表单,请使用$('.myforms').serialize();

答案 1 :(得分:0)

我可以给你一个想法。 只需将每个元素中的表单id设置为数据属性即可。  喜欢

<input name='test' data-formId='yourformId' class='changed' />

并且在类别更改时,将一个类添加到已更改的名称(如上所述)。

现在,在发布数据时,获取所有表单ID并使用jquery从更改了类的元素更改值。现在,您可以使用您想要的数据。

使用此功能,您只能从已更改数据的表单中选择数据。

如果这有助于你不要忘记接受答案。