PHP Schwieriges Schleifenproblem

mikelsdump

Ensign
Registriert
Aug. 2008
Beiträge
133
Hallo alle,

ich habe ein kniffliges Schleifenproblem und hoffe auf eure Hilfe.

Ich habe eine SQL Tabelle namens "iankanposstma", aus der ich in der Schleife die Werte für die Spalten IAN, KAN und POS auslese (wobei POS in der Schleife ausgedrückt wird durch die Variable $i).

In jedem Schleifendurchgang gibt die Schleife dann die kombinierte Nummer aus IAN, KAN und POS ($i) wieder und setzt dahinter noch zwei Input-Felder, in die man die Werte für Stückzahl und Material eingeben kann.

Jedoch möchte ich nicht, dass für jeden Schleifendurchgang ein Submit-Button generiert wird, sondern dass nur ein einziger Submit-Button für alle Werte, also außerhalb der Schleife, generiert wird.

Wie kann ich nun dem zentralen Submit-Button sagen, dass er die Werte die der user für den ersten Schleifendurchgang eingetragen hat in die Zeile mit dem ersten Wert der Zählvariable §i einträgt, dass er die vom user für den zweiten schleifendurchgang eingetragenen Werte in die zeile mit dem zweiten wert von §i einträgt, usw?

Der Befehl an sich ist klar.

PHP:
$sql = "UPDATE `db1047981`.`iankanposstma` SET `Stueckzahl` = \'11\', `MaterialArt` = \'2\' WHERE `iankanposstma`.`KAN` = $KAN AND `POS`= ????;";
Die Frage ist mehr oder weniger: Was muss ich an Stelle der Fragezeichen schreiben? Denn die Variable $i ist ja zum Zeitpunkt des Endes der Schleife bereits hochgezählt.

Der restliche Code der Schleife lautet:
PHP:
	 $i=1;
	 while ($i <= $POS) {
	  $TableName="iankanposstma";
	  $TableData="INSERT INTO $TableName
	  (ID, IAN, KAN, POS) 
	  VALUES 
	  (NULL, '$IAN', '$KAN', '$i')
	  ";
	  $FillTable=mysql_query($TableData) or die (mysql_error());
	  If ($FillTable) echo "Position $IAN-$KAN-$i erstellt.<br>";
	  echo "Stückzahl: <input type=\"Text\" name=\"Stueckzahl\" id=\"Stueckzahl\" value=\"\" size=\"2\" maxlength=\"3\"><br>";
	  echo "Material: <input type=\"Text\" name=\"MaterialArt\" id=\"MaterialArt\" value=\"\" size=\"2\" maxlength=\"3\"><br>";
	  $i++;
	 }
    } else {
     echo 'Der Eintrag ist fehlgeschlagen';
    }
 
Du musst lediglich den input-Tags eindeutige IDs und Namen geben. Also statt "Stueckzahl" z.B. "Stueckzahl[nr]", wobei "nr" einfach hochgezählt wird. Jede nr musste dann einmal mit POS gleich setzen.

So wie du es bisher hast, hast du Fehler in HTML, weil die IDs nicht eindeutig sind und kannst zudem die Felder nicht unterscheiden, da die sich gegenseitig bei der Übertragung überschreiben.
 
Zuletzt bearbeitet:
Zu kompliziert, wer soll denn da durchsteigen wenn du in x Jahren dir deinen Code nochmal ansiehst.

Ich würde das so machen:

Abfrage 1:
<form>
<mysql Abfrage>
<input Felder>
<mysql Abfrage Ende>
<submit Button>
</form>

Abfrage 2:
<form>
<mysql Abfrage>
<input Felder>
<mysql Abfrage Ende>
<submit Button>
</form>

Wenn du Performance sparen musst und alles mit einer Abfrage abarbeiten willst, dann kannst du die Abfrage 2 in einem Array Zwischenspeichern und danach ausgeben. ;)
 
@Meolus:

Danke für die Idee, das klingt vielversprechend!
Aber wie müsste mein Code aussehen, um die Zählvariable $i an den Namen des input-Feldes anzuhängen?
Und vor allem wie kann ich das beim Eintragen dann wieder auftrennen? (Denn meinem Verständnis nach müsste ich ja aus dem Namen des inputfeldes dann sowohl den Namen der Spalte als auch die POS der Zeile auslesen)

@Suxxess:
Es geht weniger um die Webperformance als die Usability. Hätte ein Auftrag beispielsweise 12 Positionen müsste man 12mal einzeln 1. Daten eintragen 2. Formular abschicken 3. Wieder zurück zum Ausgangsbildschirm um die nächste Position zu bearbeiten.

Verstehe leider nicht, wie du das mit dem Array meinst...
 
Meolus hat recht:

Ich nehme an deine POS entspricht der eindeutigen ID des Artikels oder was auch immer.

Einfach das Feld immer nach dem Positionsnamen bennen. Evtl. noch mit nem Präfix "stueckzahl_pos" oder so..

