JavascriptからPHPファイルにデータを渡します。
JavascriptファイルからPHPファイルにデータ(JSON)を渡してから、何かを返そうとしています。私はすでにPHP関数file_get_contents('php:// input')を試しましたが、残念ながら、使用しているシステムでは許可されていません。ただし、Curlは許可されているので、cURLを使用して実行しようとしています。
残念ながら、正しく機能しません。
JSコード:
var data = {
'name': 'kevin'
};
var sendable = JSON.stringify(data);
console.log(sendable);
var request = new XMLHttpRequest();
request.open("POST", "http://192.168.64.2/testJsRequest.php", true);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
// $loggable = JSON.parse(request.responseText);
// $name = $loggable['name'];
console.log("RESPONSE " + (request.responseText));
}
}
request.send(sendable);
答え :
解決策:
JavaScriptは良さそうです。 サーバー側では、cURLを使用したくありません。 CURLは、クライアントからではなく、他のサーバーから応答を取得するためのものです。
これがあなたの例で動作するはずのPHPスクリプトの例です:
<?php
header('Content-type: application/json');
$data = json_decode(file_get_contents('php://input'));
$msg = 'Hello ' . $data->name . '. Nice to meet you.';
echo json_encode(['name' => 'david', 'msg' => $msg]);
?>
この例では、JSONでエンコードされたオブジェクトを応答として送り返しています。テキスト文字列だけでなくJSONをやり取りしたいとおっしゃっていたので、これを行いました。これに対応するには、JavaScriptを少し変更する必要があります:
var data = {
'name': 'kevin'
};
var sendable = JSON.stringify(data);
console.log(sendable);
var request = new XMLHttpRequest();
request.open("POST", "192.168.64.2/testJsRequest.php", true);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
console.log("RESPONSE: " + JSON.parse(request.responseText).msg);
}
}
request.send(sendable);
ここから取得する方法を知っているようですが、さらにサポートが必要な場合はコメントを残してください。
したがって、PHPスクリプトでは$ dataに、JSONにエンコードされ、POST経由で送信された完全なデータ構造が含まれます。javascriptでは、 data = JSON.parse(request.responseText)
を使用してすべてのデータを取得できます。 PHPから返送されました。
編集して、ファイルシステムへの直接アクセスが制限されているシステムでPOSTを使用する例を追加します。
Mozilla docs によると、XMLHttpRequestを使用してデータを送信する方法は2つあります。AjaxのみとFormData APIを使用する方法と、FormDataオプションの欠点はデータをJSON( JSON.stringify())。私たちが関心を持っているFormDataAPIの利点は、PHPがこの方法で送信されたデータから$ _GET、$ _ POST、$_REQUESTスーパーグローバルにデータを入力することです。 FormDataAPIを介してJSONを送信する簡単な回避策も考えられます。
FormData APIを通常使用する最初の例:
var data = {
'name': 'kevin'
};
var sendable = new FormData();
for ( var key in data ) {
sendable.append(key, data[key]);
}
console.log(sendable);
var request = new XMLHttpRequest();
request.open("POST", "192.168.64.2/testJsRequest.php", true);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
console.log("RESPONSE: " + JSON.parse(request.responseText).msg);
}
}
request.send(sendable);
sendableはFormDataオブジェクトになり、appendメソッドを使用してキーと値のペアを追加します。 MozillaにはFormDataに関するすべての詳細があります。ここでの問題は、複雑なネストされたデータを送信できないことです。
注:同じキーで複数の値を追加するだけで、単純なインデックス付き配列を作成できます。
PHP側では、次のようになります。
<?php
header('Content-type: application/json');
$msg = 'Hello ' . $_POST['name'] . '. Nice to meet you.';
echo json_encode(['name' => 'david', 'msg' => $msg]);
?>
JSONを使用してより複雑なデータを送信するには、次のようにします。
var data = {
'names': ['kevin', 'david']
};
var json_str = JSON.stringify(data);
var sendable = new FormData();
sendable.append('data', json_str);
console.log(sendable);
var request = new XMLHttpRequest();
request.open("POST", "192.168.64.2/testJsRequest.php", true);
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
console.log("RESPONSE: " + JSON.parse(request.responseText).msg);
}
}
request.send(sendable);
対応するPHPは次のようになります:
<?php
header('Content-type: application/json');
$data = json_decode($_POST['data']);
$msg = 'Hello ' . $data->names[0] . '. Nice to meet you.';
echo json_encode(['name' => 'david', 'msg' => $msg]);
?>
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。