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.

Gene Bean
źródło
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"

Chris Gutierrez
źródło
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!

Chris Allen Lane
źródło
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
 )
Aridane
źródło
To było dokładnie to, czego szukałem!
Jepser Bernardino
17
parse_str($_POST['whatever'], $searcharray);
danidacar
źródło
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 .

mghhgm
źródło
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

Murtaza Khursheed Hussain
źródło
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;
}
Tomasz Majerski
źródło
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']);
Omid Akhavan
źródło
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!

SixFingers
źródło
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
)
jbz
źródło
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;
}
?>
Skrypt Lagana
źródło
1

Posługiwać się:

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

PHP pobierz tablicę, nie potrzebujesz odserializowania;)

Varga Zoli
źródło
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ń.

Jm Dollosa
źródło
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' );
Niko
źródło