使用来自 AJAX 对象的序列化数据和 PHP
Using serialized data from AJAX object with PHP
我要发送一个完整的表单,大约 8 个字段,以及我的 AJAX 数据对象,其中一个是序列化字符串:
var fields = $(this).serialize();
var data = {
action:'newSubmission',
nonce: Nonce,
fields: fields
};
现在 PHP 我无法理解如何从 $_POST 对象正确获取每个字段值。
$test = $_POST['field'];
是完整的字符串并返回给 JS 一个格式正确的 JSON 对象。但是如何在 PHP 中正确分解序列化字符串?
尝试使用:
$serializedData = file_get_contents("php://input");
$unserializedData = array();
parse_str($unserializedData,$serializedData);
print_r($unserializedData);
而不是 PHP $_POST 超全局使用 php:// 输入。
PHP "php://input" vs $_POST
然后可以使用theparse_str() php函数将序列化后的字符串转为php数组
如果您愿意,还有许多其他方法可以手动执行此操作:
function unserializeForm($str) {
$returndata = array();
$strArray = explode("&", $str);
$i = 0;
foreach ($strArray as $item) {
$array = explode("=", $item);
$returndata[$array[0]] = $array[1];
}
return $returndata;
}
字符串将被编码,因此您必须使用 url_decode
进行编码。
这是我用来从字符串中构建一个可行对象的函数。
function urldecode_to_obj($str) {
$str = trim($str, '"');
// explode string before decoding
foreach (explode('&', $str) as $chunk) {
$param = explode("=", $chunk);
if ($param) {
// search string for array elements and look for key-name if exists
preg_match('#\[(.+?)\]$#', urldecode($param[0]), $with_key);
preg_match('#\[\]$#', urldecode($param[0]), $no_key);
$mkey = preg_split('/\[/', urldecode($param[0]));
// converts to array elements with numeric key
if ($no_key) {
$data[$mkey[0]][] = urldecode($param[1]);
}
// converts to array elements with named key
if ($with_key) {
$data[$mkey[0]][$with_key[1]] = urldecode($param[1]);
}
if (!$no_key && !$with_key) {
$data[urldecode($param[0])] = urldecode($param[1]);
}
}
}
return (object)$data;
}
$str = "serialized_string";
$obj = urldecode_to_obj($str);
您的带值变量现在位于对象中。如果你有一个带有 value1 的 var1 变量:
$obj -> var1 = "value1";
您还可以将 thins 作为数组取回。只需省略(对象)转换和 return t\he 中的数据函数作为:
return $data;
如果你想 return 东西到你的 JS 那么你应该将它们作为数组回显并使用 json_encode:
$array = array("success" => true);
echo json_encode($array);
我要发送一个完整的表单,大约 8 个字段,以及我的 AJAX 数据对象,其中一个是序列化字符串:
var fields = $(this).serialize();
var data = {
action:'newSubmission',
nonce: Nonce,
fields: fields
};
现在 PHP 我无法理解如何从 $_POST 对象正确获取每个字段值。
$test = $_POST['field'];
是完整的字符串并返回给 JS 一个格式正确的 JSON 对象。但是如何在 PHP 中正确分解序列化字符串?
尝试使用:
$serializedData = file_get_contents("php://input");
$unserializedData = array();
parse_str($unserializedData,$serializedData);
print_r($unserializedData);
而不是 PHP $_POST 超全局使用 php:// 输入。
PHP "php://input" vs $_POST
然后可以使用theparse_str() php函数将序列化后的字符串转为php数组
如果您愿意,还有许多其他方法可以手动执行此操作:
function unserializeForm($str) {
$returndata = array();
$strArray = explode("&", $str);
$i = 0;
foreach ($strArray as $item) {
$array = explode("=", $item);
$returndata[$array[0]] = $array[1];
}
return $returndata;
}
字符串将被编码,因此您必须使用 url_decode
进行编码。
这是我用来从字符串中构建一个可行对象的函数。
function urldecode_to_obj($str) {
$str = trim($str, '"');
// explode string before decoding
foreach (explode('&', $str) as $chunk) {
$param = explode("=", $chunk);
if ($param) {
// search string for array elements and look for key-name if exists
preg_match('#\[(.+?)\]$#', urldecode($param[0]), $with_key);
preg_match('#\[\]$#', urldecode($param[0]), $no_key);
$mkey = preg_split('/\[/', urldecode($param[0]));
// converts to array elements with numeric key
if ($no_key) {
$data[$mkey[0]][] = urldecode($param[1]);
}
// converts to array elements with named key
if ($with_key) {
$data[$mkey[0]][$with_key[1]] = urldecode($param[1]);
}
if (!$no_key && !$with_key) {
$data[urldecode($param[0])] = urldecode($param[1]);
}
}
}
return (object)$data;
}
$str = "serialized_string";
$obj = urldecode_to_obj($str);
您的带值变量现在位于对象中。如果你有一个带有 value1 的 var1 变量:
$obj -> var1 = "value1";
您还可以将 thins 作为数组取回。只需省略(对象)转换和 return t\he 中的数据函数作为:
return $data;
如果你想 return 东西到你的 JS 那么你应该将它们作为数组回显并使用 json_encode:
$array = array("success" => true);
echo json_encode($array);