背景
PHPファイルで$_POST['']
を使い、フロント側からのデータを取ろうとした。fetch
でも使てみようかと思って使ってみたら、データはうまく取れなかった。調べたら、$_POST
は決めたデータしか取れないということが分かった。
結論から言うと、$_POST
はapplication/x-www-form-urlencoded
やmultipart/form-data
で送られたデータしか取得できない。
jQuery
はデフォルトでapplication/x-www-form-urlencoded 形式
のデータを送信している。$_POST
で受け取ることができる。
ajax.javascript
$.ajax({
url: "https://example.com/page/function/function.php",
type: "POST",
data: { id: id, password: password },
dataType: "json",
success: function(response) {
console.log(response);
}
});
一方、下記はContent-Type: application/json
を指定しているため、データはJSON 形式で送信され、$_POST
で受け取れない。
fetch修正前.javascript
fetch('https://example.com/page/function/function.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ id: id, password: password })
})
解決方法① JSファイルを直す。
$_POST
で受け取れる形にする。
fetch修正後.javascript
fetch('https://example.com/page/function/function.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
id: id,
password: password
})
})
解決方法② PHPファイルを直す。
file_get_contents("php://input")
とjson_decode
を使いJSONを受け取る。
fetch修正後.php
<?php
$data = json_decode(file_get_contents("php://input"), true);
$id = $data['id'] ?? null;
$password = $data['password'] ?? null;
?>