Warum werden in PHP beim Absenden eines Formulars nur die ersten Feldwerte der letzten dynamisch hinzugefügten Zeile ver
Posted: 03 Jan 2025, 11:27
Ich arbeite an einer Webanwendung, bei der ich mithilfe von JavaScript dynamisch Zeilen zu einem HTML-Formular hinzufüge. Jede Zeile enthält mehrere Eingabefelder wie Konto, Debitor und Kreditor. Nach dem Absenden des Formulars verarbeite ich die übermittelten Daten in PHP.
Das Problem tritt speziell bei der letzten dynamischen Zeile auf. Nur das erste Eingabefeld () der letzten Zeile wird korrekt gelesen, während die anderen Felder ( und creditor[]) fehlen entweder oder werden nicht erkannt.
Zum Beispiel:
Wenn ich 10 dynamische Zeilen habe, sind es die ersten 9 Zeilen korrekt verarbeitet und alle ihre Felder erscheinen ordnungsgemäß in der Ausgabe von var_dump. Für die letzte Zeile wird jedoch nur der Wert des ersten Felds () wird gelesen, während die anderen Felder ( undcreditor[]) werden nicht erkannt.
Wenn ich jedoch eine neue dynamische Zeile hinzufüge und das Formular absende, gibt das Skript einen Fehler aus:
< blockquote>
Beim Verarbeiten der Daten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.
Dieses Problem scheint aufzutreten, weil die Arrays in der POST-Anfrage (, Debtor, Creditor, Beschreibung und acc_serial) haben nicht übereinstimmende Zählungen.
Was ich Ich habe versucht:
Serverseitige PHP-Validierung
Ich habe einen Validierungsschritt hinzugefügt, um sicherzustellen, dass alle Arrays (Konto, Debitor, Creditor, Beschreibung und acc_serial) haben das Gleiche count:
Dies löst die Fehlermeldung aus, wenn die Zählungen nicht übereinstimmen.
Debuggen von POST-Daten
I var_dump($_POST) verwendet, um die übermittelten Daten zu überprüfen. Hier ist die Ausgabe für eine problematische Anfrage:
Konto hat 3 Elemente, während Schuldner, Kreditor, Beschreibung und acc_serial nur 2 Elemente haben.
In diesem Fall enthält jedes der verbleibenden Felder – Schuldner, Gläubiger, Beschreibung, und Kontoseriennummer – sollte drei Eingaben haben, genau wie das Feld „Kontoname“, da ich dem Journaleintrag eine dritte dynamische Zeile hinzugefügt habe. Aus irgendeinem Grund werden jedoch die Eingabewerte der dynamischen Felder in der dritten neu hinzugefügten Zeile nicht gelesen, mit Ausnahme des Felds „Kontoname“. Der folgende Fehler erscheint wie in der Iterationsschleife gezeigt:
PHP-Schleife zur Verarbeitung von Zeilen
HTML-Struktur für dynamische Zeilen
Das Problem tritt speziell bei der letzten dynamischen Zeile auf. Nur das erste Eingabefeld (
Code: Select all
account[]
Code: Select all
debtor[]
Zum Beispiel:
Wenn ich 10 dynamische Zeilen habe, sind es die ersten 9 Zeilen korrekt verarbeitet und alle ihre Felder erscheinen ordnungsgemäß in der Ausgabe von var_dump. Für die letzte Zeile wird jedoch nur der Wert des ersten Felds (
Code: Select all
account[]
Code: Select all
debtor[]
Wenn ich jedoch eine neue dynamische Zeile hinzufüge und das Formular absende, gibt das Skript einen Fehler aus:
< blockquote>
Beim Verarbeiten der Daten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.
Dieses Problem scheint aufzutreten, weil die Arrays in der POST-Anfrage (
Code: Select all
account
Was ich Ich habe versucht:
Serverseitige PHP-Validierung
Ich habe einen Validierungsschritt hinzugefügt, um sicherzustellen, dass alle Arrays (Konto, Debitor, Creditor, Beschreibung und acc_serial) haben das Gleiche count:
Code: Select all
$account = $_POST["account"];
$debtor = $_POST["debtor"];
$creditor = $_POST["creditor"];
$description = $_POST["description"];
$acc_serial = $_POST["acc_serial"];
if (
count($_POST['account']) !== count($_POST['debtor']) ||
count($_POST['account']) !== count($_POST['creditor']) ||
count($_POST['account']) !== count($_POST['description']) ||
count($_POST['account']) !== count($_POST['acc_serial'])
) {
echo 'toastr.error("Mismatched field count. Please verify the data.");';
exit;
}
Debuggen von POST-Daten
I var_dump($_POST) verwendet, um die übermittelten Daten zu überprüfen. Hier ist die Ausgabe für eine problematische Anfrage:
Code: Select all
'account' =>
array (size=3)
0 => string 'd59f127d86' (length=10)
1 => string 'd5a05ca920' (length=10)
2 => string 'd59fb74cb8' (length=10)
'debtor' =>
array (size=2)
0 => string '2000' (length=4)
1 => string '0' (length=1)
'creditor' =>
array (size=2)
0 => string '0' (length=1)
1 => string '1000' (length=4)
'description' =>
array (size=2)
0 => string 'General Expense' (length=19)
1 => string 'General Expense' (length=19)
'acc_serial' =>
array (size=2)
0 => string 'd59f127d86' (length=10)
1 => string 'd59fb74cb8' (length=10)
In diesem Fall enthält jedes der verbleibenden Felder – Schuldner, Gläubiger, Beschreibung, und Kontoseriennummer – sollte drei Eingaben haben, genau wie das Feld „Kontoname“, da ich dem Journaleintrag eine dritte dynamische Zeile hinzugefügt habe. Aus irgendeinem Grund werden jedoch die Eingabewerte der dynamischen Felder in der dritten neu hinzugefügten Zeile nicht gelesen, mit Ausnahme des Felds „Kontoname“. Der folgende Fehler erscheint wie in der Iterationsschleife gezeigt:
Code: Select all
An error occurred while processing data. Please try again.
Code: Select all
foreach ($_POST['account'] as $index => $value) {
if (isset($_POST['account'][$index], $_POST['debtor'][$index], $_POST['creditor'][$index], $_POST['description'][$index], $_POST['acc_serial'][$index])) {
$account = $_POST['account'][$index];
$debtor = $_POST['debtor'][$index];
$creditor = $_POST['creditor'][$index];
$description = $_POST['description'][$index];
$acc_serial = $_POST['acc_serial'][$index];
if (empty($account) || empty($description) || empty($acc_serial) || $debtor === "" || $creditor === "") {
echo 'toastr.error("Please fill all fields in row ' . ($index + 1) . '");';
exit;
}
if (!is_numeric($debtor) || !is_numeric($creditor)) {
echo 'toastr.error("Debtor and Creditor must be numeric in row ' . ($index + 1) . '");';
exit;
}
} else {
echo 'toastr.error("An error occurred while processing data. Please try again.");';
exit;
}
}
Code: Select all
Account
Debit
Credit
Description
[i][/i]