2017-08-23 26 views
0

私はフォームデータからオブジェクトの配列を構築して、処理スクリプトに送信してから、そのデータをAPIに送信します。 APIはCORS ajax要求を許可しないため、まず外部スクリプトに送信する必要があります。Ajax - jQueryを使用してオブジェクトの配列を送信する

私は単純な文字列を返すことができますが、私が持っているデータを文字列化すると、サーバーからの応答は常にPOSTまたはGET(両方試しました)データが空の配列になっています。

JS

$('#enrol').submit(function(e) { 
    e.preventDefault(); 

    var collection = []; 

    $('#enrol .form-row').each(function() { 
     var email = $(this).find('input[type="email"]').val(); 
     var c1Val = $(this).find('.c1').is(':checked') ? 'true' : 'false'; 
     var c2Val = $(this).find('.c2').is(':checked') ? 'true' : 'false'; 
     var c3Val = $(this).find('.c3').is(':checked') ? 'true' : 'false'; 
     var c4Val = $(this).find('.c4').is(':checked') ? 'true' : 'false'; 
     var c5Val = $(this).find('.c5').is(':checked') ? 'true' : 'false'; 
     var c6Val = $(this).find('.c6').is(':checked') ? 'true' : 'false'; 
     var c7Val = $(this).find('.c7').is(':checked') ? 'true' : 'false'; 

     var person = { 
      'email' : email, 
      'course1' : c1Val, 
      'course2' : c2Val, 
      'course3' : c3Val, 
      'course4' : c4Val, 
      'course5' : c5Val, 
      'course6' : c6Val, 
      'course7' : c7Val, 
     } 
     collection.push(person); 

    }); 

    var dataString = JSON.stringify(collection); 

    $.ajax({ 
     url: 'http://www.example.com/script.php', 
     data: dataString, 
     crossDomain: true, 
     success: function(response) { 
      console.log(response); 
     }, 
     error: function(response) { 
      console.log(response); 
      alert(response.responseText); 
     } 
    }); 
}) 

PHP私はちょうど、私は単純な文字列データが返さ取得するには、まだ配列がJSON.stringify場合

header("Access-Control-Allow-Origin: URLHERE"); 
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); 

var_dump($_GET); 

私は何を得ることはありませんことですオブジェクトの空の配列として、PHPスクリプトに到着するようだ - または少なくともconsole.logが示唆しているものです。 dataString変数を出力して、データがあることを確認しました。

+1

__I__が得られないものは何ですか? –

+0

このビット - "私は単純な文字列を返すことができますが、私が持っているデータを文字列化すると、サーバーからの応答は常にPOSTまたはGET(両方試してみた)データが空の配列にすぎません。 – DJC

+2

stringifyを使わないで 'data:{mydata:collection} 'を試しました – RiggsFolly

答えて

0

ソリューションは、私はポスト配列のキーを提供していなかった、シンプルなものだった -

data: dataString 

data: { data: dataString } 

されている必要があります次にvar_dump($_GET['data'))の出力は、私が送信されたデータが含まれていました。

0

私自身のプロジェクトでも同様のことがあります。 これは私の作品:

jsonObj = new Object(); 
jsonObj['email'] = email; 
jsonObj['course1'] = c1Val; 
. 
. 
. 

$.ajax({ 
      type: 'POST', 
      url: 'http://www.example.com/script.php', 
      data: {"data": JSON.stringify(jsonObj)}, 
      dataType:'JSON', 
      cache: false, 
. 
. 
. 
}); 

PHP:データはJSON形式で到着したときに

var_dump($_REQUEST['data']); 
+0

'dataType'引数はこの文脈で何もしません。jQueryにサーバーが返すデータの種類を教えます。 jQueryによってデータがどのように送信されるか、PHPによって受信される方法は何も変更されません。 '{" data ":JSON.stringify(jsonObj)}'を使用することで、JSONは送信せず、クエリ文字列を送信することができます。ブラウザコンソールを開いて何がサーバに送られたのかを見ると、 'data =" "'というJSON構造体ではありません。 – BeetleJuice

+0

@BeetleJuice ..この文脈では、dataType引数については正しいですね。 しかし、この問題はまだ修正されているはずです...まだJSON - > $ _REQUEST ['data']は有効なjsonであり、デコードしてさらに処理することができます。 – toffler

+0

はい、そうです。 – BeetleJuice

0

PHPは自動的にスーパーグローバル$_GET$_POSTを埋めることはありません。 jQueryの側で手動入力をキャプチャ

  • PHPデータ構造にそれをJSON-デコード

    // capture your raw JSON 
    $datastring = file_get_contents("php://input"); 
    // decode it into a PHP array 
    $collectionArray = json_decode($datastring, true); 
    
    1. :あなたは、PHP側の2つのことを行う必要があります以下のものは必要ないかもしれませんが、私はサーバーに送信されるコンテンツのタイプについて明示的になります:

      $.ajax({ 
          url: 'http://www.example.com/script.php', 
          data: dataString, 
          contentType : "application/json", 
          ... 
      
    関連する問題