【问题标题】:jQuery .serialize() for post?用于发布的 jQuery .serialize()?
【发布时间】:2023-03-16 18:49:01
【问题描述】:

我正在通过包含表单变量的帖子进行 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 字符串的内容。虽然我可以在服务器端爆炸,但我不想这样做。
  • 您的额外变量是通过 js 计算出来的还是随页面提供的?
  • 与页面(是的,我知道我总是可以将它们设置为隐藏输入,但是表单是通过 ajax 生成的,并且视情况而定)

标签: javascript jquery forms post


【解决方案1】:

您可以使用 serializeArrayJSON.stringify 将表单数据编码为 JSON。

serializeArray 给你一个像这样的数组:

[
  {
    name: a
    value: 1
  },
  {
    name: b
    value: 2
  }
]

因此您将能够使用$data['fieldname'] 访问服务器端的数据。要将数组转换为对象(以便您可以随意访问数据),请查看 Convert form data to JavaScript object with jQuery

当然你也可以只使用你自己的函数(如果你修复错误似乎会做类似的事情),但你仍然必须使用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;
    }
}    

但这假设您没有像field field[] 这样的字段名称。

【讨论】:

  • 干杯,再次略有不同:function postArray(form){ var data = {}; form = $(form).serializeArray(); for(var i in form) data[form[i].name] = form[i].value; return data; } 我想如果可以的话,为什么不使用 jQuerys 内置函数呢?随意用这个更新你的答案,我会删除评论
  • hmm,效果很好,除了,如果我在控制台中输入这个:$('[name=keywords[]]').val();,输出是$('["what", "another"],这很好,但是当我在服务器上打印结果时,我得到[type] => email [keywords[] => another作为 pre 的输出我该如何修复它?
  • 希望得到[type] = email [keywords] => array( what, another) 或类似的东西
【解决方案2】:
    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>

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多