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_data
valore è impostato su 0
.
Inoltre, poiché sto inviando una application/json
richiesta, 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/json
richiesta (di nuovo, perché ??).
OPZIONE 1:
Modifica il php.ini
file 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-Type
richiesta di AJAX in application/x-www-form-urlencoded
o multipart/form-data
farà popolare PHP $_POST
dal corpo POST (perché PHP piace / riconosce quelle content-type
intestazioni !?).
OPZIONE 4: ULTIMO RESORT
Bene, non volevo cambiare il Content-Type
di 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 0
e, in tal caso, modifico il php.ini
file 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;
}