PHP Undefined array key obwohl kein Array übergeben wird

Floletni

Commander
Registriert
Sep. 2007
Beiträge
2.302
Hallo Leute,

ich versuche grade etwas altgedientes in eine neue PHP-Version (8.1) zu bringen. Dabei wird eine Tabelle per POST als Array übergeben. Dazu auch noch einen stinknormaler Integer-Wert. Die Daten aus dem Array werden ordentlich übertragen. An der Zeile wo ich den Integer-Wert als Variable deffinieren will, bekomme ich diese Fehlermeldung:
Undefined array key "anzahl" in ....php on line 3

Hier ist der Code von wo der Wert kommt:
Code:
echo "Kontrolle Zeilen $a";
echo "<td><input type='hidden' name='anzahl' value='$a'></td>";

Die Zahl die ich mir oben ausgeben lasse stimmt. Als Beispiel wird der Wert 80 übergeben.

Hier die Zeile die angemeckert wird:
Code:
$anzahl = $_POST['anzahl'];


Hat sich mit PHP8.1 irgendetwas geändert was ich bis jetzt nicht beachtet habe? In der alten Version funktioniert das ohne Probleme
 
Auch vorher prüfen mit ISSET oder EMPTY ob die Variable überhaupt existiert.
 
floq0r schrieb:
Dann debug vielleicht mal das Array und schau was da drin steht?
PHP:
print_r($_POST);

Die "Anzahl" sollte gar nicht im Array auftauchen meinem Verständniss nach. Macht er auch nicht. "Anzahl" ist ja ein einzelner Integer-Wert losgelöst von dem Array.

Mir ist gerade aufgefallen das das Übergebene Array nur bis $Variable[83] geht, aber nichts darüber übergibt.
 
Ich fürchte ich kann dir nicht folgen. Du versuchst doch selbst auf $_POST['anzahl'] zuzugreifen und jetzt sagst du das sollte da gar nicht drinnen sein. Schreib hier mal den kompletten Code (Front- und Backend) rein, sonst kann ich hier nur weiter mutmaßen.
 
  • Gefällt mir
Reaktionen: [ChAoZ]
Wenn gibt es sowieso nur "anzahl" und nicht "Anzahl".

Auch ist aus dem Codefragment nicht erkennbar ob Du überhaupt etwas per POST Request übergibst.
Was steht denn in $_REQUEST?
 
Hier die gekürzte Fassung am Beispielt des Nutzerraumes und der Anzahl.

Seite zum Ändern der Daten
PHP:
echo "<FORM action='index2.php?action=Durchfuehren-Eintragen-Daten-Gebaeude' method='post'>";
...
$ergebnis = $pdo->query($abfrage);
$a=0;
foreach($ergebnis as $row) {
        $raum_nutzer[$a] = $row['raum_nutzer'];
        echo "<td class='text'><input name='neu_raum_nutzer[]' value='$raum_nutzer[$a]' size='11' maxlength='11'></td>";
        $a++;
}
echo "<td><input name='anzahl' value='$a'></td>";
echo "<td><input type=\"submit\" class=\"button\" name=\"Datensatz &auml;ndern\" value=\"Datensatz &auml;ndern\"></td>";


Seite auf der die Daten in die DAtenbank geschrieben werden
PHP:
$anzahl = $_POST['anzahl'];
$neu_raum_nutzer = $_POST['neu_raum_nutzer'];
for ($a=0; $a<$anzahl; $a++) {
        $update = "UPDATE patchfelder SET raum_nutzer='$neu_raum_nutzer[$a]',";
        $update .= "WHERE id='$foo[$a]'";
        // Datenbank Update
}

