Wie PHP-unserialisiere ich ein jQuery-serialisiertes Formular?

160

Mit $('#form').serialize()konnte ich dies an eine PHP-Seite senden. Wie kann ich es nun in PHP unserialisieren? Es wurde in jQuery serialisiert.

Gene Bean
quelle
2
Bei Fragen wie diesen empfehle ich die Verwendung von Firebug, um festzustellen, welche Daten in welchem ​​Format an den Server gesendet werden. Sie können dann einfach ein Beispiel Ihrer Daten veröffentlichen.
Chiborg

Antworten:

65

Sie sollten in PHP nichts von der jquery- serializeMethode unserialisieren müssen . Wenn Sie die Daten serialisieren, sollten sie als Abfrageparameter an PHP gesendet werden, wenn Sie eine Ajax-Anforderung der GET-Methode verwenden, oder Post-Vars, wenn Sie eine Ajax-Anforderung für den POST verwenden. In PHP würden Sie also auf Werte wie $_POST["varname"]oder $_GET["varname"]abhängig vom Anfragetyp zugreifen .

Die serializeMethode nimmt nur die Formularelemente und fügt sie in Zeichenfolgenform ein."varname=val&var2=val2"

Chris Gutierrez
quelle
3
Das ist falsch. Sie müssen in der Tat die zurückgegebene Zeichenfolge analysieren serialize. Siehe die wirklich beliebte Antwort unten.
Isaac Lubow
392

Vorausgesetzt, Ihr Server empfängt eine Zeichenfolge, die ungefähr so ​​aussieht (was bei Verwendung von jQuery der Fall sein sollte serialize()):

"param1=someVal&param2=someOtherVal"

... so etwas ist wahrscheinlich alles was Sie brauchen:

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

$paramssollte dann ein Array sein, das so modelliert ist, wie Sie es erwarten würden. Beachten Sie, dass dies auch mit HTML-Arrays funktioniert.

Weitere Informationen finden Sie im Folgenden: http://www.php.net/manual/en/function.parse-str.php

Hoffe das ist hilfreich. Viel Glück!

Chris Allen Lane
quelle
5
Das ist der beste Weg, es zu tun. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ output); print_r ($ output);
Andy
2
Diese Methode ist viel besser als die andere.
Dartacus
3
Als Benutzer, der die akzeptierte Antwort gegeben hat, stimme ich zu, dass DIES die richtige Antwort ist. Ich gab meine Antwort unter der Annahme, dass die Anfrage über die Methoden jQuery ajax $ .get / post gesendet wurde (nicht sicher, woher ich diese habe), die die Ausgabe der Funktion serialize () als Standard-GET-Variablen senden. Daher wäre kein String-Parsing erforderlich. Beispiel: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutierrez
1
Dies ist eine einzige akzeptable Antwort !! Der Rest der Antworten ist übertrieben ...
Mr.TK
1
Dies sollte die Antwort sein. Da der Server möglicherweise nicht mehr als 1000 Eingabewerte akzeptiert, musste ich sie trotzdem senden. Also habe ich das Formular serialisiert und die Daten als einen Wert gesendet. Mit dieser Antwort konnte ich dies tun. Danke @chrisallenlane
Websupporter
51

// jQuery Post

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

// jquery.post serialisiertes var - TO - PHP Array Format

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

// Du bekommst dasselbe davon

 Array (
 [A] => 1
 [B] => 2
 [C] => 3
 [D] => 4
 [E] => 5
 [F] => 6
 [G] => 7
 [H] => 8
 )
Aridane
quelle
Genau das habe ich gesucht!
Jepser Bernardino
17
parse_str($_POST['whatever'], $searcharray);
Danidacar
quelle
10

In der HTML- Seite:

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

auf der PHP- Seite:

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

Rückgabefeld für diesen PHP-Code f1.

mghhgm
quelle
5

Warum nicht assoziatives Array verwenden, damit Sie es einfach verwenden können?

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

    return $returndata;
}

Grüße

Murtaza Khursheed Hussain
quelle
4
Ich verstehe deine nicht$i = 0;
Thielicious
5

Geänderte Antwort von Murtaza Hussain :

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

Mach das einfach

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

Ich weiß nicht, welche Version von Jquery Sie verwenden, aber dies funktioniert für mich in JQuery 1.3:

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

Dann können Sie auf POST-Array-Schlüssel zugreifen, wie Sie es normalerweise in PHP tun würden. Versuchen Sie es einfach mit einem print_r().

Ich denke, Sie verpacken einen serialisierten Formularwert in die Eigenschaft eines Objekts, was meines Wissens nutzlos ist.

Hoffe das hilft!

Sechs Finger
quelle
1

Dies ist eine Antwort auf user1256561. Vielen Dank für Ihre Idee. Ich habe mich jedoch nicht um das in Schritt 3 erwähnte URL-Dekodierungsmaterial gekümmert.

Hier ist also der PHP-Code, der die serialisierten Formulardaten dekodiert, falls jemand anderes sie benötigt. Verwenden Sie diesen Code übrigens nach eigenem Ermessen.

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

Die Eingabe der URL-Post-Daten lautet wie folgt: attribute1 = value1 & attribute2 = value2 & attribute3 = value3 und so weiter

Die Ausgabe des obigen Codes befindet sich weiterhin in einem Array. Sie können ihn so ändern, dass er jeder gewünschten Variablen zugewiesen wird. Dies hängt davon ab, wie Sie diese Daten weiter verwenden möchten.

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

Sie benötigen lediglich den Wertattributnamen im Formular. Beispiel:

Bilden

<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-Schrift
quelle
1

Verwenden:

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

PHP Array bekommen, brauchen nicht unserialize;)

Varga Zoli
quelle
0

Ich denke, Sie müssen die Formularnamen von ihren Werten trennen. Eine Methode, um dies zu tun, besteht darin, zu explodieren, (&)damit Sie erhaltenattribute=value,attribute2=value .

Mein Punkt hier ist, dass Sie die serialisierte jQuery-Zeichenfolge in Arrays in PHP konvertieren.

Hier sind die Schritte, die Sie befolgen sollten, um genauer zu sein.

  1. Bestanden auf der serialisiert jQueryzu einer PHPSeite (zB ajax.php) , wo Sie verwenden$.ajax einreichen Post mit oder zu erhalten.
  2. Explodieren Sie auf Ihrer PHP-Seite die (&) so getrennten Attribute. Jetzt erhalten Sie Attribut1 = Wert, Attribut2 = Wert, jetzt erhalten Sie eine PHP-Array-Variable. z.B$data = array("attribute1=value","attribute2=value")
  3. Habe eine foreachauf $dataund explodedas (=)so , dass Sie das Attribut aus dem Wert trennen können, und achten Sie darauf, urldecode den Wert , so dass es serialisiert Werte auf den Wert konvertieren , die Sie benötigen, und setzen Sie das Attribut und seinen Wert auf einen neuen Array - Variable, die speichert das Attribut und den Wert der serialisierten Zeichenfolge.

Lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.

Jm Dollosa
quelle
0

Sie können diese Funktion verwenden:

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

Wie man es benutzt

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