jQuery .serialize()用于post请求吗?

4

我是通过POST方法发送包含表单变量的Ajax请求。

Ajax请求的数据如下:

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     FORMDATA
}

正如您所看到的,除了基本表单数据之外,我还传递了一些其他数据。

这意味着我无法使用jQuery的.serialize()方法。

我希望最终得到的是可以发送的东西,因此在另一侧只需执行:

$_POST['form']['fieldname']

是否有内置函数可做到这一点?

或者我需要做什么才能创建一个这样的函数?

在表单上运行类似于以下功能的函数的可能性:

function postArray(form){
  var data = {};
  var name, value = null;
  $(form).children('textarea, input, select'){
    name = this.name;
    data.name = $(this).val();
  }
  return data;
}

在表单上可以工作。

并且拥有

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     postArray(form)
}

我可以使用 .serializeArray(); 这个方法,但是在另一方面我得到了以下内容:


这样做是否可行?

Array
(
  [0] => Array
    (
      [name] => name1
      [value] => val1
    ),
  [1] => Array
    (
      [name] => name2
      [value] => val2
    )
  ...
  [8] => Array
    (
      [name] => name8
      [value] => val8
    )
)

这个答案很接近,但是需要我执行以下操作:
a: 循环数组并将其转换为所需格式
b: 每次使用时都要循环查找正确的键


因为当执行print_r($_POST['form'])时,我得到的似乎是应该是一个get字符串的东西。虽然我可以在服务器端将其分解,但我宁愿不这样做。 - Hailwood
你的额外变量是通过JS计算还是与页面一起提供的? - Emmett
返回已经包含在页面中(是的,我知道我可以将它们设置为隐藏输入,但是表单是通过ajax生成的,并且根据情况而异)的内容。 - Hailwood
2个回答

2
您可以使用 serializeArrayJSON.stringify 将表单数据编码为 JSON 格式。 serializeArray 会返回以下类似的数组:
[
  {
    name: a
    value: 1
  },
  {
    name: b
    value: 2
  }
]

因此,您将无法使用$data['fieldname']访问服务器端的数据。要将数组转换为对象(以便您可以像想要的那样访问数据),请查看使用jQuery将表单数据转换为JavaScript对象

当然,您也可以使用自己的函数(如果修复错误,则似乎执行类似操作),但仍然必须使用JSON.stringify

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     JSON.stringify(postArray(form))
}

在您的PHP脚本中,您可以使用json_decode来获取表单数据:

$form_data = json_decode($_POST['form']);

‡ 这是一个修正版(更新自您的评论,请勿使用 for...in 循环遍历数组):

function postArray(form){ 
    var data = {}; 
    form = $(form).serializeArray(); 
    for(var i = form.length; i--; ) {
        data[form[i].name] = form[i].value;
    }
    return data; 
}

如果您想为名称中带有[]的元素进行修复,您需要手动处理这些元素并将它们放入一个数组中:

for(var i = form.length; i--; )
    var name = form[i].name;
    var value = form[i].value;
    var index = name.indexOf(`[]`);
    if( index > -1) {
        name = name.substring(0,index);
        if(!(name in data) {
            data[name] = [];
        }
        data[name].push(value);
    }
    else {
        data[name] = value;
    }
}    

但这假设您的字段名称不像fieldfield[]这样。

干杯,再来一点变化:function postArray(form){ var data = {}; form = $(form).serializeArray(); for(var i in form) data[form[i].name] = form[i].value; return data; }如果我们可以使用jQuery内置函数,为什么不使用呢?随意更新您的答案,我会删除评论。 - Hailwood
嗯,除了这个问题,代码运行得很好。如果我在控制台中输入:$('[name=keywords[]]').val();输出是$('["what", "another"],这很好,但是当我在服务器上打印结果时,得到的输出却是[type] => email [keywords[] => another。我该如何修复这个问题? - Hailwood
寻求类似于[type] = email [keywords] => array( what, another)的东西。 - Hailwood

0
    Try This:
        <?php 
        /*
         * As a Class File your-class-file.php
         * Decode jQuery Serialize Post String For PHP
         */
         class PHP_Serialize {
         function Decode_Serialize($QUERY_STRING) {
                  /*
                   * Decode form.serelize() jQuery Post String
                   * Return like $_POST['Form_Input_Name or ID']
                   */
                  $a = explode('&', $QUERY_STRING);
                  $i = 0;
                  $store = array();
                  while ($i < count($a)) {
                      $b = explode('=', $a[$i]);
                      $array_name = htmlspecialchars(urldecode($b[0]));
                      $array_value = htmlspecialchars(urldecode($b[1]));
                      $store[$array_name] = $array_value;
                      $i++;
                  }
                   /*
                    * Convert Array as an Object
                    * return(object)$store; 
                    * Use ........Object->Form_Input_Name or ID
                    * or
                    * Use as An Array .........$var["Form_Input_Name or ID"]
                    */
                  return $store;
              }
         }
        ?>
        <?php 
        /*
         * How to USE:
         * In Your PHP File (your-file.php)
         * Include Class File like include('your-class-file.php');
         * $Decode = new PHP_Serialize();
         * Use Function Like This $_POST = $Decode->Decode_Serialize($_POST['Query_String']);
         */

        /*
         * Demo HERE
         * you-file.php
         */
        include('your-class-file.php');
        $Decode = new PHP_Serialize();
        $_POST = $Decode->Decode_Serialize($_POST['Query_String']);
        /* Decode jQuery Serlize String AS a PHP Function if you not making Class file */
        $_POST = Decode_Serialize($_POST['Query_String']);
        /* Use POST String in your mySQL Statement Like This*/
        mysql_query("SELECT * FROM Table WHERE COMPANY_NAME = '".$_POST['COMPANY_NAME']."'");


        /*
         * Here is Your form PHP File
         */

        ?>
        <form action="" method="post" id="your-form-id" name="your-form-id">
        <label for="COMPANY_NAME">Company Name:</label>
        <input type="text" name="COMPANY_NAME" id="COMPANY_NAME"/>
        <label for="COMPANY_EMAIL">Company Email:</label>
        <input type="text" name="COMPANY_EMAIL" id="COMPANY_EMAIL"/>
        <input type="button" name="submit" id="submit" value="submit"/>
        </form>


        <script>
        $(document).ready(function() {
            $('#submit').click(function(){

                var Post_String = $('#your-form-id').serialize();
                $.ajax({
                type    :   'POST',
                url     :   'your-file.php',
                data    :   {Query_String:Post_String},
                success :   function(return_value){/* On Success you jQuery Code Here*/}
                });

            });

        });
        </script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接