我如何PHP反序列化jQuery序列化表单?


160

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


2
对于此类问题,我建议使用Firebug查看以何种格式将哪些数据发送到服务器。然后,您可以轻松地发布数据示例。
chiborg 2010年

Answers:


65

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

serialize方法只接受表单元素,并将其放入字符串形式。"varname=val&var2=val2"


3
这是不正确的。您确实确实需要解析serialize返回的字符串。请参阅下面真正流行的答案。
艾萨克·卢博

392

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

"param1=someVal&param2=someOtherVal"

...大概是您所需要的:

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

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

有关更多信息,请参见以下内容:http : //www.php.net/manual/zh/function.parse-str.php

希望对您有所帮助。祝好运!


5
那是最好的方法。parse_str($ _ REQUEST ['jquery_serialized_values'],$ output); print_r($ output);
安迪

2
这种方法比其他方法好得多。
dartacus

3
作为给出接受答案的用户,我同意这是正确的答案。我给出的答案是基于这样的假设,即请求是通过jQuery ajax $ .get / post方法发送的(不确定我从哪里得到的),该方法的确将serialize()函数的输出作为标准GET变量发送。因此不需要字符串解析。例如:$ .get('ajax.php',$('form')。serialize(),function(){});
克里斯·古铁雷斯

1
这是一个也是唯一可以接受的答案!!剩下的答案就是
做不完的

1
这应该是答案。由于服务器可能不接受超过1000个输入值,因此我仍然需要一种发送它们的方法。因此,我对表格进行了序列化,并确实将数据作为一个值发送。有了这个答案,我得以做到。感谢@chrisallenlane
websupporter

51

// jQuery Post

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
 )

那正是我要寻找的!
Jepser Bernardino


10

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字段。


5

为什么不使用关联数组,那么您可以轻松使用它

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

    return $returndata;
}

问候


4
我不明白您的意思$i = 0;
Thielicious


5

只需这样做

$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']);

1

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

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

然后,您可以像在php中通常那样访问POST数组键。只需尝试print_r()

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

希望这可以帮助!


1

这是对user1256561的答复。感谢您的想法..但是我没有照顾到step3中提到的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);
}

网址发布数据输入将类似于:attribute1 = value1&attribute2 = value2&attribute3 = value3,依此类推

上面代码的输出仍将保留在数组中,您可以对其进行修改以将其分配给所需的任何变量,这取决于您希望如何进一步使用此数据。

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

1

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

形成

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

Java脚本

$(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;
}
?>


0

我认为您需要将表单名称与其值分开,执行此操作的一种方法是爆炸(&)以使您能够attribute=value,attribute2=value

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

这是您应该遵循的步骤,以更加具体。

  1. 传递到序列化jQuery到您使用的PHP页面(例如ajax.php$.ajax使用post或get进行提交。
  2. 从您的php页面开始,展开,(&)从而分隔每个属性。现在您将获得attribute1 = value,attribute2 = value,现在您将获得一个php数组变量。例如$data = array("attribute1=value","attribute2=value")
  3. 进行foreachon $dataexplodethe操作,(=)以便您可以将属性与值分开,并确保将urldecode 其与值分开,以便它将序列化的值转换为所需的值,并将属性及其值插入新的数组变量,存储属性和序列化字符串的值。

让我知道是否需要更多说明。


0

您可以使用此功能:

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' );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.