2012-06-08 14 views
6

私はPOSTを使ってAJAX経由でPHPファイルにデータを送信しています。 文字列を送信するだけでうまくいきましたが、JSONでJSオブジェクトを送信し、PHP側でデコードする必要がありました。JQuery経由でJSONデータを送信するajax.post to PHP

コンソールで私のデータが正しく送信されているが、PHP側でjson_decodeがNULLを返すことがわかります。

私は次のことを試してみた:

this.getAbsence = function() 
{ 
    alert(JSON.stringify(this)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: JSON.stringify(this), 
     success : function(data){ 
      alert(data); 
     } 
    }); 
} 

PHP:

echo $_POST['data']; 
echo json_decode($_POST['data']); 
echo var_dump(json_decode($_POST['data'])); 

そして:

this.getAbsence = function() 
{ 
    alert(JSON.stringify(this)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: {'Absence' : JSON.stringify(this)}, 
     success : function(data){ 
      alert(data); 
     } 
    }); 
} 

PHP:

echo $_POST['Absence']; 
echo json_decode($_POST['Absence']); 
echo var_dump(json_decode($_POST['Absence'])); 

アラートはちょうど...すべてが大丈夫です

をチェックするためにそして、あなたが最初のコードでは、コード内で間違っていた

+0

イムそのことについて申し訳ありませんが、私はこれらの答えを試してみて、そしてそれらのすべてが権利はありませんでした...しかし、ええ、私は私の答えを見つけたもちろん - ではなく、私の意見私は答えが私を助けなかった理由を私がコメントしているなら私は助けます。もし私がすべての人が私がそれらを試して、そして正しい答えがすでに与えられているかどうか分からないなら、私はコメントしていません。 – SamiSalami

答えて

23

は、あなたがこれを使用していなければならないということです:-)いや通常の文字列が正しくエコーされたました。 PHPから引用

var_dump(json_decode(file_get_contents("php://input"))); //and not $_POST['data'] 

マニュアル

PHP://入力はあなたが要求本体から生のデータを読み取ることができます読み取り専用のストリームです。

あなたのケースでは、あなたの体にJSONを送信しているので、このストリームから読み込む必要があります。ポスト本体はURLエンコードされた形式ではないため、通常の方法は$_POST['field_name']で動作しません。

contentType: "application/json; charset=utf-8", 
url: "ajax/selectSingle.php?m=getAbsence", 
data: JSON.stringify({'Absence' : JSON.stringify(this)}), 

UPDATE::第二部で

は、あなたはこれを使用している必要があります

要求がコンテンツタイプapplication/jsonを持っている場合、PHPは文句を言わない要求を解析し、中にあなたのJSONオブジェクトを与えます$_POSTの場合は、生のHTTP本体から自分で解析する必要があります。 JSON文字列はfile_get_contents("php://input");を使用して取得されます。

あなたが$_POSTを使用すると、あなたはそれを作るだろうと取得する必要がある場合:

data: {"data":JSON.stringify({'Absence' : JSON.stringify(this)})}, 

そしてPHPで実行します。

$json = json_decode($_POST['data']); 
+0

ありがとうございました!最後にあなたの答えを試してみました^^私はちょっと混乱しています。なぜなら、AJAX呼び出しのJSONオブジェクトが$ _POSTからちょうどエコーされている例を読んでいるからです。しかし、本当にありがとうございます:) – SamiSalami

+0

うわー、もっと理解できます:) – SamiSalami

+0

upvoted for php:// input – wolfgang

0

シングルクオートは、PHPのjson_encodeのために有効でない、のための二重引用符を使用しますフィールド名と値の両方。

+0

すべてのデータがPOST要求の一部として転送され、JSONがJSON.stringify関数でフォーマットされているので、これはまったく関係がありません - 単一引用符はajax関数によって使用される設定を持つオブジェクト。 – Flygenring

+0

'data:{'不在:JSON.stringify(this)}' - ここでは、PHPは二重引用符で囲まれた' Absence 'を含むすべてのものを受け取ります。 – YemSalat

+0

いいえ、 "Absence"は指定されたjsonオブジェクトのプロパティではありません。$ _POST ['Absence']で取得するためには "Absence"と指定しています。プロパティではありません。 – SamiSalami

0

私には、あなたのAJAXオブジェクトを再フォーマットする必要があるようです。 url-propertyは、対象のphp-fileのURLでなければならず、投稿する必要のあるデータは、data-propertyのquery-stringの形式でなければなりません。 次はあなたが期待通りに動作するはずです:

this.getAbsence = function() { 
    var strJSONData = JSON.stringify(this); 
    alert(strJSONData); 
    jQuery.ajax({ 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    url: 'ajax/selectSingle.php', 
    data: 'm=getAbsence&Absence=' + strJSONData, 
    success: function(data) { 
     alert(data); 
    } 
    }); 
} 
+0

strJSONDataは正常に見えますが、空の文字列を取得しています。 "echo $ _GET ['Absence'];"、 "echo json_decode($ _ GET ['Absence']) POSTで試してみたのですが、Ajax経由でJSONオブジェクトを提出することに間違いがありますか?彼らはGET(url param)として提出されなければなりませんか? – SamiSalami

+0

'POST'リクエストで' $ _GET'変数にアクセスすると、空文字列が返されます。送信されたデータ([etc](http://php.net/manual/en/reserved.variables.request.php))にアクセスするには、 '$ _POST'または' $ _REQUEST'変数を使用することができます。 – Flygenring

+0

私はあなたに言ったようにPOSTも試しましたが、私は最初に試してみました。なぜならあなたはurl paramsのようなデータを提出しているからですが、私は誤解しているかもしれません。 ) – SamiSalami

0

は、私は、我々はまた、これを行うことができると思います。この

var vThis = this; 
    this.getAbsence = function() 
    { 
    alert(JSON.stringify(vThis)); 
    jQuery.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: JSON.stringify(vThis), 
     success : function(data){ 
     alert(data); 
     } 
    }); 
    } 

EDIT

を試してみてください!

var vThis = this; 
    this.getAbsence = function() 
    { 
    alert(JSON.stringify(vThis)); 
    jQuery.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "ajax/selectSingle.php?m=getAbsence", 
     data: vThis, 
     success : function(data){ 
     alert(data); 
     } 
    }); 
    } 

とPHPで

print_r($_POST); 
+0

関数本体のリファレンス 'this'は、関数が呼び出されたオブジェクトへの参照である必要があります。正確でかわいいコードや読み込み可能なコードでなくても動作するはずです – Flygenring

+1

yes 、アラートは機能しますが、jQuery.ajaxの 'this'は関数が呼び出されたオブジェクトへの参照にはなりません – Rishabh

+0

これはオブジェクトではないかもしれませんが、良い点はあります。これは直接使用された他の例を見てきたからです。あなたの2番目の提案はコンソールのエラーにつながります: "あまりにも多くの再帰" - 私のブラウザはまだ凍っていますx)print_r($ _ POST)による最初のもの "Array()" $ _POST ['data'] ist empty: -/ – SamiSalami

関連する問題