print_r($_REQUEST); ergab folgendes
Code:
Array ( [action] => Durchfuehren-Eintragen-Daten-Gebaeude [neu_raum_nutzer] => Array ( [0] => 201 [1] => 201 [2] => 201 [3] => 201 [4] => 202 [5] => 202 [6] => 202 [7] => 203 [8] => 203 [9] => 203 [10] => 203 [11] => 204 [12] => 204 [13] => 204 [14] => 204 [15] => 205 [16] => 205 [17] => 205 [18] => 206 [19] => 206 [20] => 206 [21] => 206 [22] => 206 [23] => 206 [24] => 207 [25] => 207 [26] => 207 [27] => 207 [28] => 207 [29] => 207 [30] => 207 [31] => 207 [32] => 207 [33] => 207 [34] => 207 [35] => 207 [36] => 207 [37] => 207 [38] => 207 [39] => 208 [40] => 208 [41] => 208 [42] => 208 [43] => 208 [44] => 208 [45] => 208 [46] => 208 [47] => 208 [48] => 209 [49] => 209 [50] => 209 [51] => 210 [52] => 210 [53] => 210 [54] => 211 [55] => 211 [56] => 211 [57] => 211 [58] => 211 [59] => 211 [60] => 211 [61] => 213 [62] => 213 [63] => 213 [64] => 214 [65] => 214 [66] => 214 [67] => 214 [68] => 215 [69] => 215 [70] => 215 [71] => 215 [72] => 216 [73] => 216 [74] => 216 [75] => 216 [76] => 216 [77] => 216 [78] => 217 [79] => 217 [80] => 217 [81] => 217 [82] => 218 [83] => 218 ))
 
Warum verwendest du nicht einfach foreach und sparst dir die anzahl?
PHP:
$neu_raum_nutzer = $_POST['neu_raum_nutzer'] ?? [];
foreach ($neu_raum_nutzer as $i => $value) {
        $update = "UPDATE patchfelder SET raum_nutzer='$value',";
        $update .= "WHERE id='$foo[$a]'";
        // Datenbank Update
}

So wie es aussieht, verwendest du übrigens keine prepared statements... das ist in diesem Fall dringend angeraten, sonst hast du eine Sicherheitslücke in deinem Script.

Da das vermutlich nicht die einzige Stelle sein wird,empfehle ich dir dringend, dein Script auf diese Fehler abzusuchen.
 
  • Gefällt mir
Reaktionen: [ChAoZ]
@sandreas

Ich habe die Schleife auf foreach umgestellt. Ich hatte dann noch das Problem das das übertragene Array nicht komplett war. Ich habe dann Teile der zu übertragenden Daten auskommentiert. Siehe da es wurden mehr Datensätze des Array abgerufen, aber noch immer nicht alle.
Ich bin dann bei meiner Suche auf "max_input_vars" gestoßen und habe die erhöht. Ich denke das könnte auch der Grund gewesen sein warum $anzahl leer blieb. Das Feld kam in der Eingabe nach dem Array. Das Array hat schon alle Zeichen belegt. Ergo $anzahl ist auch leer.

Danke für eure Unterstützung :)
 
XSS und SQL Injection ist wohl gewünscht, hoffe die App ist rein im Firmennetzwerk verfügbar, nicht im www.
Der Code ist grausam aber man hat oft nicht die Wahl, da muss man durch.

max_input_vars ist eine php.ini Einstellung und sollte standardmäßig auf 1000 stehen.
Ich bezweifle dass du auch nur in die Nähe dieses Wertes kommst.

Debugging is the Key.
Guck im Browser was du versendest per Post.
Alle Input/Select/Textarea usw. Elemente zwischen den Form-Tags werden versendet im Standardfall.
Mit Dev-Tools eines jeden Browsers kannst du sehen was du versendest und in welcher Form.

Am Endpoint schaust du was du bekommst.
Schon weist du was und wo was schief läuft.

Wer mit solchen Array arbeitet, macht sich das Leben unnötig schwer.
Das geht viel einfacher....
 
  • Gefällt mir
Reaktionen: DubZ
Ich kann dich beruhigen: Nicht mal das gesamte Firmennetz darf drauf zugreifen ;)

Dieses Tool ist irgendwann Anfang der 2000 entstanden und wurde immer wieder erweitert und an neue Situationen angepasst. Alle die daran gearbeitet haben sind keine Webentwickler und machen das nebenher. Da macht man halt das beste was einem mit seinen Basics zur Verfügung steht.
 
  • Gefällt mir
Reaktionen: [ChAoZ]
Wenn keine richtigen Devs solchen Code produzieren, dann ist es völlig i.O. :)
 
Jetzt muß ich mal so blöd fragen. Was ist denn nun die HTTP Methode? GET oder POST?

Wenn ich das so richtig interpretiere, dann ist form action=GET und das kann so nicht funktionieren.

Denn die Länge des Querystrings für GET ist begrenzt. 2000 Zeichen oder so, wenn ich mich recht entsinne. Logischerweise fehlen dann die letzten Variablen.

Deshalb bitte sicherstellen, daß auch wirklich POST verwendet wird. Erst dann macht es Sinn zu gucken, ob es noch weitere Probleme gibt.
 
Zurück
Oben