Sfortunatamente, questa risposta qui da @EatOng non è corretta . Dopo aver letto la sua risposta ho aggiunto una variabile fittizia a ogni richiesta AJAX che stavo sparando (anche se alcune di esse avevano già dei campi) solo per essere sicuro che l'errore non comparisse mai.
Ma proprio ora mi sono imbattuto nello stesso dannato errore di PHP. Ho confermato due volte di aver inviato alcuni dati POST (anche altri campi insieme alla variabile fittizia). Versione PHP 5.6.25, il always_populate_raw_post_datavalore è impostato su 0.
Inoltre, poiché sto inviando una application/jsonrichiesta, PHP non la popola $_POST, piuttosto devo al json_decode()corpo della richiesta POST grezzo, accessibile da php://input.
Come risposta di @ rr- cites,
0 / off / qualunque cosa: comportamento BC (compilare se il tipo di contenuto non è registrato o il metodo di richiesta è diverso da POST ).
Poiché il metodo di richiesta è sicuramente POST, immagino che PHP non abbia riconosciuto / apprezzato la mia Content-Type: application/jsonrichiesta (di nuovo, perché ??).
OPZIONE 1:
Modifica il php.inifile manualmente e imposta la variabile colpevole su -1, come suggeriscono molte delle risposte qui.
OPZIONE 2:
Questo è un bug PHP 5.6. Aggiorna PHP.
OPZIONE 3:
Come ha risposto @ user9541305 qui, cambiando la Content-Typerichiesta di AJAX in application/x-www-form-urlencodedo multipart/form-datafarà popolare PHP $_POSTdal corpo POST (perché PHP piace / riconosce quelle content-typeintestazioni !?).
OPZIONE 4: ULTIMO RESORT
Bene, non volevo cambiare il Content-Typedi AJAX, avrebbe causato molti problemi per il debug. (Chrome DevTools visualizza bene le variabili POST delle richieste JSON.)
Sto sviluppando questa cosa per un cliente e non posso chiedergli di usare l'ultima versione di PHP, né di modificare il file php.ini. Come ultima risorsa, controllerò solo se è impostato su 0e, in tal caso, modifico il php.inifile nel mio script PHP stesso. Ovviamente dovrò chiedere all'utente di riavviare apache. Che peccato!
Ecco un codice di esempio:
<?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;
}