Как мне PHP-десериализовать сериализованную форму jQuery?

160

С помощью $('#form').serialize() , я смог отправить это на страницу PHP. Теперь, как мне десериализовать это в PHP? Он был сериализован в JQuery.

Джин Бин
источник
2
Для подобных вопросов я рекомендую использовать Firebug, чтобы увидеть, какие данные в каком формате отправляются на сервер. Затем вы можете легко опубликовать пример ваших данных.
Чиборг

Ответы:

65

Вам не нужно ничего десериализовать в PHP из serializeметода jquery . Если вы сериализуете данные, они должны быть отправлены в PHP в качестве параметров запроса, если вы используете ajax-запрос метода GET, или отправлять переменные, если вы используете ajax-запрос POST. Таким образом, в PHP вы должны получить доступ к таким значениям, как $_POST["varname"]или в $_GET["varname"]зависимости от типа запроса.

serializeМетод просто принимает форму элементов и помещает их в виде строки."varname=val&var2=val2"

Крис Гутьеррес
источник
3
Это неверно Вам действительно нужно проанализировать serializeвозвращаемую строку . Смотрите действительно популярный ответ ниже.
Исаак Lubow
393

При условии, что ваш сервер получает строку, которая выглядит примерно так (что должно быть, если вы используете jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... что-то вроде этого, вероятно, все, что вам нужно:

$params = array();
parse_str($_GET, $params);

$paramsдолжен быть массив, смоделированный, как вы ожидаете. Обратите внимание, что это работает и с массивами HTML.

Для получения дополнительной информации см. Следующее: http://www.php.net/manual/en/function.parse-str.php

Надеюсь, это полезно. Удачи!

Крис Аллен Лейн
источник
5
Это лучший способ сделать это. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ output); print_r ($ выход);
Энди
2
Этот метод НАМНОГО лучше, чем другой.
Дартак
3
Как пользователь, который дал принятый ответ, я согласен, что это правильный ответ. Я дал свой ответ, исходя из предположения, что запрос отправлялся через методы jQuery ajax $ .get / post (не уверен, откуда я это получил), который отправляет выходные данные функции serialize () как стандартные переменные GET. поэтому никакой разбор строк не потребуется. Например: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Крис Гутьеррес
1
Это единственный приемлемый ответ !! Остальные ответы переусердствуют ...
Mr.TK
1
Это должно быть ответом. Поскольку сервер может принимать не более 1000 входных значений, мне все равно нужен был способ их отправки. Поэтому я сериализовал форму и отправил данные как одно значение. С этим ответом я смог это сделать. Спасибо @chrisallenlane
websupporter
51

// JQuery Post

var arraydata = $('.selector').serialize();

// jquery.post сериализованный формат var - TO - PHP Array

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
 )
Aridane
источник
Это было именно то, что я искал!
Джепсер Бернардино
10

На странице 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поле.

mghhgm
источник
5

Почему бы не использовать ассоциативный массив, чтобы вы могли использовать его легко

function unserializeForm($str) {
    $returndata = array();
    $strArray = explode("&", $str);
    $i = 0;
    foreach ($strArray as $item) {
        $array = explode("=", $item);
        $returndata[$array[0]] = $array[1];
    }

    return $returndata;
}

С уважением

Муртаза Хуршид Хуссейн
источник
4
Я не получаю ваш$i = 0;
Thielicious
5

Модифицированный ответ Муртазы Хуссейна :

function unserializeForm($str) {
    $strArray = explode("&", $str);
    foreach($strArray as $item) {
        $array = explode("=", $item);
        $returndata[] = $array;
    }
    return $returndata;
}
Томаш Майерски
источник
5

Просто сделай это

$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']);
Омид Ахаван
источник
1

Я не знаю, какую версию Jquery вы используете, но это работает для меня в jquery 1.3:

$.ajax({
    type: 'POST', 
    url: your url,
    data: $('#'+form_id).serialize(), 
    success: function(data) {
        $('#debug').html(data);
  }
});

Затем вы можете получить доступ к ключам массива POST, как это обычно делается в php. Просто попробуйте сprint_r() .

Я думаю, что вы оборачиваете сериализованное значение формы в свойство объекта, что, насколько я знаю, бесполезно.

Надеюсь это поможет!

sixFingers
источник
1

Это в ответ на пользователя 1256561. Спасибо за вашу идею ... однако я не позаботился о вещах декодирования URL, упомянутых в шаге 3.

так вот код 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 будет выглядеть следующим образом: attribute1 = value1 & attribute2 = value2 & attribute3 = value3 и т. Д.

Вывод вышеуказанного кода будет по-прежнему в массиве, и вы можете изменить его, чтобы присвоить его любой переменной, которую вы хотите, и это зависит от того, как вы хотите использовать эти данные в дальнейшем.

Array
(
    [0] => attribute1
    [1] => value1
    [2] => attribute2
    [3] => value2
    [4] => attribute3
    [5] => value3
)
JBZ
источник
1

Вам просто нужно имя атрибута значения в форме. Пример :

форма

<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;
}
?>
Лаганский сценарий
источник
1

Использование:

$( '#form' ).serializeArray();

PHP получить массив, не нужно десериализовать;)

Варга Золи
источник
0

Я думаю, что вам нужно отделить имена форм от их значений, один из способов сделать это - взорвать, (&)чтобы вы получилиattribute=value,attribute2=value .

Я хочу сказать, что вы преобразовываете сериализованную строку jQuery в массивы в PHP.

Вот шаги, которые вы должны выполнить, чтобы быть более конкретными.

  1. Перешли на сериализованный jQueryна PHPстраницу (например ajax.php), где вы используете$.ajax представить , используя почту или получить.
  2. Со своей php-страницы взорвите (&)разделенные таким образом атрибуты. Теперь вы получите attribute1 = value, attribute2 = value, теперь вы получите переменную массива php. например$data = array("attribute1=value","attribute2=value")
  3. Сделайте foreachна $dataи , так что вы можете отделить атрибут от значения, и убедитесь , что значения , так что она будет преобразовывать сериализованы значения к значению , которое вам нужно, и вставить атрибут и его значение новой переменной массива, который хранит атрибут и значение сериализованной строки.explode(=)urldecode

Дайте мне знать, если вам нужны дополнительные разъяснения.

Jm Dollosa
источник
0

Вы можете использовать эту функцию:

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' );
Niko
источник