【发布时间】:2010-12-20 00:58:03
【问题描述】:
使用$('#form').serialize(),我能够将其发送到 PHP 页面。现在我如何在 PHP 中反序列化它?它是用jQuery序列化的。
【问题讨论】:
-
对于此类问题,我建议使用 Firebug 来查看以什么格式发送到服务器的数据。然后,您可以轻松发布数据示例。
标签: php jquery serialization
使用$('#form').serialize(),我能够将其发送到 PHP 页面。现在我如何在 PHP 中反序列化它?它是用jQuery序列化的。
【问题讨论】:
标签: php jquery serialization
假设您的服务器正在接收一个看起来像这样的字符串(如果您使用的是 jQuery serialize(),它应该是这样的):
"param1=someVal¶m2=someOtherVal"
...你可能只需要这样的东西:
$params = array();
parse_str($_GET, $params);
$params 应该是一个按照您的期望建模的数组。请注意,这也适用于 HTML 数组。
有关详细信息,请参阅以下内容: http://www.php.net/manual/en/function.parse-str.php
【讨论】:
您不必从 jquery serialize 方法中反序列化 PHP 中的任何内容。如果您对数据进行序列化,如果您使用的是 GET 方法 ajax 请求,则应将其作为查询参数发送到 PHP;如果您使用的是 POST ajax 请求,则应将其作为查询参数发送到 PHP。因此,在 PHP 中,您将根据请求类型访问 $_POST["varname"] 或 $_GET["varname"] 之类的值。
serialize 方法只是获取表单元素并将它们放入字符串形式。 "varname=val&var2=val2"
【讨论】:
serialize 返回的字符串。请参阅下面真正流行的答案。
// 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
)
【讨论】:
parse_str($_POST['whatever'], $searcharray);
【讨论】:
在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 字段。
【讨论】:
只需这样做
$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']);
【讨论】:
为什么不用关联数组,这样你就可以轻松使用了
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;
修改Murtaza Hussain答案:
function unserializeForm($str) {
$strArray = explode("&", $str);
foreach($strArray as $item) {
$array = explode("=", $item);
$returndata[] = $array;
}
return $returndata;
}
【讨论】:
用途:
$( '#form' ).serializeArray();
php 获取数组,不需要反序列化 ;)
【讨论】:
我不知道您使用的是哪个版本的 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()。
我认为您将序列化的表单值包装在对象的属性中,据我所知,这是无用的。
希望这会有所帮助!
【讨论】:
这是对 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
)
【讨论】:
您只需要表单中的值属性名称。示例:
表格
<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;
}
?>
【讨论】:
我认为您需要将表单名称与其值分开,一种方法是分解(&),这样您将得到attribute=value,attribute2=value。
我的意思是,您将在 PHP 中将序列化的 jQuery 字符串转换为数组。
以下是您应该遵循的更具体的步骤。
jQuery 传递给PHP 页面(例如ajax.php)
您使用 $.ajax 使用 post 或 get 提交的地方。(&),从而将每个
属性。现在你会得到attribute1=value,attribute2=value,现在
你会得到一个 php 数组变量。例如$data =
array("attribute1=value","attribute2=value")
$data 和explode (=) 上执行foreach,这样你就可以
将属性与值分开,一定要urldecode
值,以便它将序列化值转换为值
您需要的,并将属性及其值插入到新数组中
变量,存储序列化的属性和值
字符串。如果您需要更多说明,请告诉我。
【讨论】:
你可以使用这个功能:
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 部分使用它 - 然后你会在你的 PHP 中正确地得到它。
投票最多的答案会让你遇到麻烦
任何字符串都会有 & 符号。
// this = the form
const arr = $(this).serializeArray();
const data = arr.reduce((acc, {name, value}) => ({...acc, [name]: value}),{});
这将在运入时提供一个键/值数组
你 PHP 的 ajax 等等。
【讨论】: