Làm cách nào để PHP-unserialize một dạng tuần tự hóa jQuery?


160

Sử dụng $('#form').serialize(), tôi đã có thể gửi nó đến một trang PHP. Bây giờ làm thế nào để tôi hủy kích hoạt nó trong PHP? Nó được tuần tự hóa trong jQuery.


2
Đối với những câu hỏi như thế này, tôi khuyên bạn nên sử dụng Fireorms để xem dữ liệu nào ở định dạng được gửi đến máy chủ. Sau đó bạn có thể dễ dàng đăng một ví dụ về dữ liệu của bạn.
chiborg

Câu trả lời:


65

Bạn không cần phải hủy kích hoạt bất cứ thứ gì trong PHP từ serializephương thức jquery . Nếu bạn tuần tự hóa dữ liệu, nó sẽ được gửi đến PHP dưới dạng tham số truy vấn nếu bạn đang sử dụng yêu cầu ajax phương thức GET hoặc đăng vars nếu bạn đang sử dụng yêu cầu POST ajax. Vì vậy, trong PHP, bạn sẽ truy cập các giá trị như $_POST["varname"]hoặc $_GET["varname"]tùy thuộc vào loại yêu cầu.

Các serializephương pháp chỉ mất các yếu tố hình thức và đặt chúng ở dạng chuỗi."varname=val&var2=val2"


3
Điều này là không đúng. Bạn thực sự cần phải phân tích chuỗi serializetrả về. Xem câu trả lời thực sự phổ biến dưới đây.
Isaac Lubow

392

Với điều kiện là máy chủ của bạn đang nhận được một chuỗi trông giống như thế này (sẽ như vậy nếu bạn đang sử dụng jQuery serialize()):

"param1=someVal&param2=someOtherVal"

... một cái gì đó như thế này có lẽ là tất cả những gì bạn cần:

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

$paramssau đó sẽ là một mảng được mô hình hóa như bạn mong đợi. Lưu ý điều này cũng hoạt động với mảng HTML.

Xem phần sau để biết thêm thông tin: http://www.php.net/manual/en/feft.parse-str.php

Hy vọng điều đó hữu ích. Chúc may mắn!


5
Đó là cách tốt nhất để làm điều đó. parse_str ($ _ REQUEST ['jquery_serialized_values'], $ output); print_r ($ đầu ra);
Andy

2
Phương pháp này NHIỀU hơn phương pháp kia.
dartacus

3
Là người dùng đã đưa ra câu trả lời được chấp nhận, tôi đồng ý rằng ĐÂY là câu trả lời đúng. Tôi đã đưa ra câu trả lời của mình dựa trên giả định rằng yêu cầu được gửi thông qua các phương thức jQuery ajax $ .get / post (không chắc là tôi đã nhận được từ đâu), nó sẽ gửi đầu ra của hàm serialize () dưới dạng các biến GET tiêu chuẩn. vì vậy không cần phân tích cú pháp chuỗi. ví dụ: $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutierrez

1
Đây là một và chỉ có câu trả lời chấp nhận được !! Phần còn lại của câu trả lời là làm quá nhiều việc ...
Mr.TK

1
Đây nên là câu trả lời. Vì máy chủ có thể không chấp nhận hơn 1000 giá trị đầu vào, nên tôi vẫn cần một cách để gửi chúng. Vì vậy, tôi đã tuần tự hóa biểu mẫu và đã gửi dữ liệu dưới dạng một giá trị. Với câu trả lời này, tôi đã có thể làm như vậy. Cảm ơn @chrisallenlane
hỗ trợ web 10/03/2015

51

// Bài viết jQuery

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

// jquery.post định dạng var - TO - PHP Array

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

// Bạn nhận được bất kỳ điều tương tự

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

Đó chính xác là những gì tôi đang tìm kiếm!
Jepser Bernardino


10

Trong trang 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>

trên trang PHP :

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

trên mã php này, f1trường trả về .


5

Tại sao không sử dụng mảng kết hợp, vì vậy bạn có thể sử dụng nó dễ dàng

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

    return $returndata;
}

Trân trọng


4
Tôi không nhận được của bạn$i = 0;
Thielicy

5

Murtaza Hussain đã sửa đổi câu trả lời:

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

5

Đơn giản chỉ cần làm điều này

$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

Tôi không biết bạn đang sử dụng phiên bản nào của Jquery, nhưng phiên bản này hoạt động với tôi trong jquery 1.3:

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

Sau đó, bạn có thể truy cập các khóa mảng POST như bạn thường làm trong php. Chỉ cần thử với a print_r().

Tôi nghĩ rằng bạn đang gói giá trị biểu mẫu nối tiếp trong thuộc tính của đối tượng, điều này là vô ích theo như tôi biết.

Hi vọng điêu nay co ich!


1

Đây là trả lời cho người dùng1256561. Cảm ơn ý tưởng của bạn .. tuy nhiên tôi đã không quan tâm đến công cụ giải mã url được đề cập trong bước 3.

Vì vậy, đây là mã php sẽ giải mã dữ liệu biểu mẫu tuần tự, nếu có ai cần nó. Nhân tiện, sử dụng mã này theo ý của bạn.

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

Đầu vào dữ liệu bài đăng url sẽ như sau: property1 = value1 & property2 = value2 & property3 = value3, v.v.

Đầu ra của mã ở trên sẽ vẫn ở trong một mảng và bạn có thể sửa đổi nó để được gán cho bất kỳ biến nào bạn muốn và nó phụ thuộc vào cách bạn muốn sử dụng dữ liệu này hơn nữa.

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

1

Bạn chỉ cần tên thuộc tính giá trị trong mẫu. Thí dụ :

Hình thức

<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

Sử dụng:

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

Php lấy mảng, không cần unserialize;)


0

Tôi nghĩ bạn cần tách tên biểu mẫu khỏi các giá trị của nó, một phương pháp để làm điều này là phát nổ (&)để bạn sẽ nhận được attribute=value,attribute2=value.

Quan điểm của tôi ở đây là bạn sẽ chuyển đổi chuỗi jQuery được tuần tự hóa thành các mảng trong PHP.

Dưới đây là các bước mà bạn nên làm theo để được cụ thể hơn.

  1. Đã chuyển qua tuần tự jQueryđến một PHPtrang (ví dụ ajax.php) nơi bạn sử dụng $.ajaxđể gửi bằng cách sử dụng bài đăng hoặc nhận.
  2. Từ trang php của bạn, hãy phát nổ (&)để phân tách từng thuộc tính. Bây giờ bạn sẽ nhận được property1 = value, property2 = value, bây giờ bạn sẽ nhận được một biến mảng php. ví dụ$data = array("attribute1=value","attribute2=value")
  3. Thực hiện foreachtrên $dataexplodecác (=)để bạn có thể tách các thuộc tính từ giá trị, và hãy chắc chắn urldecode giá trị để nó sẽ chuyển đổi các giá trị đăng với giá trị mà bạn cần, và chèn các thuộc tính và giá trị của nó cho một biến mảng mới, lưu trữ thuộc tính và giá trị của chuỗi nối tiếp.

Hãy cho tôi biết nếu bạn cần làm rõ hơn.


0

Bạn có thể sử dụng chức năng này:

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

Làm thế nào để sử dụng nó

$_POST['serialized_data'] = 'var1=1&var2=2&var3=3';
post_unserialize( 'serialized_data' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.