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.

Feijão Genético
fonte
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"

Chris Gutierrez
fonte
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!

Chris Allen Lane
fonte
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
 )
Aridane
fonte
Era exatamente o que eu estava procurando!
Jepser Bernardino 3/12/12
17
parse_str($_POST['whatever'], $searcharray);
danidacar
fonte
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.

mghhgm
fonte
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

Murtaza Khursheed Hussain
fonte
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;
}
Tomasz Majerski
fonte
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']);
Omid Akhavan
fonte
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!

sixFingers
fonte
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
)
jbz
fonte
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;
}
?>
Lagan Script
fonte
1

Usar:

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

Php get array, não precisa desserializar;)

Varga Zoli
fonte
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.

Jm Dollosa
fonte
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' );
Niko
fonte