ขออภัยคำตอบของ @EatOng ที่นี่ไม่ถูกต้องไม่ถูกต้องหลังจากอ่านคำตอบของเขาฉันได้เพิ่มตัวแปรจำลองให้กับคำขอ AJAX ทุกรายการที่ฉันกำลังเริ่มทำงาน (แม้ว่าบางส่วนจะมีฟิลด์อยู่แล้วก็ตาม) เพื่อให้แน่ใจว่าข้อผิดพลาดจะไม่ปรากฏขึ้น
แต่ตอนนี้ฉันเจอข้อผิดพลาดเดียวกันจาก PHP ฉันยืนยันอีกครั้งว่าฉันได้ส่งข้อมูล POST ไปแล้ว (ช่องอื่น ๆ พร้อมกับตัวแปรจำลองด้วย) รุ่น PHP 5.6.25
, always_populate_raw_post_data
ค่าถูกตั้งค่าให้0
ค่าถูกตั้งค่าให้
นอกจากนี้ในขณะที่ฉันส่งapplication/json
คำขอ PHP จะไม่เติมข้อมูลให้$_POST
แต่ฉันต้องไปjson_decode()
ที่เนื้อหาคำขอ POST แบบดิบซึ่งเข้าถึงได้โดยphp://input
.
ดังคำตอบโดย @ rr- อ้างอิง
0 / ปิด / อะไรก็ตาม: พฤติกรรม BC (เติมข้อมูลหากไม่ได้ลงทะเบียนชนิดเนื้อหาหรือวิธีการร้องขอเป็นวิธีอื่นที่ไม่ใช่ POST )
เนื่องจากวิธีการขอเป็น POST อย่างแน่นอนฉันเดาว่า PHP ไม่รู้จัก / ชอบไฟล์ Content-Type: application/json
คำขอ (อีกแล้วทำไม ??)
ตัวเลือกที่ 1:
แก้ไขphp.ini
ไฟล์ด้วยตนเองและตั้งค่าตัวแปรผู้ร้ายเป็น-1
ตามที่หลาย ๆ คำตอบแนะนำ
ตัวเลือก 2:
นี่คือบั๊ก PHP 5.6 อัปเกรด PHP
ตัวเลือก 3:
ตามที่ @ user9541305 ตอบไว้ที่นี่การเปลี่ยนContent-Type
คำขอ AJAX เป็นapplication/x-www-form-urlencoded
หรือmultipart/form-data
จะทำให้ PHP เติมข้อมูล$_POST
จากเนื้อหา POSTed (เพราะ PHP ชอบ / รู้จักcontent-type
ส่วนหัวเหล่านั้น!?)
ตัวเลือกที่ 4: รีสอร์ทสุดท้าย
ฉันไม่ต้องการเปลี่ยนContent-Type
AJAX มันจะทำให้เกิดปัญหามากในการดีบั๊ก (Chrome DevTools ดูตัวแปร POSTed ของคำขอ JSON เป็นอย่างดี)
ฉันกำลังพัฒนาสิ่งนี้สำหรับลูกค้าและไม่สามารถขอให้พวกเขาใช้ PHP ล่าสุดหรือแก้ไขไฟล์ php.ini เป็นทางเลือกสุดท้ายฉันจะตรวจสอบว่าตั้งค่าเป็นหรือไม่0
และถ้าเป็นเช่นนั้นให้แก้ไขไฟล์php.ini
ไฟล์ในสคริปต์ PHP ของฉันเอง แน่นอนฉันจะต้องขอให้ผู้ใช้รีสตาร์ท apache น่าเสียดายจัง!
นี่คือโค้ดตัวอย่าง:
<?php
if(ini_get('always_populate_raw_post_data') != '-1')
{
// Get the path to php.ini file
$iniFilePath = php_ini_loaded_file();
// Get the php.ini file content
$iniContent = file_get_contents($iniFilePath);
// Un-comment (if commented) always_populate_raw_post_data line, and set its value to -1
$iniContent = preg_replace('~^\s*;?\s*always_populate_raw_post_data\s*=\s*.*$~im', 'always_populate_raw_post_data = -1', $iniContent);
// Write the content back to the php.ini file
file_put_contents($iniFilePath, $iniContent);
// Exit the php script here
// Also, write some response here to notify the user and ask to restart Apache / WAMP / Whatever.
exit;
}