Leider ist diese Antwort hier von @EatOng nicht korrekt . Nachdem ich seine Antwort gelesen hatte, fügte ich jeder AJAX-Anfrage, die ich auslöste, eine Dummy-Variable hinzu (auch wenn einige bereits Felder hatten), um sicherzugehen, dass der Fehler nie auftritt.
Aber gerade jetzt bin ich auf den gleichen verdammten Fehler von PHP gestoßen. Ich habe doppelt bestätigt, dass ich einige POST-Daten gesendet habe (einige andere Felder zusammen mit der Dummy-Variablen). PHP-Version 5.6.25
, always_populate_raw_post_data
Wert ist auf gesetzt0
.
Während ich eine application/json
Anfrage sende , füllt PHP sie nicht an $_POST
, sondern muss an json_decode()
den POST-Anfragetext, auf den über zugegriffen werden kann php://input
.
Wie die Antwort von @ rrcites lautet,
0 / aus / was auch immer: BC-Verhalten (füllen, wenn der Inhaltstyp nicht registriert ist oder die Anforderungsmethode nicht POST ist ).
Da die Anforderungsmethode sicher POST ist, hat PHP meine wohl nicht erkannt / gemocht Content-Type: application/json
Anfrage gemocht (wieder, warum?).
OPTION 1:
Bearbeiten Sie die php.ini
Datei manuell und setzen Sie die Tätervariable auf-1
, wie viele der Antworten hier vermuten lassen.
OPTION 2:
Dies ist ein PHP 5.6-Fehler. Aktualisieren Sie PHP.
OPTION 3:
Wie @ user9541305 hier antwortete, führt das Ändern der Content-Type
AJAX-Anforderung zu application/x-www-form-urlencoded
oder multipart/form-data
führt dazu, dass PHP $_POST
den POST-Text ausfüllt (weil PHP diese content-type
Header mag / erkennt !?).
OPTION 4: LETZTE RESORT
Nun, ich wollte das Content-Type
von AJAX nicht ändern , es würde eine Menge Probleme beim Debuggen verursachen. (Chrome DevTools zeigt die POST-Variablen von JSON-Anforderungen gut an.)
Ich entwickle dieses Ding für einen Client und kann ihn nicht bitten, das neueste PHP zu verwenden oder die Datei php.ini zu bearbeiten. Als letzten Ausweg werde ich nur prüfen, ob es eingestellt ist, 0
und wenn ja, das bearbeitenphp.ini
Datei in meinem PHP-Skript selbst . Natürlich muss ich den Benutzer bitten, Apache neu zu starten. Schade!
Hier ist ein Beispielcode:
<?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;
}