Niestety ta odpowiedź @EatOng nie jest poprawna . Po przeczytaniu jego odpowiedzi dodałem zmienną fikcyjną do każdego odpalanego żądania AJAX (nawet jeśli niektóre z nich miały już jakieś pola), aby mieć pewność, że błąd nigdy się nie pojawi.
Ale właśnie teraz natrafiłem na ten sam cholerny błąd z PHP. Podwójnie potwierdziłem, że wysłałem trochę danych POST (kilka innych pól wraz ze zmienną fikcyjną). Wersja PHP 5.6.25
, always_populate_raw_post_data
wartość jest ustawiona na 0
.
Ponadto, gdy wysyłam application/json
żądanie, PHP nie wypełnia go $_POST
, a raczej mam do json_decode()
surowej treści żądania POST, dostępnej przez php://input
.
Jako odpowiedź @ rr- cites,
0 / wył. / Cokolwiek: zachowanie BC (wypełnij, jeśli typ zawartości nie jest zarejestrowany lub metoda żądania jest inna niż POST ).
Ponieważ metoda żądania jest na pewno POST, myślę, że PHP nie rozpoznało / nie polubiło mojego Content-Type: application/json
żądania (znowu, dlaczego ??).
OPCJA 1:
Edytuj php.ini
plik ręcznie i ustaw zmienną winowajcy na-1
, zgodnie z sugestiami wielu odpowiedzi.
OPCJA 2:
To jest błąd PHP 5.6. Zaktualizuj PHP.
OPCJA 3:
Jak odpowiedział @ user9541305, zmiana Content-Type
żądania AJAX na application/x-www-form-urlencoded
lub multipart/form-data
spowoduje, że PHP $_POST
wypełni treść z postu POST (ponieważ PHP lubi / rozpoznaje te content-type
nagłówki !?).
OPCJA 4: OSTATNI RESORT
Cóż, nie chciałem zmieniać Content-Type
AJAX, spowodowałoby to wiele problemów przy debugowaniu. (Chrome DevTools ładnie wyświetla przesłane zmienne żądań JSON).
Tworzę to dla klienta i nie mogę poprosić go o użycie najnowszego PHP ani o edycję pliku php.ini. W ostateczności sprawdzę tylko, czy jest ustawiony na, 0
a jeśli tak, edytuję php.ini
plik w samym skrypcie PHP. Oczywiście będę musiał poprosić użytkownika o ponowne uruchomienie Apache. Jaka szkoda!
Oto przykładowy kod:
<?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;
}