(PHP-Script) Wieso funktioniert das einmal und einmal nicht?
Hab mal eine Frage zu einer Formular-PHP-aus-einer-json-Datei-auslese-und-wieder-eintrag Funktion, die ich versuche genauer zu verstehen. Genauer gesagt komm ich da an einer Stelle nicht weiter (weil sich Teile der Funktion scheinbar komplett willkürlich verhält!)
Also wenn ich in PHP eine Funktion in der Struktur hier habe:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$params = [
"p1" => isset($_POST['p1']) ? $_POST['p1'] : null,
"p2" => isset($_POST['p2']) ? $_POST['p2'] : null,
"p3" => isset($_POST['p3']) ? $_POST['p3'] : null,
"p4" => isset($_POST['p4']) ? $_POST['p4'] : null,
// A_settings
"P5" => [
"SP1" => $_POST['P1'],
"SP2" => $_POST['P2'],
],
];
und der Inhalt der auszulesenden json Datei so aussieht:
{
"p1": "antwort1",
"p2": "antwort2",
"p3": "antwort3",
"p4": "antwort4",
"self": {
"P5": {
"SP1": antwort5,
"SP2": antwort6
}
}
}
klappt scheinbar alles hervorragend. Die Parameter werden gefunden und nach dem Absenden des Formulars korrekt überschrieben.
Wenn ich allerdings wie im folgenden Beispiel etwas mehr Parameter hinzufüge wie in dieser Struktur hier und für die Benennung etwas längere Namenschemen verwende:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$params = [
/// calculation nr1:
"Self.P1" => isset($_POST['Self.P1']) ? $_POST['Self.P1'] : null,
"Self.P2" => isset($_POST['Self.P2']) ? $_POST['Self.P2'] : null,
"Self.P3" => isset($_POST['Self.P3']) ? $_POST['Self.P3'] : null,
"Self.P4" => isset($_POST['Self.P4']) ? $_POST['Self.P4'] : null,
.....
"Self.P18" => isset($_POST['Self.P18']) ? $_POST['Self.P18'] : null,
"Self.P19" => isset($_POST['Self.P19']) ? $_POST['Self.P19'] : null,
"Self.P20" => isset($_POST['Self.P20']) ? $_POST['Self.P20'] : null,
"Self.P21" => isset($_POST['Self.P21']) ? $_POST['Self.P21'] : null,
///
// A_settings
"self.A_settings" => [
"w1" => $_POST['w1'],
"w2" => $_POST['w2'],
],
// B_settings
"self.B_settings_2" => [
"w3" => $_POST['w3'],
"w4" => $_POST['w4'],
],
sieht die json-Datei nach dem Absenden für die ersten einfachen Parameter plötzlich so aus:
{
"Self.P1": null,
"Self.P2": null,
"Self.P3": null,
.....
"Self.P21": null,
Nur die verschachtelten Parameter, die danach kommen:
"self.A_settings": {
"w1": "Antwort1",
"w2": "Antwort2"
},
"self.B_settings_2": {
"w3": "Antwort3",
"w4": "Antwort4"
},
werden nach wie vor korrekt in die Datei geschrieben!
Weiß einer oder hat eine Theorie wieso das eine problemlos funktioniert und bei der anderen Variante plötzlich systematisch alle einfachen Parameter (also Self.P1-21) den Wert "null" zurückgeben?
2 Antworten
Gleich vorweg: Bitte zeichne Quelltext hier auch als Quelltext aus. Es gibt dafür eine extra Formatierung und die macht alles deutlich besser lesbar.
Zu deinem Problem: Punkte und Leerzeichen sind als Key in Formularen nicht erlaubt und werden in einen Unterstrich umgewandelt. Dein Key im PHP-Formular ist daher 'Self_P1'. Ein vardump() vom $_POST hätte dir das zeigen sollen.
Generell würde ich dir raten, andere Keys zu verwenden. Ich würde auch alles klein schreiben und als Trenner gleich den Unterstrich nutzen.
Außerdem kannst du dir die vielen isset() sparen und besser den Null Coalescing Operator nutzen:
'self_p1' => $_POST['self_p1'] ?? null;
Damit wird es kürzer und besser lesbar.
Dein JSON wird in ein PHP array umgewandelt. Das sollte ein vardump auch anzeigen.
Ein Array in PHP ist aber einfach ein Key Value Store Datentyp. Als Value kann auch wieder ein weiteres Array drin sein.
Jetzt versuchst du im Haupt Array zuerst den Wert Self abzurufen und dann willst du auf z.B. P1 zugreifen. Den Wunsch für den sogenannten Nested Zugriff hast du mit dem Punkt ausdrücken wollen. PHP erkennt aber schlichtweg den Key "Self.P1" und kein Nested Zugriff.
So ähnlich funktioniert es auch in den meisten Programmiersprachen, wenn man das JSON in die dort jeweilige Map Datenstruktur übertragen hat.
Zum Lösen müsstest du erstmal das Self Datenobjekt abrufen bzw. ein neues Array davon erstellen. Auf dem neuen Array kannst du dann per z.B. P1 auf dein Wert zugreifen.
Du siehst ja auch im JSON die Objekt Struktur (mit {} dargestellt). Jedes JSON Objekt (oder auch JSON Array per []) entspricht in PHP dem array Datentyp. Verschachtelte Objekte werden in PHP genauso verschachtelt dargestellt.
Bei deinem ersten Beispiel hast du mit folgendem ein neues verschachteltes Array erzeugt:
"P5" => [
"SP1" => $_POST['P1'],
],
Daher funktioniert es dort auch.