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_datawartość 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.iniplik 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-urlencodedlub multipart/form-dataspowoduje, że PHP $_POSTwypełni treść z postu POST (ponieważ PHP lubi / rozpoznaje te content-typenagłówki !?).
OPCJA 4: OSTATNI RESORT
Cóż, nie chciałem zmieniać Content-TypeAJAX, 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, 0a jeśli tak, edytuję php.iniplik 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;
}