发送未知数量的Ajax数据

时间:2017-04-19 21:07:46

标签: php ajax

我已经让Ajax处理简单的表单,但是当我尝试在循环中生成多个表单元素时,我无法解压缩所有数据并使用它来更新我的数据库。根据我的代码,任何人都有关于如何实现这一目标的任何意见?基本上,每个订单项都有可能更新其价格。当用户单击提交按钮时,它会调用Ajax函数,该函数应将所有表单数据传递给price-update.php。在那里,它解压每个$ _POST并相应地更新数据库。

注意:此代码减少了视觉效果。使用了一些变量,但没有给出初始化方法。

注意:使用print_r($ _ POST)我得到以下内容:

提交=提交+变更&安培;价格%5B%5D%3B +%3F> = 5612和ID%5B%5D = 6&安培,P大米%5B%5D%3B +%3F> = 2 5和ID%图5B%5D = 5&安培;价格%5 B%5D%3B +%3F> = 52和ID%5 B%5D = 3及价格%5B%5D%3 B +%3F> =&安培; ID%5B% 5D = 2和,p大米%5B%5D%3B +%3F> =&安培; ID%5B%5D = 8

<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
$(function () {

    $('form').on('submit', function (e) {

        e.preventDefault();

        $.ajax({
            type: 'post',
            url: '/price-update.php',
            data: $('form').serialize(),
            success: function () {
                alert('Data was submitted');
            }
        });
    });
});
</script>

//Multiple form elements generated depending on how many prices exist in database
<form>
    <input name="submit" type="submit" value="Submit Changes" />
    <table>
        <tbody> 
        <?php 
        $n = 0;
        for ($z = 0; $z < count($names); $z++) { ?>
            <tr id = "row-<?php echo $z; ?>">
                <td><input type="number" name ="price[]; ?>" class="price-update" value="" min="1" max="999999999" /></td>
                <td><input type="hidden" name="id[]" class="price-id" value="<?php echo $id_array[$n]; ?>" /></td>
                <?php $n++;?>
            </tr>
        <?php
        }?>
        </tbody>
    </table>
</form>

//price-update.php

<?php

    if($_POST) {

        //Uses SSL connection with mysqli
        require_once('connection.php');

        $IDs = array();
        $Prices = array();

        foreach($_POST as $key => $value) {
            if (strstr($key, 'id'))
            {
                $IDs[] = $value;
            }
            if (strstr($key, 'price'))
            {
                $Prices[] = $value;
            }
        }

        for($i = 0; $i < count($IDs); $i++) {
            $price_update = "UPDATE prices SET price='".$Prices[$i]."' WHERE id='".$IDs[$i]."'";
            $send_update = $instance->query($price_update);
        }

    }

?>

3 个答案:

答案 0 :(得分:1)

序列化数据使其成为一个字符串(即实际发送的内容)。为了发送包含内容类型&#39; form-data / multipart&#39;的表单,您必须传递FormData并设置data属性的对象:

$.ajax({
    type: 'post',
    url: '/price-update.php',
    data: new FormData($('form')[0]),
    success: function () {
        alert('Data was submitted');
    }
});

由于jQuery的ajax()方法默认为application/x-www-form-urlencoded,因此无需指定内容类型。

答案 1 :(得分:0)

遵循Dygnus的回答 - 如果你仍想保持数据序列化,那么你可以做这样的事情来实现你的目标:

$query_arr = array(); $parsed_post = parse_str($_POST['data'], $query_arr);

然后使用$ parsed_post循环遍历foreach循环。

答案 2 :(得分:0)

我相信主要问题在于你的HTML:

<td><input type="number" name ="price[]; ?>" 
class="price-update" value="" min="1" max="999999999" /></td> 

在上面我们可以说名称设置为name="price[]; ?"

您想要的是将name="price[] ;?>"更改为name="price[]"

  

注1查看准备好的语句/ sql注入

     

注意2查看sql事务

相关问题