フォームデータをphp関数に送信するajax呼び出しがあります。 contentType: 'application/json'
を使用することがベストプラクティスであることをよく読んだので、それも試してみたかったのです。しかし、残念ながら、スクリプトを使用しても何も返されません。それを削除すると、スクリプトは本来の動作を実行します。
理由は何か、そしてその理由は何か分かりますか?ありがとうございました!
$('#Form').submit(function(e) {
e.preventDefault();
var content = $(this).serialize() + "&ajax=1";
$.ajax('app/class/controller/contactForm.php', {
type: "POST",
//contentType: 'application/json',
dataType: 'json',
data: content,
success: function(result) {
console.log(result);
}
});
})
と私のPHP:
if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
echo json_encode(validateForm($_POST));
}
contentType: 'application/json'
を使用する場合、$_POST
が入力されていることに依存することはできません。 $_POST
は、フォームでエンコードされたコンテンツタイプに対してのみ入力されます。
そのため、次のようにPHP raw入力からデータを読み取る必要があります。
$input = file_get_contents('php://input');
$object = json_decode($input);
もちろん、application/json
を送信したい場合は、実際にはJSONを送信する必要がありますが、これは行っていません。オブジェクトのシリアル化をJSONに直接構築するか、次のようにする必要があります- jQueryを使用してフォームデータをJavaScriptオブジェクトに変換します -フォームからオブジェクトをシリアル化します。
正直なところ、フォームデータを扱っているので、application/json
を使用するユースケースはあまりないと思います。
参照するベストプラクティスは、サーバースクリプトがJSONのContent-Type
を「application/json」に設定することです。
Header('Content-Type: application/json; charset=UTF8');
これは、デフォルトのContent-Type
が送信され、多くの場合、キャッチオールtext/html
が送信され、クライアントの理解につながる可能性があるためです。
JQueryリクエストでContent-Typeを指定しない場合、jQueryが最も適切なものを決定します。ここでの問題は、POSTフォームを送信していたことです。このフォームの場合、 jQuery によって設定されるデフォルトのContent-Type
はapplication/x-www-form-urlencoded
です。これは、PHPデータをPOSTフィールドとしてデコードし、$_POST
に入力するように指示します。スクリプトは$_POST
からパラメーターを回復します。 (または多分$_REQUEST
)。
これをapplication/json
に変更すると、$_POST
にデータが入力されなくなり、受信スクリプト操作は予期していたパラメーターを受信できなくなり、操作が中断します。
したがって、次のいずれかを行う必要があります。
application/x-www-form-urlencoded; charset=UTF-8
に設定しますapplication/json; charset=UTF-8
に設定し、スクリプトを変更してPOSTストリームを解析し、JSONデータをデコードします。 この回答 を参照してください。3番目のオプションには、php://input
の- 適切な処理 が必要です。
PHPスクリプトはContent-Typeヘッダーを設定する必要があります。
if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
header('Content-Type: application/json');
echo json_encode(validateForm($_POST));
}