【问题标题】:compact all form-data with javascript使用 javascript 压缩所有表单数据
【发布时间】:2013-09-30 17:48:25
【问题描述】:

我想压缩包含超过 1000 个变量的巨大 HTML 表单中的所有数据,以规避 5.3.9 之前 PHP 版本中的 max_input_vars 限制。

如何使用 javascript 读取 HTML 表单中的所有数据,将其序列化(或创建 json),然后将其全部放在一个包含全部数据的隐藏字段中?

在接收端,我会使用 PHP 解压缩它(例如使用 json_decode

【问题讨论】:

  • 使用 jQuery 序列化表单。

标签: php


【解决方案1】:

刚刚发送了一个 ajax 帖子?

带有javascript的form.html

<form action="process.php" method="post" id="form">
  <input type="text" name="name">
  <input type="text" name="username">

  <button type="submit" id="sendForm">Send</button>
</form>

<!-- YOUR JAVASCRIPT -->
<script type="text/javacript">
  $('#sendForm').click(function() {

    $.ajax({
      type: 'POST',
      url: $('#form').attr('action'),
      data: $('#form').serialize(),
      success: function(data) {

        // WHATEVER YOU WANT HERE

      }
    });

    return false;
  });
</script>

process.php

<?php
    $name = $_POST['name'];
    // other form fields here
}

【讨论】:

  • 这将起作用,尽管用户将使用 ajax 解决方案留在发送页面上。如果你想在一个有很多页面的现有框架中构建一个修复程序,并且必须应用这个,my solution below 将更改表单并仅将序列化数据发送到原始目标页面。然后,您只需更改框架中的 Header-php-script 即可接收和反序列化数据。
【解决方案2】:

Serialize it using JQuery。然后你可以使用 PHP 来parse the URL string

【讨论】:

  • parse_url 无济于事,我猜你的意思是 parse_str。但这也无济于事,(见我上面的回答)
【解决方案3】:

也许 serialize 和 JSON.stringify 可以一起工作,虽然我没有尝试过。

【讨论】:

    【解决方案4】:

    我创建了一个脚本,可以自动在所有帖子表单上完成这项工作:

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script>
    // this disables all form elements and creates only one new element that contains all data serialized
    $('form[method="post"]').submit(function() {
        var num_form_elements=$(this).find('input, select, textarea').not('[type="submit"]').length;
        var num_elements_already_disabled=$(this).find('input:disabled, select:disabled, textarea:disabled').length;
        enabled=(num_form_elements-num_elements_already_disabled);
        if($('textarea[name="serialized_data"]', this).length > 0) {
            alert("Backbutton is not supported yet!");
            return false;
        }
        if($('textarea[name="serialized_data"]', this).length > 0 || enabled<=0) {
            alert("Reload of the form is not supported yet!");
            return false;
        }
        var data=$(this).serialize();
        $(this).find('input, select, textarea').not('[type="submit"]').attr("disabled", true);
        $(this).append('    <input type="hidden" name="num_form_elements" value="'+num_form_elements+'">'); 
        $(this).append('    <input type="hidden" name="num_elements_already_disabled" value="'+num_elements_already_disabled+'">'); 
        $(this).append('    <textarea style="display:true" name="serialized_data">'+(data)+'</textarea>');
        // maybe in the textarea I have to .replace(/</g,'&lt;') ?
    
    });
    </script>
    

    在接收端,你不能使用 PHP parse_str() 函数,因为 max_input_vars 指令也会影响这个函数,所以你需要别的东西:我从 https://gist.github.com/rubo77/6821632 拿走了 my_parse_str()

    <?php
        $params=my_parse_str($_REQUEST['serialized_data']);
    
        echo count($params,1)." serialized variables:<br>";
        var_export($params);
    ?>
    

    https://gist.github.com/rubo77/6815945 上的示例脚本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2021-09-29
      相关资源
      最近更新 更多