Як я можу PHP-несеріалізувати jQuery-серіалізовану форму?


160

Використовуючи $('#form').serialize(), я зміг надіслати це на сторінку PHP. Тепер, як я його несеріалізую в PHP? Він був серіалізований у jQuery.


2
Для таких питань, як я, рекомендую використовувати Firebug, щоб побачити, які дані в якому форматі надсилаються на сервер. Потім ви можете легко розмістити приклад своїх даних.
чиборг

Відповіді:


65

Вам не доведеться знімати серіалізацію в PHP з serializeметоду jquery . Якщо ви серіалізуєте дані, вони повинні бути надіслані PHP як параметри запиту, якщо ви використовуєте метод GET ajax-запит або розміщуєте vars, якщо ви використовуєте POST ajax-запит. Отже, в PHP ви отримаєте доступ до значень, таких як $_POST["varname"]або $_GET["varname"]залежно від типу запиту.

serializeМетод просто приймає форму елементів і поміщає їх у вигляді рядка."varname=val&var2=val2"


3
Це неправильно. Вам дійсно потрібно проаналізувати рядок, який serializeповертається. Дивіться справді популярну відповідь нижче.
Ісаак Любов

393

За умови, що ваш сервер отримує рядок, який виглядає приблизно так (як це має бути, якщо ви використовуєте jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... щось подібне, мабуть, все, що вам потрібно:

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

$paramsТоді має бути масив, змодельований так, як ви очікували. Зверніть увагу, це працює також з масивами HTML.

Для отримання додаткової інформації див. Наступне: http://www.php.net/manual/en/function.parse-str.php

Сподіваюся, це корисно. Удачі!


5
Це найкращий спосіб зробити це. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ вихід); print_r ($ вихід);
Енді

2
Цей спосіб набагато кращий за інші.
Дартакус

3
Як користувач, який дав прийняту відповідь, я погоджуюся, що ЦЕ є правильною відповіддю. Я дав свою відповідь, виходячи з припущення, що запит надсилається за допомогою jQuery ajax $ .get / post методів (не впевнений, звідки я це отримав), який посилає вихід функції serialize () як стандартні змінні GET. тому розбір рядків не буде потрібен. наприклад: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Кріс Гутьєррес

1
Це одна і єдина прийнятна відповідь !! Решта відповідей - це перестарання з речами ...
Mr.TK

1
Це має бути відповіддю. Оскільки сервер може не приймати більше 1000 вхідних значень, мені потрібен був спосіб відправити їх у будь-якому випадку. Тому я серіалізував форму і надсилав дані як одне значення. Маючи цю відповідь, я зміг це зробити. Дякуємо @chrisallenlane
websupporter

51

// Повідомлення jQuery

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

// jquery.post серіалізований var - TO - PHP формат масиву

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

// Ви отримуєте будь-яке те саме

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

Це саме те, що я шукав!
Джепсер Бернардіно


10

На сторінці 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>

на сторінці PHP :

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

у цьому PHP-коді, f1поле повернення .


5

Чому б не використовувати асоціативний масив, так що ви можете легко використовувати його

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

    return $returndata;
}

З повагою


4
Я не розумію вашого$i = 0;
Thielicious


5

Просто зробіть це

$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

Я не знаю, яку версію Jquery ви використовуєте, але для мене це працює у jquery 1.3:

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

Тоді ви можете отримати доступ до клавіш масиву POST, як це зазвичай робиться у php. Просто спробуйте з print_r().

Я думаю, ви переносите значення серіалізованої форми у властивість об'єкта, що, наскільки я знаю, марно.

Сподіваюся, це допомагає!


1

Це у відповідь на користувача1256561. Дякую за вашу ідею .. однак я не подбав про речі декодування URL-адреси, згадані в step3.

тому ось код php, який буде декодувати дані серіалізованої форми, якщо хтось ще потребує цього. До речі, використовуйте цей код на власний розсуд.

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

Введення даних про URL-адресу буде таким: attribute1 = value1 & attribute2 = value2 & attribute3 = value3 тощо

Вихід з вищевказаного коду все ще буде в масиві, і ви можете змінити його, щоб присвоїти йому будь-яку змінну, яку ви хочете, і це залежить від того, як ви хочете далі використовувати ці дані.

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

1

Вам просто потрібно ім'я атрибута значень у формі. Приклад:

Форма

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


0

Я думаю, що вам потрібно відокремити назви форм від її значень, один спосіб зробити це - вибухнути (&)так, що ви отримаєте attribute=value,attribute2=value.

Думаю, що ви перетворите серіалізовану рядок jQuery в масиви в PHP.

Ось кроки, які вам слід виконати, щоб бути більш конкретними.

  1. Передається серіалізовано jQueryна PHPсторінку (наприклад ajax.php), де ви використовуєте, $.ajaxщоб подати повідомлення за допомогою публікації чи отримання.
  2. Зі сторінки php вибухніть (&)таким чином, розділяючи кожен атрибут. Тепер ви отримаєте attribute1 = value, attribute2 = value, тепер ви отримаєте змінну php масиву. напр$data = array("attribute1=value","attribute2=value")
  3. Зробіть foreachна $dataі , так що ви можете відокремити атрибут від значення, і переконайтеся , що значення , так що вона буде перетворювати серіалізовані значення до значення , яке вам потрібно, і вставити атрибут і його значення нової змінної масиву, який зберігає атрибут та значення серіалізованого рядка.explode(=)urldecode

Повідомте мене, якщо вам потрібні додаткові роз'яснення.


0

Ви можете використовувати цю функцію:

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

Як ним користуватися

$_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
post_unserialize( 'serialized_data' );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.