¿Cómo puedo PHP deserializar un formulario jQuery serializado?

160

Utilizando $('#form').serialize(), pude enviar esto a una página PHP. Ahora, ¿cómo puedo deserializarlo en PHP? Fue serializado en jQuery.

Frijol genético
fuente
2
Para preguntas como estas, recomiendo usar Firebug para ver qué datos en qué formato se envían al servidor. Luego puede publicar fácilmente un ejemplo de sus datos.
chiborg

Respuestas:

65

No debería tener que anular la serialización de nada en PHP desde el serializemétodo jquery . Si serializa los datos, debe enviarse a PHP como parámetros de consulta si está utilizando una solicitud ajax del método GET o publicar vars si está utilizando una solicitud ajax POST. Entonces, en PHP, accedería a valores como $_POST["varname"]o$_GET["varname"] dependiendo del tipo de solicitud.

El serializemétodo solo toma los elementos del formulario y los pone en forma de cadena."varname=val&var2=val2"

Chris Gutiérrez
fuente
3
Esto es incorrecto. De hecho, debe analizar la cadena que serializedevuelve. Vea la respuesta realmente popular a continuación.
Isaac Lubow
393

Siempre que su servidor esté recibiendo una cadena que se parece a esto (que debería si está usando jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... algo como esto es probablemente todo lo que necesitas:

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

$paramsentonces debería ser una matriz modelada como cabría esperar. Tenga en cuenta que esto también funciona con matrices HTML.

Consulte lo siguiente para obtener más información: http://www.php.net/manual/en/function.parse-str.php

Espero que sea útil. ¡Buena suerte!

Chris Allen Lane
fuente
55
Esa es la mejor manera de hacerlo. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ output); print_r ($ salida);
Andy
2
Este método es MUCHO mejor que el otro.
dartacus
3
Como usuario que dio la respuesta aceptada, acepto que ESTA es la respuesta correcta. Di mi respuesta en base a la suposición de que la solicitud se estaba enviando a través de los métodos jQuery ajax $ .get / post (no estoy seguro de dónde lo obtuve) que envía la salida de la función serialize () como variables GET estándar. por lo que no se requeriría el análisis de cadenas. por ejemplo: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutiérrez
1
¡Esta es una y única respuesta aceptable! El resto de las respuestas es exagerar ...
Mr.TK
1
Esta debería ser la respuesta. Como el servidor podría no aceptar más de 1000 valores de entrada, necesitaba una forma de enviarlos de todos modos. Así que serialicé el formulario y envié los datos como un valor. Con esta respuesta, pude hacerlo. Gracias @chrisallenlane
websupporter
51

// jQuery Post

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

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

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

// Obtienes lo mismo de eso

 Array (
 [A] => 1
 [B] => 2
 [C] => 3
 [D] => 4
 [E] => 5
 [F] => 6
 [G] => 7
 [H] => 8
 )
Aridane
fuente
¡Eso era exactamente lo que estaba buscando!
Jepser Bernardino
17
parse_str($_POST['whatever'], $searcharray);
danidacar
fuente
10

En la 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>

en la página PHP :

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

en este código php, f1campo de retorno .

mghhgm
fuente
5

¿Por qué no usar una matriz asociativa, para que pueda usarla fácilmente?

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

    return $returndata;
}

Saludos

Murtaza Khursheed Hussain
fuente
44
No entiendo tu$i = 0;
Thielicious
5

Respuesta de Murtaza Hussain modificada :

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

Simplemente haz esto

$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
fuente
1

No sé qué versión de Jquery estás usando, pero esto funciona para mí en jquery 1.3:

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

Luego puede acceder a las teclas de matriz POST como lo haría normalmente en php. Solo intenta con unprint_r() .

Creo que está envolviendo el valor del formulario serializado en la propiedad de un objeto, lo que es inútil hasta donde yo sé.

¡Espero que esto ayude!

seis dedos
fuente
1

Esto es en respuesta al usuario 1256561. Gracias por su idea ... sin embargo, no me he ocupado de las cosas de decodificación de URL mencionadas en el paso 3.

así que aquí está el código php que decodificará los datos del formulario serializado, si alguien más lo necesita. Por cierto, use este código a su propia discreción.

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

La entrada de datos de publicación de URL será como: atributo1 = valor1 y atributo2 = valor2 y atributo3 = valor3 y así sucesivamente

La salida del código anterior seguirá estando en una matriz y puede modificarla para asignarla a cualquier variable que desee, y depende de cómo quiera usar más estos datos.

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

Solo necesita el nombre del atributo de valor en el formulario. Ejemplo:

Formar

<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
fuente
1

Utilizar:

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

Php get array, no necesita anular la serialización;)

Varga Zoli
fuente
0

Creo que necesita separar los nombres de los formularios de sus valores, un método para hacerlo es explotar (&)para obtener attribute=value,attribute2=value.

Mi punto aquí es que convertirá la cadena jQuery serializada en matrices en PHP.

Estos son los pasos que debe seguir para ser más específico.

  1. Pasó el serializado jQuerya una PHPpágina (por ejemplo ajax.php) donde usa$.ajax enviar usando post u get.
  2. Desde tu página php, explota el (&) separación de cada atributo. Ahora obtendrá el atributo1 = valor, el atributo2 = valor, ahora obtendrá una variable de matriz php. p.ej$data = array("attribute1=value","attribute2=value")
  3. Hacer un foreachsobre $datay explodela (=)manera que se puede separar el atributo del valor, y estar seguro de que urldecode el valor para que convertirá los valores serializados con el valor que se necesita, e insertar el atributo y su valor para una nueva variable de matriz, la cual almacena el atributo y el valor de la cadena serializada.

Avísame si necesitas más aclaraciones.

Jm Dollosa
fuente
0

Puedes usar esta función:

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

Cómo usarlo

$_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
post_unserialize( 'serialized_data' );
Niko
fuente