jQueryでシリアル化されたフォームをPHPでシリアル化解除するにはどうすればよいですか?


160

を使用して$('#form').serialize()、これをPHPページに送信することができました。PHPでシリアル化を解除するにはどうすればよいですか?jQueryでシリアル化されました。


2
このような質問については、Firebugを使用して、サーバーに送信されるデータの形式を確認することをお勧めします。その後、データの例を簡単に投稿できます。
サイボーグ

回答:


65

PHPでjquery serializeメソッドから何かを逆シリアル化する必要はありません。データをシリアライズする場合、GETメソッドのajaxリクエストを使用している場合はクエリパラメータとしてPHPに送信し、POSTのajaxリクエストを使用している場合はvarsを送信する必要があります。そのため、PHPでは、リクエストタイプ$_POST["varname"]などの値に$_GET["varname"]応じてアクセスします。

このserializeメソッドは、フォーム要素を受け取り、文字列形式で配置します。"varname=val&var2=val2"


3
これは誤りです。確かに、serialize返される文字列を解析する必要があります。以下の非常に人気のある回答をご覧ください。
Isaac Lubow

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']、$ output); print_r($ output);
アンディ

2
この方法は、他の方法よりもはるかに優れています。
dartacus

3
受け入れられた答えを出したユーザーとして、これが正しい答えであることには同意します。要求は、標準のGET変数としてserialize()関数の出力を送信するjQuery ajax $ .get / postメソッド(どこから取得したかは不明)を介して送信されているという仮定に基づいて回答しました。したがって、文字列の解析は必要ありません。例:$ .get( 'ajax.php'、$( 'form')。serialize()、function(){});
クリスグティエレス

1
これは唯一無二の答えです!! 残りの答えはやり過ぎです...
Mr.TK

1
これが答えです。サーバーは1000を超える入力値を受け入れない可能性があるため、とにかくそれらを送信する方法が必要でした。そのため、フォームをシリアル化し、データを1つの値として送信しました。この答えで、私はそうすることができました。ありがとう@chrisallenlane
websupporter

51

// jQuery Post

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

// jquery.postシリアル化された変数-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
 )

それがまさに私が探していたものです!
Jepser Bernardino 2012


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;
わかり


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

次に、PHPで通常行うようにPOST配列キーにアクセスできます。だけで試してくださいprint_r()

シリアル化されたフォームの値をオブジェクトのプロパティでラップしていると思いますが、これは私が知る限りでは役に立ちません。

お役に立てれば!


1

これはuser1256561への返信です。あなたのアイデアをありがとう..しかし、私はステップ3で言及されたurlデコードのものを処理していません。

だから、他の誰かがそれを必要とするなら、シリアライズされたフォームデータをデコードする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;
}
?>

1

使用する:

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

PHPは配列を取得します。アンシリアライズする必要はありません;)


0

フォーム名をその値から分離する必要があると思います。これを行う1つの方法は、(&)を取得するために分解することです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' );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.