使用 JavaScript 压缩所有表单数据


compact all form-data with javascript

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

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

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

刚刚发送了一个 ajax 帖子?

表单.html with JavaScript

<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>

过程.php

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

使用 JQuery 对其进行序列化。 然后,您可以使用 PHP 解析 URL 字符串。

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

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

<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 上的示例脚本