Jak usunąć zserializację PHP z serializowanego formularza jQuery?


160

Używając $('#form').serialize(), mogłem przesłać to na stronę PHP. Jak teraz odserializować go w PHP? Został on zserializowany w jQuery.


2
W przypadku takich pytań zalecam użycie Firebuga, aby zobaczyć, jakie dane w jakim formacie są wysyłane na serwer. Możesz wtedy łatwo zamieścić przykład swoich danych.
— chiborg

Odpowiedzi:


65

Nie powinno być konieczne odserializowanie czegokolwiek w PHP z serializemetody jquery . Jeśli serializujesz dane, powinny one zostać wysłane do PHP jako parametry zapytania, jeśli używasz metody GET z żądania AJAX lub po vars, jeśli używasz żądania AJAX POST. Zatem w PHP można uzyskać dostęp do wartości takich jak $_POST["varname"]lub w $_GET["varname"]zależności od typu żądania.

serializeMetoda zajmuje tylko elementy formularzy i umieszcza je w postaci łańcucha."varname=val&var2=val2"


3
To jest niepoprawne. Rzeczywiście musisz przeanalizować ciąg, który serializezwraca. Zobacz naprawdę popularną odpowiedź poniżej.
— Izaak Lubow

393

Pod warunkiem, że twój serwer otrzymuje ciąg, który wygląda mniej więcej tak (co powinien, jeśli używasz jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... coś takiego to chyba wszystko, czego potrzebujesz:

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

$paramspowinna być wtedy tablicą wymodelowaną zgodnie z oczekiwaniami. Zauważ, że działa to również z tablicami HTML.

Więcej informacji można znaleźć pod adresem : http://www.php.net/manual/en/function.parse-str.php

Mam nadzieję, że to pomocne. Powodzenia!


5
To najlepszy sposób na zrobienie tego. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ wyjście); print_r ($ wyjście);
— Andy

2
Ta metoda jest DUŻO lepsza niż druga.
— dartacus

3
Jako użytkownik, który udzielił zaakceptowanej odpowiedzi, zgadzam się, że TO jest poprawna odpowiedź. Odpowiedziałem, opierając się na założeniu, że żądanie jest wysyłane za pośrednictwem metod jQuery ajax $ .get / post (nie wiem, skąd to mam), które wysyła dane wyjściowe funkcji serialize () jako standardowe zmienne GET. więc nie będzie wymagane analizowanie ciągów. np .: $ .get ('ajax.php', $ ('formularz'). serialize (), funkcja () {});
— Chris Gutierrez,

1
To jedyna akceptowalna odpowiedź !! Reszta odpowiedzi to przesada ...
— Pan TK

1
To powinna być odpowiedź. Ponieważ serwer może nie akceptować więcej niż 1000 wartości wejściowych, i tak potrzebowałem sposobu, aby je wysłać. Więc serializowałem formularz i wysłałem dane jako jedną wartość. Dzięki tej odpowiedzi mogłem to zrobić. Dzięki @chrisallenlane
— websupporter

51

// jQuery Post

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

// jquery.post serializowany var - TO - format tablicy PHP

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

// Dostajesz to samo

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

To było dokładnie to, czego szukałem!
— Jepser Bernardino


10

Na stronie 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 stronie PHP :

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

na tym kodzie php, f1pole powrotu .


5

Dlaczego nie używać tablicy asocjacyjnej, aby można było z niej łatwo korzystać

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

    return $returndata;
}

pozdrowienia


4
Nie rozumiem twojego$i = 0;
— Thielicious

5

Zmodyfikowana odpowiedź Murtaza Hussaina :

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

5

Po prostu zrób to

$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

Nie wiem, której wersji Jquery używasz, ale to działa dla mnie w jquery 1.3:

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

Następnie możesz uzyskać dostęp do kluczy tablic POST, tak jak zwykle robisz to w php. Po prostu spróbuj z print_r().

Myślę, że zawijasz zserializowaną wartość formularza we właściwości obiektu, co jest bezużyteczne, o ile wiem.

Mam nadzieję że to pomoże!


1

To jest odpowiedź dla user1256561. Dziękuję za twój pomysł ... jednak nie zająłem się dekodowaniem adresów URL wspomnianym w kroku 3.

więc tutaj jest kod php, który dekoduje zserializowane dane formularza, jeśli ktoś tego potrzebuje. Nawiasem mówiąc, użyj tego kodu według własnego uznania.

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

Dane wejściowe adresu URL będą wyglądać następująco: atrybut1 = wartość1 i atrybut2 = wartość2 i atrybut3 = wartość3 i tak dalej

Wynik powyższego kodu nadal będzie w tablicy i możesz go zmodyfikować, aby przypisać go do dowolnej zmiennej, a to zależy od tego, jak chcesz dalej używać tych danych.

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

1

Potrzebujesz tylko nazwy atrybutu wartości w formularzu. Przykład:

Formularz

<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

Posługiwać się:

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

PHP pobierz tablicę, nie potrzebujesz odserializowania;)


0

Myślę, że musisz oddzielić nazwy formularzy od ich wartości, jedną metodą jest eksplodowanie (&), aby uzyskać attribute=value,attribute2=value.

Chodzi mi o to, że przekonwertujesz serializowany ciąg jQuery na tablice w PHP.

Oto kroki, które należy wykonać, aby uzyskać bardziej szczegółowe informacje.

  1. Przekazywane w postaci serializowanej jQuerydo PHPstrony (np. ajax.php), Na której można $.ajaxprzesłać pocztą lub pobrać.
  2. Na swojej stronie php rozbij w (&)ten sposób oddzielające atrybuty. Teraz otrzymasz atrybut1 = wartość, atrybut2 = wartość, teraz otrzymasz zmienną tablicową php. na przykład$data = array("attribute1=value","attribute2=value")
  3. Wykonaj foreachon $datai explodethe (=), aby można było oddzielić atrybut od wartości, i upewnij się, urldecode że wartość jest konwertowana zserializowanych wartości na wartość, której potrzebujesz, i wstaw atrybut i jego wartość do nowej zmiennej tablicowej, która przechowuje atrybut i wartość serializowanego ciągu.

Daj mi znać, jeśli potrzebujesz więcej wyjaśnień.


0

Możesz użyć tej funkcji:

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

Jak tego użyć

$_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
post_unserialize( 'serialized_data' );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.