ฉันจะ PHP ยกเลิกการตั้งค่าแบบฟอร์มต่อเนื่อง jQuery ได้อย่างไร


160

ใช้$('#form').serialize()ฉันสามารถส่งสิ่งนี้ผ่านไปยังหน้า PHP ตอนนี้ฉันจะ unserialize ใน PHP ได้อย่างไร มันต่อเนื่องใน jQuery


2
สำหรับคำถามเช่นนี้ฉันขอแนะนำให้ใช้ Firebug เพื่อดูว่าข้อมูลใดในรูปแบบที่ส่งไปยังเซิร์ฟเวอร์ จากนั้นคุณสามารถโพสต์ตัวอย่างข้อมูลของคุณได้อย่างง่ายดาย
chiborg

คำตอบ:


65

คุณไม่ควรทำการ unserialize อะไรใน PHP ด้วยserializeวิธีjquery หากคุณทำให้ข้อมูลเป็นอนุกรมคุณควรส่งไปยัง PHP เป็นพารามิเตอร์การสืบค้นหากคุณใช้เมธอด GET ajax หรือ post vars ถ้าคุณใช้ POST ajax ดังนั้นใน 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 ($ เอาท์พุท);
Andy

2
วิธีนี้ดีกว่าวิธีอื่นมาก
dartacus

3
ในฐานะผู้ใช้ที่ให้คำตอบที่ยอมรับฉันยอมรับว่านี่เป็นคำตอบที่ถูกต้อง ฉันให้คำตอบตามข้อสันนิษฐานว่าคำขอถูกส่งผ่านวิธี jQuery ajax $ .get / post (ไม่แน่ใจว่าจะได้รับจากที่ใด) ซึ่งจะส่งเอาต์พุตของฟังก์ชัน serialize () เป็นตัวแปร GET มาตรฐาน ดังนั้นจึงไม่จำเป็นต้องแยกสตริง เช่น $ .get ('ajax.php', $ ('form'). serialize (), function () {});
Chris Gutierrez

1
นี่เป็นคำตอบเดียวเท่านั้นที่ยอมรับได้ !! คำตอบที่เหลือคือการทำสิ่งต่าง ๆ มากเกินไป ...
Mr.TK

1
นี่ควรเป็นคำตอบ เนื่องจากเซิร์ฟเวอร์อาจไม่ยอมรับค่าอินพุตมากกว่า 1,000 ค่าฉันจึงต้องการวิธีส่งต่อไป ดังนั้นฉันจึงทำให้ฟอร์มเป็นอนุกรมและส่งข้อมูลเป็นค่าเดียว ด้วยคำตอบนี้ฉันก็สามารถทำได้ ขอบคุณ @chrisallenlane
websupporter

51

// jQuery Post

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

// jquery.post ต่อเนื่องรูปแบบ var - TO - PHP Array

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


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

นี่คือการตอบกลับไปยัง user1256561 ขอบคุณสำหรับความคิดของคุณ .. แต่ฉันยังไม่ได้ดูแลสิ่งถอดรหัส url ที่กล่าวถึงในขั้นตอนที่ 3

ดังนั้นนี่คือรหัส 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>

จาวาสคริ

$(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' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.