如何对 jQuery 序列化的表单进行 PHP 反序列化?

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

231008 次浏览

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

serialize方法只接受表单元素并将它们放在字符串形式中

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

假设您的服务器正在接收一个类似于下面这样的字符串(如果您使用的是 jQuery serialize(),它应该是这样的) :

"param1=someVal&param2=someOtherVal"

... 这样的东西可能就是你所需要的:

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

然后,$params应该是一个如您所期望的那样建模的数组。

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

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

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

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

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

希望这个能帮上忙!

我认为您需要将表单名称从它的值中分离出来,做到这一点的一个方法是爆破 (&),这样您将得到 attribute=value,attribute2=value

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

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

  1. 将序列化的 jQuery传递给 PHP页(例如 ajax.php) 使用 $.ajax通过 post 或 get 提交。
  2. 从你的 php 页面,爆炸的 (&)从而分离每个 现在您将得到 Attribute1 = value,Attribute2 = value,Now 您将得到一个 php 数组变量 Array (“ Attribute1 = value”,“ Attribute2 = value”)
  3. $dataexplode(=)上做一个 foreach,这样你就可以 将属性从值中分离出来,并确保使用 urldecode 值,以便它将序列化的值转换为值 并将属性及其值插入到新数组中 变量,该变量存储序列化的 绳子。

如果你需要进一步澄清,请告诉我。

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

//jQuery Post

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

后序列化的 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
)

为什么不使用关联数组,这样你就可以很容易地使用它

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


return $returndata;
}

问候

超文本标示语言页:

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

修改后的 穆塔扎 · 侯赛因答案:

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

您只需要在表单中使用 value 属性 name 即可。例如:

表格

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

只要这样做

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

用途:

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

得到数组,不需要反序列化;)

你可以使用这个函数:

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

我也有更好的功能。 因为如果编码后的字符串包含从类似‘ 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;
}

在 JS part 中使用它-然后您将在 PHP 中正确地获得它。
投票最多的答案会给你带来麻烦,以防万一
任何字符串都有 & 符号。

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

这将在发送到
你的 Ajax 等 PHP。