Як я можу 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.