使用来自 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);