Como deserializar o PHP de um formulário serializado com jQuery?


160

Usando $('#form').serialize(), consegui enviar isso para uma página PHP. Agora, como deserializá-lo em PHP? Foi serializado no jQuery.


2
Para perguntas como essas, recomendo usar o Firebug para ver quais dados em que formato são enviados ao servidor. Você pode postar facilmente um exemplo de seus dados.
chiborg

Respostas:


65

Você não precisa desserializar nada no PHP a partir do serializemétodo jquery . Se você serializar os dados, eles deverão ser enviados ao PHP como parâmetros de consulta se você estiver usando uma solicitação ajax do método GET ou post vars se estiver usando uma solicitação ajax POST. Portanto, no PHP, você acessaria valores como $_POST["varname"]ou $_GET["varname"]dependendo do tipo de solicitação.

O serializemétodo apenas pega os elementos do formulário e os coloca em forma de string."varname=val&var2=val2"


3
Isto está incorreto. Você realmente precisa analisar a string que serializeretorna. Veja a resposta realmente popular abaixo.
Isaac Lubow

393

Desde que o seu servidor esteja recebendo uma string parecida com esta (o que deveria acontecer se você estiver usando o jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... algo como isto é provavelmente tudo que você precisa:

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

$paramsdeve ser uma matriz modelada como você esperaria. Observe que isso também funciona com matrizes HTML.

Consulte o seguinte para obter mais informações: http://www.php.net/manual/en/function.parse-str.php

Espero que seja útil. Boa sorte!


5
Essa é a melhor maneira de fazer isso. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ output); print_r ($ output);
22410 Andy

2
Este método é MUITO melhor que o outro.
Dartacus

3
Como usuário que deu a resposta aceita, concordo que ESTA é a resposta correta. Dei minha resposta com base no pressuposto de que a solicitação estava sendo enviada por meio dos métodos jQuery ajax $ .get / post (não sei de onde obtive isso), que envia a saída da função serialize () como variáveis ​​GET padrão. portanto, nenhuma análise de string seria necessária. por exemplo: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutierrez

1
Esta é uma e única resposta aceitável !! Descansar das respostas é exagerar as coisas ...
Mr.TK

1
Essa deve ser a resposta. Como o servidor pode não aceitar mais de 1000 valores de entrada, eu precisava de uma maneira de enviá-los de qualquer maneira. Então, serializei o formulário e enviei os dados como um valor. Com esta resposta, eu pude fazê-lo. Graças @chrisallenlane
websupporter

51

// Post do jQuery

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

// jquery.post serialized var - TO - formato PHP Array

parse_str($_POST[arraydata], $searcharray);
print_r($searcharray); // Only for print array

// Você obtém o mesmo

 Array (
 [A] => 1
 [B] => 2
 [C] => 3
 [D] => 4
 [E] => 5
 [F] => 6
 [G] => 7
 [H] => 8
 )

Era exatamente o que eu estava procurando!
Jepser Bernardino 3/12/12


10

Na página 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>

na página PHP :

<?php
if(isset($_POST['data']))
{
    parse_str($_POST['data'], $searcharray);
    $data = array(
        "back_message"   => $searcharray['f1']
    );
    echo json_encode($data);
}
?>

neste código php, retorne o f1campo.


5

Por que não usar array associativo, para que você possa usá-lo facilmente

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

    return $returndata;
}

Saudações


4
Eu não entendi o seu$i = 0;
Thielicious 4/16

5

Resposta Murtaza Hussain modificada :

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

5

Simplesmente faça isso

$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

Não sei qual versão do Jquery você está usando, mas isso funciona para mim no jquery 1.3:

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

Então você pode acessar as chaves do array POST como faria normalmente no php. Apenas tente com umprint_r() .

Eu acho que você está agrupando o valor do formulário serializado na propriedade de um objeto, que é inútil até onde eu sei.

Espero que isto ajude!


1

Isso está em resposta ao usuário1256561. Obrigado pela sua idéia .. no entanto, eu não cuidei do material de decodificação de URL mencionado na etapa 3.

então aqui está o código php que decodificará os dados do formulário serializado, se mais alguém precisar. A propósito, use esse código a seu critério.

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);
}

A entrada de dados de postagem da URL será como: attribute1 = value1 & attribute2 = value2 & attribute3 = value3 e assim por diante

A saída do código acima ainda estará em uma matriz e você poderá modificá-lo para atribuí-lo a qualquer variável que desejar e isso depende de como você deseja usar esses dados ainda mais.

Array
(
    [0] => attribute1
    [1] => value1
    [2] => attribute2
    [3] => value2
    [4] => attribute3
    [5] => value3
)

1

Você só precisa do nome do atributo de valor no formulário. Exemplo:

Formato

<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

Usar:

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

Php get array, não precisa desserializar;)


0

Eu acho que você precisa separar os nomes dos formulários dos seus valores, um método para fazer isso é explodir (&)para que você obtenha attribute=value,attribute2=value.

Meu argumento aqui é que você converterá a seqüência de caracteres jQuery serializada em matrizes no PHP.

Aqui estão as etapas que você deve seguir para ser mais específico.

  1. Passou o serializado jQuerypara uma PHPpágina (por exemplo ajax.php) onde você usa $.ajaxpara enviar usando postagem ou recebimento.
  2. Na sua página php, exploda o (&) que separa cada atributo. Agora você receberá attribute1 = value, attribute2 = value, agora receberá uma variável de array php. por exemplo$data = array("attribute1=value","attribute2=value")
  3. Fazer um foreachsobre $datae explodeo(=) para poder separar o atributo do valor e certifique-se de urldecode que ele converta valores serializados no valor que você precisa e insira o atributo e seu valor em uma nova variável de matriz, que armazena o atributo e o valor da sequência serializada.

Entre em contato se precisar de mais esclarecimentos.


0

Você pode usar esta função:

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);
}

Como usá-lo

$_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
post_unserialize( 'serialized_data' );
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.