我如何PHP-unserialize jQuery序列化表单?

时间:2009-11-24 20:08:19

标签: php jquery serialization

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

14 个答案:

答案 0 :(得分:360)

前提是您的服务器正在接收类似于此字符串的字符串(如果您使用的是jQuery serialize(),则应该这样做):

"param1=someVal&param2=someOtherVal"

...这样的事情可能就是你所需要的:

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

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

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

希望这有帮助。祝你好运!

答案 1 :(得分:65)

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

serialize方法只接受表单元素并将它们以字符串形式放置。 "varname=val&var2=val2"

答案 2 :(得分:44)

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

答案 3 :(得分:16)

parse_str($_POST['whatever'], $searcharray);

答案 4 :(得分:7)

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 :(得分:4)

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

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

    return $returndata;
}

此致

答案 6 :(得分:4)

修改后的Murtaza Hussain回答:

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

答案 7 :(得分:4)

只需这样做

viewConfig: {
    getRowClass: function(record, rowIndex, rowParams, store) {
        var isConditionMatching = ....

        if(isConditionMatching ){
            return 'custom-row';
        }
    },

答案 8 :(得分: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()

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

希望这有帮助!

答案 9 :(得分:1)

这是对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);
}

网址发布数据输入如下:attribute1 = value1&amp; attribute2 = value2&amp; attribute3 = value3等等

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

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

答案 10 :(得分: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>

的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;
}
?>

答案 11 :(得分:0)

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

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

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

  1. 在序列化的jQuery上传递到PHP页面(例如ajax.php) 使用$.ajax使用post或get。
  2. 进行提交的位置
  3. 在您的php页面中,展开(&),从而将每个分开 属性。现在,您将获得attribute1 = value,attribute2 = value 你会得到一个php数组变量。 e.g $data = array("attribute1=value","attribute2=value")
  4. foreach$data explode(=)进行操作,以便您可以 将属性与值分开,并确保urldecode 该值,以便它将序列化值转换为该值 您需要的,并将属性及其值插入新数组 变量,存储属性和序列化的值 字符串。
  5. 如果您需要更多说明,请告诉我。

答案 12 :(得分:0)

使用:

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

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

答案 13 :(得分: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' );