Rumah  >  Soal Jawab  >  teks badan

Tetapkan pembolehubah $_POST kepada kosong semasa menggunakan php://input untuk mendapatkan semuanya betul

Saya mencipta apl React yang daripadanya saya memanggil pelayan yang dibina pada PHP.

Begini cara saya memanggil fail PHP:

const requestOptions = {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: JSON.stringify({ name, username, password }),
};
console.log(requestOptions);

fetch('http://localhost/crud/requests/signup.php', requestOptions)
  .then(res => res.json())
  .then(data => console.log(data));

Ini yang saya ada dalam fail PHP:

if (isset($_POST) && !empty($_POST)) {
  // do something
}

Bila saya print $_POST 变量时,我得到一个空数组。甚至 $_RESPONSE ia juga kosong.

Tetapi apabila saya cuba mencetak aliran input seperti ini:

print_r(file_get_contents('php://input'));

Semuanya nampak baik. Bolehkah sesiapa menjelaskan mengapa ini berlaku? Saya cuba membacanya dalam dokumentasi dan mencari beberapa forum dan blog, tetapi tidak berpuas hati dengan jawapannya.

P粉032649413P粉032649413229 hari yang lalu328

membalas semua(1)saya akan balas

  • P粉718165540

    P粉7181655402024-03-28 13:41:16

    Sokongan borang terbina dalam PHP hanya boleh menghuraikan application/x-www-form-urlencoded 表单和 multipart/form-data 表单。您实际发送的是一个 JSON 序列化对象,其 MIME 类型为 application/x-www-form-urlencoded.

    Kepada sebenarnya hantarapplication/x-www-form-urlencoded表单,请使用URLSearchParams 而不是 JSON.stringify:

    fetch('http://localhost/crud/requests/signup.php', {
      method: 'POST',
      body: new URLSearchParams({ name, username, password }),
    })
    .then(res => res.json())
    .then(data => console.log(data));
    

    Dalam kes ini, tidak perlu menetapkan objek Content-Type浏览器会自动执行此操作。要发送 multipart/form-data 负载(如果您想上传较大的文件,您可能需要这样做),请使用 FormData secara eksplisit.

    Jika anda akhirnya mahu menghantar JSON, anda harus menghantarnya menggunakan jenis MIME yang betul dalam pengepala, application/json。在 PHP 方面,您将不得不使用 json_decode.

    balas
    0
  • Batalbalas