2009-11-24 42 views
127

使用$('#form').serialize(),我可以將它發送到PHP頁面。現在我如何在PHP中反序列化它?它在jQuery中被序列化。如何PHP序列化一個jQuery序列化的表單?

+2

對於像這樣的問題,我建議使用Firebug來查看以什麼格式發送到服務器的數據。然後,您可以輕鬆發佈您的數據示例。 – chiborg

回答

57

你不應該從jquery serialize方法反序列化PHP中的任何東西。如果您序列化數據,則應將其作爲查詢參數發送到PHP,如果您使用的是GET方法ajax請求或POST vars(如果您使用的是POST ajax請求)。因此,在PHP中,您可以根據請求類型訪問$_POST["varname"]$_GET["varname"]等值。

serialize方法只是採用表單元素並將其放入字符串形式。 "varname=val&var2=val2"

+0

謝謝克里斯! –

+4

「was」* wink *;) – JohnnyQ

14
parse_str($_POST['whatever'], $searcharray); 
312

只要你的服務器接收一個字符串,看起來是這樣的(這是它應該,如果你使用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

這是做這件事的最好方法。 \t \t parse_str($ _ REQUEST ['jquery_serialized_values'],$ output); \t print_r($ output); – Andy

+66

這個答案應該被接受,實際的答案是沒有答案的。 – Ismael

+2

這種方法比其他方法好得多。 – dartacus

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()

我想你是在一個對象的屬性中包裝序列化的表單值,據我所知,這是毫無用處的。

希望這會有所幫助!

0

我認爲您需要將表單名稱與其值分開,一種方法是爆炸(&),以便您獲得attribute=value,attribute2=value

我的意思是,你將在PHP中將序列化的jQuery字符串轉換爲數組。

下面是您應該遵循的步驟,以便更具體。

  1. 傳承序列化jQueryPHP頁面(例如ajax.php),您使用$.ajax使用後提交或獲得 。
  2. 從你的php頁面中,爆炸(&)從而分離每個 屬性。現在你將得到屬性1 =值,屬性2 =值,現在 你將得到一個php數組變量。即摹$data = array("attribute1=value","attribute2=value")
  3. 請在$data一個foreachexplode(=)這樣就可以 從價值屬性分開,並且一定要urldecode 值,使其系列化值轉換爲需要的值 ,和將該屬性及其值插入到一個新的數組 變量中,該變量存儲該字符串的屬性和序列化值 。

讓我知道你是否需要更多的說明。

1

這回複用戶1256561。感謝您的想法..但是我沒有照顧在步驟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); 
} 

的網址後數據輸入將是這樣的:ATTRIBUTE1 =值1 & attribute2 =值2 & attribute3 =值3等的上面的代碼

輸出將仍處於陣列,並且可以修改它讓它分配給你想要的任何變量,這取決於你如何進一步使用這些數據。

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

// jQuery的帖子

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 
) 
+0

這正是我正在尋找的! –

3

爲什麼不使用關聯數組,所以你可以使用它asily

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

    return $returndata; 
} 

問候

+3

我不明白你的'$ i = 0;' – Thielicious

7

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場。

4

修改Murtaza Hussain答案:

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

你只需要值的形式屬性名稱。例如:

形式

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

只要做到這一點

 $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']);