【问题标题】:Using serialized data from AJAX object with PHP通过 PHP 使用来自 AJAX 对象的序列化数据
【发布时间】:2015-01-31 01:49:25
【问题描述】:

我正在发送一个完整的表单,大约 8 个字段,以及我的 AJAX 数据对象,其中一个是序列化字符串:

var fields = $(this).serialize();

var data = { 
    action:'newSubmission',
    nonce: Nonce,
    fields: fields
}; 

现在在 PHP 中,我无法理解如何正确地从 $_POST 对象中获取每个字段值。

$test = $_POST['field'];

是完整的字符串,并返回给 JS 一个格式正确的 JSON 对象。但是如何在 PHP 中正确分解序列化的字符串?

【问题讨论】:

    标签: php jquery ajax serialization


    【解决方案1】:

    字符串将被编码,因此您必须使用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";
    

    您还可以将薄作为数组返回。只需省略(对象)强制转换并将函数中的数据返回为:

    return $data;
    

    如果您想将内容返回给您的 JS,那么您应该将它们作为数组回显并使用 json_encode:

    $array = array("success" => true);
    echo json_encode($array);
    

    【讨论】:

    • 真的这么复杂吧?我使用了您的函数并将其数据返回给我的 JS。我得到了“满”:{},
    • 我不完全确定你想做什么。为什么要直接回到 JS。你把你的字符串放到后端,想要一些你可以使用的东西。这会做到的。我在代码中添加了一些内容来展示如何使用该功能。还有如何告诉你的 JS 成功。希望对您有所帮助。
    • 嘿,丹,我将把它发回 JS 以确保数据正确。就是这样。我将继续处理您的示例代码。谢谢顺便说一句。
    【解决方案2】:

    尝试使用:

    $serializedData = file_get_contents("php://input");
    $unserializedData = array();
    parse_str($unserializedData,$serializedData);
    print_r($unserializedData);
    

    使用 php://input 代替 PHP $_POST 超全局变量。

    PHP "php://input" vs $_POST

    然后你可以使用 parse_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;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2012-02-02
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多