使用 $('#form').serialize(),我能够将它发送到 PHP 页面。现在我如何在 PHP 中反序列化它?它是在 jQuery 中序列化的。
$('#form').serialize()
您不必从 jquery serialize方法中取消序列化 PHP 中的任何内容。如果序列化数据,如果使用 GET 方法 ajax 请求,则应将其作为查询参数发送给 PHP; 如果使用 POST ajax 请求,则应发送 vars。因此,在 PHP 中,您可以根据请求类型访问诸如 $_POST["varname"]或 $_GET["varname"]之类的值。
serialize
$_POST["varname"]
$_GET["varname"]
serialize方法只接受表单元素并将它们放在字符串形式中
parse_str($_POST['whatever'], $searcharray);
假设您的服务器正在接收一个类似于下面这样的字符串(如果您使用的是 jQuery serialize(),它应该是这样的) :
serialize()
"param1=someVal¶m2=someOtherVal"
... 这样的东西可能就是你所需要的:
$params = array(); parse_str($_GET, $params);
然后,$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()。
print_r()
我认为你在用对象的属性包装序列化的表单值,据我所知,这是没有用的。
希望这个能帮上忙!
我认为您需要将表单名称从它的值中分离出来,做到这一点的一个方法是爆破 (&),这样您将得到 attribute=value,attribute2=value。
(&)
attribute=value,attribute2=value
我的观点是,您将在 PHP 中将序列化的 jQuery 字符串转换为数组。
下面是您应该遵循的更具体的步骤。
jQuery
PHP
ajax.php
$.ajax
$data
explode
(=)
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字段。
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。