Thật không may, câu trả lời này ở đây của @EatOng là không đúng . Sau khi đọc câu trả lời của anh ấy, tôi đã thêm một biến giả vào mọi yêu cầu AJAX mà tôi đang kích hoạt (ngay cả khi một số trong số chúng đã có một số trường) chỉ để đảm bảo lỗi không bao giờ xuất hiện.
Nhưng vừa rồi tôi đã gặp phải lỗi tương tự từ PHP. Tôi đã xác nhận lại rằng tôi đã gửi một số dữ liệu POST (một số trường khác cũng như biến giả). Phiên bản PHP 5.6.25
, always_populate_raw_post_data
giá trị được đặt thành 0
.
Ngoài ra, khi tôi đang gửi một application/json
yêu cầu, PHP không đưa nó vào $_POST
, thay vào đó tôi phải đến json_decode()
phần thân yêu cầu POST thô, có thể truy cập bằng php://input
.
Như câu trả lời của @ rr- cites,
0 / off / anything: Hành vi BC (điền nếu loại nội dung chưa được đăng ký hoặc phương thức yêu cầu không phải là POST ).
Bởi vì phương thức yêu cầu chắc chắn là POST, tôi đoán PHP đã không nhận ra / thích Content-Type: application/json
yêu cầu của tôi (một lần nữa, tại sao ??).
LỰA CHỌN 1:
Chỉnh sửa php.ini
tệp theo cách thủ công và đặt biến thủ phạm thành -1
, như nhiều câu trả lời ở đây đề xuất.
LỰA CHỌN 2:
Đây là một lỗi PHP 5.6. Nâng cấp PHP.
LỰA CHỌN 3:
Như @ user9541305 đã trả lời ở đây, việc thay đổi Content-Type
yêu cầu AJAX thành application/x-www-form-urlencoded
hoặc multipart/form-data
sẽ làm cho PHP điền vào $_POST
từ phần thân POSTed (vì PHP thích / nhận ra những content-type
tiêu đề đó !?).
LỰA CHỌN 4: RESORT CUỐI CÙNG
Tôi không muốn thay đổi Content-Type
AJAX, nó sẽ gây ra rất nhiều rắc rối cho việc gỡ lỗi. (Công cụ dành cho nhà phát triển của Chrome xem tốt các biến ĐÃ ĐĂNG của các yêu cầu JSON.)
Tôi đang phát triển thứ này cho một khách hàng và không thể yêu cầu họ sử dụng PHP mới nhất, cũng như chỉnh sửa tệp php.ini. Phương án cuối cùng, tôi sẽ chỉ kiểm tra xem nó có được đặt thành không 0
và nếu có, hãy chỉnh sửa php.ini
tệp trong chính tập lệnh PHP của tôi. Tất nhiên tôi sẽ phải yêu cầu người dùng khởi động lại apache. Xấu hổ làm sao!
Đây là một mã mẫu:
<?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;
}