【问题标题】:How do I PHP-unserialize a jQuery-serialized form?如何 PHP 反序列化 jQuery 序列化的表单?
【发布时间】:2010-12-20 00:58:03
【问题描述】:

使用$('#form').serialize(),我能够将其发送到 PHP 页面。现在我如何在 PHP 中反序列化它?它是用jQuery序列化的。

【问题讨论】:

  • 对于此类问题,我建议使用 Firebug 来查看以什么格式发送到服务器的数据。然后,您可以轻松发布数据示例。

标签: php jquery serialization


【解决方案1】:

假设您的服务器正在接收一个看起来像这样的字符串(如果您使用的是 jQuery serialize(),它应该是这样的):

"param1=someVal&param2=someOtherVal"

...你可能只需要这样的东西:

$params = array();
parse_str($_GET, $params);

$params 应该是一个按照您的期望建模的数组。请注意,这也适用于 HTML 数组。

有关详细信息,请参阅以下内容: http://www.php.net/manual/en/function.parse-str.php

【讨论】:

  • 这是最好的方法。 parse_str($_REQUEST['jquery_serialized_values'], $output); print_r($output);
  • 这种方法比另一种方法好很多。
  • 作为给出接受答案的用户,我同意这是正确的答案。我给出的答案是假设请求是通过 jQuery ajax $.get/post 方法发送的(不确定我从哪里得到的),它确实将 serialize() 函数的输出作为标准 GET 变量发送。所以不需要字符串解析。例如:$.get('ajax.php', $('form').serialize(), function() {});
  • 这是唯一一个可以接受的答案!!其余的答案是过度的事情......
  • 这应该是答案。由于服务器可能不接受超过 1000 个输入值,因此无论如何我都需要一种发送它们的方法。所以我序列化了表单并将数据作为一个值发送。有了这个答案,我就可以做到了。谢谢@chrisallenlane
【解决方案2】:

您不必从 jquery serialize 方法中反序列化 PHP 中的任何内容。如果您对数据进行序列化,如果您使用的是 GET 方法 ajax 请求,则应将其作为查询参数发送到 PHP;如果您使用的是 POST ajax 请求,则应将其作为查询参数发送到 PHP。因此,在 PHP 中,您将根据请求类型访问 $_POST["varname"]$_GET["varname"] 之类的值。

serialize 方法只是获取表单元素并将它们放入字符串形式。 "varname=val&var2=val2"

【讨论】:

  • 这是不正确的。您确实需要解析 serialize 返回的字符串。请参阅下面真正流行的答案。
【解决方案3】:

// jQuery 帖子

var arraydata = $('.selector').serialize();

// jquery.post 序列化 var - TO - PHP 数组格式

parse_str($_POST[arraydata], $searcharray);
print_r($searcharray); // Only for print array

// 你得到任何相同的结果

 Array (
 [A] => 1
 [B] => 2
 [C] => 3
 [D] => 4
 [E] => 5
 [F] => 6
 [G] => 7
 [H] => 8
 )

【讨论】:

  • 这正是我要寻找的!
【解决方案4】:
parse_str($_POST['whatever'], $searcharray);