Und bei der Verarbeitung kannste das Array ja einfach abfragen...

LG izak
Ergänzung ()

Details:


$pos (nehmen wir an hier steht der positionsname drin welcher aus der datenbank oder eben aus deiner zählvariable $i kommt)

Daraus erstellst du das Input-Feld:
<input name='stueckzahl_$pos'>


Und dann auf der Submit-Seite, also da wo du die Eingaben verarbeitest gibt es mehrere Möglichkeiten (wohl auch mehr als hier aufgeführt):

a) Du gehst mit nem Foreach das POST-Array durch und prüfst die einzelnen Variablen
b) Du machst die gleiche Datenbankabfrage nocheinmal (fragst nur POS ab) und prüfst den Eintrag im Array. Also wenn z.B. $pos der aus der DB gelesen Wert ist, machste z.b.
$stueckzahl=$stueckzahl."_".$pos;

LG izak
 
Hallo izak,

mein Code für das Formular sieht jetzt so aus:
PHP:
<form action="Insert_StMA.php" method="POST" target="">
	 <?
	 $i=1;
	 while ($i <= $POS) {
	  $TableName="iankanposstma";
	  $TableData="INSERT INTO $TableName
	  (ID, IAN, KAN, POS) 
	  VALUES 
	  (NULL, '$IAN', '$KAN', '$i')
	  ";
	  $FillTable=mysql_query($TableData) or die (mysql_error());
	  If ($FillTable) echo "Position $IAN-$KAN-$i erstellt.<br>";
	  echo "Stückzahl: <input type=\"Text\" name=\"Stueckzahl[$i]\" id=\"Stueckzahl$i\" value=\"\" size=\"2\" maxlength=\"3\"><br>";
	  echo "Material: <input type=\"Text\" name=\"MaterialArt$i\" id=\"MaterialArt[$i]\" value=\"\" size=\"2\" maxlength=\"3\"><br>";
	  echo "<input type=\"hidden\" name=\"IAN\" value=\"$IAN\">";
	  $i++;
	 }
    } else {
     echo 'Der Eintrag ist fehlgeschlagen';
    }
	echo "<input type=\"Submit\" name=\"\" value=\"Abschicken\"></form>";

Und der Code des verarbeitenden Formulars so:
PHP:
<?
 if (isset($_POST["IAN"])) { 
  $IAN=htmlspecialchars($_POST["IAN"]);
 Line 21: $POS=htmlspecialchars($_POST["i"]);
 }
 
 /*Prüfung ob Eintrag erfolgreich oder nicht mit Bestätigung.*/
 if (mysql_query("UPDATE `db1047981`.`iankanposstma` SET
	(`Stueckzahl`, `MaterialArt`) 
	VALUES 
Line 28	('$Stueckzahl', '$MaterialArt'); WHERE `iankanposstma`.`IAN` = $IAN AND `POS`=$i")) {
     }
	 
?>

Irgendwie sagt mir aber das verarbeitende Formular:
Code:
Notice: Undefined index: i in C:\xampp\htdocs\PPV\Insert_StMA.php on line 21

Notice: Undefined variable: Stueckzahl in C:\xampp\htdocs\PPV\Insert_StMA.php on line 28

Notice: Undefined variable: MaterialArt in C:\xampp\htdocs\PPV\Insert_StMA.php on line 28

Notice: Undefined variable: i in C:\xampp\htdocs\PPV\Insert_StMA.php on line 28
Ich kann nicht erkennen wo der Fehler liegt...kannst du mir da helfen?
 
Hast du verstanden, wie man Arrays mit <form> an PHP sendet?
Und dass PHP nur das weiß, was bei dem Aufruf übertragen wird und sonst nichts.

Dann wirst du sehen, dass in L. 21 $_POST["i"] in HTML irgendwo ein <input name="i"> stehe müsste.

Wo definierst und belegst du $Stueckzahl und $MaterialArt und woher kommt dein $i?

Tipp: Wenn ich dich richtig verstande habe, dann könnte das was für dich sein
Code:
<?php 
foreach(eintrag){?>
<input name="Stueckzahl[]">
<input name="MaterialArt[]">
<input name="pos[]">
<?php }?>
<input type="hidden" name="action" value="blah">
<input type="submit">
Und zur Verarbeitung
Code:
if(isset($_POST["blah"])){
for($i=0;$i<count($_POST["pos"]);++$i){
db_query("...",$_POST["Stueckzahl][$i],$_POST["MaterialArt"][$i],$_POST["pos"][$i]);
}
}
Das ist jetzt nur die Idee, kein funktionierender Code.
 
Blitzmerker, vielen Dank für deinen Code. Habe ihn zwar an einigen Stellen verändert, aber er hat mich auf die richtige Idee gebracht, die zur gewünschten Lösung meines Codeproblems geführt hat. Vielen, vielen Dank! :)

@MODs:
Thread kann geschlossen werden bzw. als erledigt gekennzeichnet.
 
Zurück
Oben