Comment désérialiser PHP un formulaire sérialisé jQuery?

160

En utilisant $('#form').serialize(), j'ai pu envoyer ceci sur une page PHP. Maintenant, comment le désérialiser en PHP? Il a été sérialisé dans jQuery.

Gène Bean
la source
2
Pour des questions comme celles-ci, je recommande d'utiliser Firebug pour voir quelles données dans quel format sont envoyées au serveur. Vous pouvez ensuite poster facilement un exemple de vos données.
chiborg

Réponses:

65

Vous ne devriez pas avoir à désérialiser quoi que ce soit en PHP de la serializeméthode jquery . Si vous sérialisez les données, elles doivent être envoyées à PHP en tant que paramètres de requête si vous utilisez une requête ajax de la méthode GET ou post vars si vous utilisez une requête POST ajax. Donc en PHP, vous accéderiez à des valeurs comme $_POST["varname"]ou$_GET["varname"] fonction du type de requête.

La serializeméthode prend simplement les éléments du formulaire et les met sous forme de chaîne."varname=val&var2=val2"

Chris Gutierrez
la source
3
Ceci est une erreur. Vous devez en effet analyser la chaîne qui serializeretourne. Voir la réponse très populaire ci-dessous.
Isaac Lubow
393

À condition que votre serveur reçoive une chaîne qui ressemble à quelque chose comme ceci (ce qu'il devrait si vous utilisez jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... quelque chose comme ça est probablement tout ce dont vous avez besoin:

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

$paramsdevrait alors être un tableau modélisé comme vous vous attendez. Notez que cela fonctionne également avec les tableaux HTML.

Consultez les informations suivantes pour plus d'informations: http://www.php.net/manual/en/function.parse-str.php

J'espère que c'est utile. Bonne chance!

Chris Allen Lane
la source
5
C'est la meilleure façon de procéder. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ sortie); print_r ($ sortie);
Andy
2
Cette méthode est BEAUCOUP meilleure que l'autre.
dartacus
3
En tant qu'utilisateur qui a donné la réponse acceptée, je reconnais que CECI est la bonne réponse. J'ai donné ma réponse en partant de l'hypothèse que la requête était envoyée via les méthodes jQuery ajax $ .get / post (je ne sais pas d'où je l'ai obtenu) qui envoie la sortie de la fonction serialize () en tant que variables GET standard. donc aucune analyse de chaîne n'est requise. par exemple: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutierrez
1
C'est une et seule réponse acceptable !! Le reste des réponses, c'est exagérer les choses ...
Mr.TK
1
Cela devrait être la réponse. Étant donné que le serveur peut ne pas accepter plus de 1000 valeurs d'entrée, j'avais quand même besoin d'un moyen de les envoyer. J'ai donc sérialisé le formulaire et envoyé les données en une seule valeur. Avec cette réponse, j'ai pu le faire. Merci @chrisallenlane
websupporter
51

// jQuery Post

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

// jquery.post sérialisé var - TO - Format PHP Array

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

// Vous obtenez la même chose

 Array (
 [A] => 1
 [B] => 2
 [C] => 3
 [D] => 4
 [E] => 5
 [F] => 6
 [G] => 7
 [H] => 8
 )
Aridane
la source
C'était exactement ce que je cherchais!
Jepser Bernardino
17
parse_str($_POST['whatever'], $searcharray);
nascar
la source
10

Dans la page 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>

sur la page PHP :

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

sur ce code php, retournez le f1champ.

mghhgm
la source
5

Pourquoi ne pas utiliser de tableau associatif pour pouvoir l'utiliser facilement

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

    return $returndata;
}

Cordialement

Murtaza Khursheed Hussain
la source
4
Je ne comprends pas votre$i = 0;
Thielicious
5

Réponse modifiée de Murtaza Hussain :

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

Faites simplement ceci

$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
la source
1

Je ne sais pas quelle version de Jquery vous utilisez, mais cela fonctionne pour moi dans jquery 1.3:

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

Ensuite, vous pouvez accéder aux clés du tableau POST comme vous le feriez normalement en php. Essayez simplement avec un print_r().

Je pense que vous encapsulez la valeur du formulaire sérialisé dans la propriété d'un objet, ce qui est inutile à ma connaissance.

J'espère que cela t'aides!

six doigts
la source
1

Ceci est en réponse à user1256561. Merci pour votre idée. Cependant, je n'ai pas pris soin des trucs de décodage d'url mentionnés à l'étape 3.

voici donc le code php qui décodera les données du formulaire sérialisé, si quelqu'un d'autre en a besoin. À propos, utilisez ce code à votre propre discrétion.

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

L'entrée de données de publication d'url sera comme: attribut1 = valeur1 & attribut2 = valeur2 & attribut3 = valeur3 et ainsi de suite

La sortie du code ci-dessus sera toujours dans un tableau et vous pouvez le modifier pour l'attribuer à n'importe quelle variable de votre choix et cela dépend de la manière dont vous souhaitez utiliser davantage ces données.

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

Vous avez juste besoin du nom d'attribut de valeur sous forme. Exemple :

Forme

<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;
}
?>
Script de Lagan
la source
1

Utilisation:

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

Php get array, pas besoin de se désérialiser;)

Varga Zoli
la source
0

Je pense que vous devez séparer les noms de formulaire de ses valeurs, une méthode pour ce faire est d'exploser (&)afin que vous obteniezattribute=value,attribute2=value .

Mon point ici est que vous allez convertir la chaîne jQuery sérialisée en tableaux en PHP.

Voici les étapes à suivre pour être plus précis.

  1. Transmis le sérialisé jQueryà une PHPpage (par exemple ajax.php) où vous utilisez$.ajax pour soumettre en utilisant post ou get.
  2. Depuis votre page php, explosez le (&) attributs séparant ainsi chaque attribut. Vous obtiendrez maintenant attribut1 = valeur, attribut2 = valeur, vous obtiendrez maintenant une variable de tableau php. par exemple$data = array("attribute1=value","attribute2=value")
  3. Faites un foreachon $dataet explodele (=)pour pouvoir séparer l'attribut de la valeur, et assurez-vous de urldecode la valeur afin qu'elle convertisse les valeurs sérialisées en la valeur dont vous avez besoin, et insérez l'attribut et sa valeur dans une nouvelle variable de tableau, qui stocke l'attribut et la valeur de la chaîne sérialisée.

Faites-moi savoir si vous avez besoin de plus de précisions.

Jm Dollosa
la source
0

Vous pouvez utiliser cette fonction:

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

Comment l'utiliser

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