【讨论】:

    【解决方案5】:

    HTML页面中:

    <script>
    function insert_tag()
    {
        $.ajax({
            url: "aaa.php",
            type: "POST",
            data: {
                ssd: "yes",
                data: $("#form_insert").serialize()
            },
            dataType: "JSON",
            success: function (jsonStr) {
                $("#result1").html(jsonStr['back_message']);
            }
        });
    }
    </script>
    
    <form id="form_insert">
        <input type="text" name="f1" value="a"/>
        <input type="text" name="f2" value="b"/>
        <input type="text" name="f3" value="c"/>
        <input type="text" name="f4" value="d"/>
        <div onclick="insert_tag();"><b>OK</b></div>
        <div id="result1">...</div>
    </form>
    

    PHP 页面上:

    <?php
    if(isset($_POST['data']))
    {
        parse_str($_POST['data'], $searcharray);
        $data = array(
            "back_message"   => $searcharray['f1']
        );
        echo json_encode($data);
    }
    ?>
    

    在这个 php 代码上,返回 f1 字段。

    【讨论】:

      【解决方案6】:

      只需这样做

      $get = explode('&', $_POST['seri']); // explode with and
      
      foreach ($get as $key => $value) {
          $need[substr($value, 0 , strpos($value, '='))] =  substr(
              $value, 
              strpos( $value, '=' ) + 1 
          );
      }
      
      // access your query param name=ddd&email=aaaaa&username=wwwww&password=wwww&password=eeee
      var_dump($need['name']);
      

      【讨论】:

        【解决方案7】:

        为什么不用关联数组,这样你就可以轻松使用了

        function unserializeForm($str) {
            $returndata = array();
            $strArray = explode("&", $str);
            $i = 0;
            foreach ($strArray as $item) {
                $array = explode("=", $item);
                $returndata[$array[0]] = $array[1];
            }
        
            return $returndata;
        }
        

        问候

        【讨论】:

        • 我没有收到你的$i = 0;
        【解决方案8】:

        修改Murtaza Hussain答案:

        function unserializeForm($str) {
            $strArray = explode("&", $str);
            foreach($strArray as $item) {
                $array = explode("=", $item);
                $returndata[] = $array;
            }
            return $returndata;
        }
        

        【讨论】:

          【解决方案9】:

          用途:

          $( '#form' ).serializeArray();
          

          php 获取数组,不需要反序列化 ;)

          【讨论】:

          • formData = $( '#form' ).serializeArray();确保每个输入都有一个 name="inputname";然后,您可以将 formData 作为类型 post 传递给 ajax,并将值检索为 $_POST['inputname'];
          【解决方案10】:

          我不知道您使用的是哪个版本的 Jquery,但这在 jquery 1.3 中适用于我:

          $.ajax({
              type: 'POST', 
              url: your url,
              data: $('#'+form_id).serialize(), 
              success: function(data) {
                  $('#debug').html(data);
            }
          });
          

          然后您可以像在 php.ini 中一样访问 POST 数组键。 试试print_r()

          我认为您将序列化的表单值包装在对象的属性中,据我所知,这是无用的。

          希望这会有所帮助!

          【讨论】:

            【解决方案11】:

            这是对 user1256561 的回复。感谢您的想法.. 但是我没有处理步骤 3 中提到的 url 解码内容。

            如果其他人需要,这里是解码序列化表单数据的 php 代码。顺便说一句,请自行决定使用此代码。

            function xyz($strfromAjaxPOST)
            {
                $array = "";
                $returndata = "";
                $strArray = explode("&", $strfromPOST);
                $i = 0;
                foreach ($strArray as $str)
                {
                    $array = explode("=", $str);
                    $returndata[$i] = $array[0];
                    $i = $i + 1;
                    $returndata[$i] = $array[1];
                    $i = $i + 1;
                }
                print_r($returndata);
            }
            

            url post 数据输入会像:attribute1=value1&attribute2=value2&attribute3=value3 等等

            上述代码的输出仍将在一个数组中,您可以对其进行修改以将其分配给您想要的任何变量,这取决于您希望如何进一步使用这些数据。

            Array
            (
                [0] => attribute1
                [1] => value1
                [2] => attribute2
                [3] => value2
                [4] => attribute3
                [5] => value3
            )
            

            【讨论】:

              【解决方案12】:

              您只需要表单中的值属性名称。示例:

              表格

              <form id="login_form">
                  <input type="text" name="username" id="a"/>
                  <input type="password" name="password" id="b"/>
                  <button type="button" onclick="login()">Submit</button>
              </form>
              

              Javascript

              $(document).ready(function(){});
              function login(){
                var obj = $('#login_form').serialize();
                $.post('index.php', obj, function(res){
                  alert(res);
                })
              }
              

              PHP - index.php

              <?php
              if(!empty($POST['username']) && !empty($POST['password'])){
                $user = $POST['username'];
                $pass = $POST['password'];
                $res = "Username : ".$user." || Password : ".$pass;
                return $res;
              }
              ?>
              

              【讨论】:

                【解决方案13】:

                我认为您需要将表单名称与其值分开,一种方法是分解(&amp;),这样您将得到attribute=value,attribute2=value

                我的意思是,您将在 PHP 中将序列化的 jQuery 字符串转换为数组。

                以下是您应该遵循的更具体的步骤。

                1. 将序列化的jQuery 传递给PHP 页面(例如ajax.php) 您使用 $.ajax 使用 post 或 get 提交的地方。
                2. 从您的 php 页面中,分解(&amp;),从而将每个 属性。现在你会得到attribute1=value,attribute2=value,现在 你会得到一个 php 数组变量。例如$data = array("attribute1=value","attribute2=value")
                3. $dataexplode (=) 上执行foreach,这样你就可以 将属性与值分开,一定要urldecode 值,以便它将序列化值转换为值 您需要的,并将属性及其值插入到新数组中 变量,存储序列化的属性和值 字符串。

                如果您需要更多说明,请告诉我。

                【讨论】:

                  【解决方案14】:

                  你可以使用这个功能:

                  function post_unserialize( $key ){
                    $post_data = array();
                    $post_data = $_POST[ $key ];
                    unset($_POST[ $key ]);
                    parse_str($post_data, $post_data);
                    $_POST = array_merge($_POST, $post_data);
                  }
                  

                  如何使用

                  $_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
                  post_unserialize( 'serialized_data' );
                  

                  【讨论】:

                    【解决方案15】:

                    我有一个更好的功能。 因为如果编码的字符串包含从像 'name="temp_name[]"' 这样的输入中获得的数组值,那么上面的函数就不起作用了。

                    对于这种类型的数据反序列化,使用下面的函数。

                    function unserializeForm($str) {
                    $returndata = array();
                    $strArray = explode("&", $str);
                    $i = 0;
                    foreach ($strArray as $item) {
                        $array = explode("=", $item);
                        
                        if (preg_match('/(%5B%5D)/', $array[0])) {
                              $array[0] = str_replace('%5B%5D','',$array[0]);
                              if(array_key_exists($array[0],$returndata)){
                                      $returndata[$array[0]][]=$array[1];
                              }else{
                                  $returndata[$array[0]] =array();
                                  $returndata[$array[0]][]=$array[1];
                              }
                        }else
                        {
                            $returndata[$array[0]] = $array[1];
                        }   
                    }
                    return $returndata;
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      在 JS 部分使用它 - 然后你会在你的 PHP 中正确地得到它。
                      投票最多的答案会让你遇到麻烦
                      任何字符串都会有 & 符号。

                      // this = the form  
                      const arr = $(this).serializeArray();
                      const data = arr.reduce((acc, {name, value}) => ({...acc, [name]: value}),{}); 
                      

                      这将在运入时提供一个键/值数组
                      你 PHP 的 ajax 等等。

                      【讨论】:

                        猜你喜欢
                        • 2011-08-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-03-26
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-02-02
                        相关资源
                        最近更新 更多