Formularelemente mit Schleife durchlaufen



  • Ich habe eine Frage zu Formularelementen, die in Abhängigkeit von einem Datenbankergebnis durchlaufen werden müssen.
    Es geht um Folgendes: Ein Kunde sucht anhand des Verfasser-Nachnamens die in einer Datenbank befindlichen Bücher (wie bei Amazon). Darauf hin werden die gefundenen Datensätze in einer Tabelle ausgegeben. Man kann also nie wissen, ob 1, 2, 3, ... Datensätze gefunden werden. Die Datensätze werden wie im unteren Codebeispiel ausgegeben. Hinter jede Tabellenzeile wird dann zusätzlich ein input-Formular angehängt, damit der Kunde die Anzahl angeben kann, die er von dem jeweiligen Buch haben will. Klickt er auf den Warenkorb-Button (siehe letzten Teil des Codebeispiels), will ich mit einer Schleife die Datensätze durchlaufen lassen um festzustellen, von welchem Buch er welche Menge bestellen möchte. Ich weiß also nicht, kurz gesagt, wie ich auf die input-Felder zugreifen muss 😕
    Hoffentlich habe ich mich verständlich ausgedrückt.

    <?php
    	session_start();
    ?>
    <html>
    	<head>
    		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    		<title>Warenkorb</title>
    		<!--esi localhost="http://localhost/projekt_webshop/"-->
    	</head>
    	<body>
    		<?php
    			include ("connect_go.inc.php");
    			connect();
    			$erg = mysql_query("SELECT id, titel, autor_nn, autor_vn, isbn, preis, ersch_jahr, lagerbestand 
    								FROM buecherliste 
    								WHERE autor_nn = '$suchstring'");
    			if (mysql_num_rows($erg) > 0)
    			{
    				echo "<br>Bibliographische Daten:<br>";
    				echo "<table border>";
    				echo "<th>id<th>Titel<th>Name<th>Vorname<th>ISBN<th>Preis<th>Erscheinungsjahr<th>Lagerbestand<th>Bestellmenge";
    				while ($row = mysql_fetch_row($erg))
    				{
    					echo "<tr>";
    					echo "<td>$row[0] </td>";
    					echo "<td>$row[1] </td>";
    					echo "<td>$row[2] </td>";
    					echo "<td>$row[3] </td>";
    					echo "<td>$row[4] </td>";
    					$euro = number_format($row[5], 2, ',', '.');
    					echo "<td>$euro </td>";
    					echo "<td>$row[6] </td>";
    					echo "<td>$row[7] </td>";
    					echo "<td><input name=$row[0] maxlength=2 size=2></input></td>";
    					echo "</tr>";
    				}
    				echo "</table>";
    			}
    			else
    				echo"<br>Es gibt kein Buch eines Autoren \"$suchstring\"!<br>";
    			mysql_close();
    		?>
    		<form action="warenkorb_inhalt.php" method="POST">
    			<input type=submit name="hinein" value="In den Warenkorb">  
    		</form>
    		<br>
    		<a href="shop.php">[zurück zum Shop]</a><br>
    		<a href="index.php">[zurück zur Startseite]</a><br>
    	</body>
    </html>
    


  • Du musst alle Formular-Element innerhalb des form-Tags haben. Dann kannst du auf der Folge-Seite über das _POST Array auf die Formularelemente zugreifen Evtl. könntest du als Namen auch name="bla[{row[0]}]" - bin mir aber gerade nicht ganz sicher, ob das so funktioniert. Dann hättest du in $_POST['bla'] ein Array mit den ganzen Einträgen

    btw solltest du Attribute immer in "" bzw. '' einschließen



  • Habs jetzt in die FORM-Tags geschrieben, das Auslesen gelingt aber noch nicht. Jedes input-Formular muss als Arrayelement ansprechbar sein, einen Bezug zum entsprechenden Datensatz haben (daher habe ich es mal mit id, dem Primärschlüssel, versucht) und auch den Wert, der vom User eingegeben wurde, zurückliefer können.
    Ich probiers mal weiter, bin aber weiterhin trotzdem für jede Info danbar.



  • Also bei mir klappt das so wie beschrieben, oder ich habe dein Problem falsch verstanden:

    <form action="self.php" method="post"> 
     <input type="text"   name="feld[blub]" value=""><br>
     <input type="text"   name="feld[asdf]" value=""><br>
     <input type="text"   name="feld[jklm]" value=""><br>
     <input type="submit" value="Absenden">   
    </form> 
    <? foreach($_POST['feld'] as $id => $value) echo "$id => $value<br>"; ?>
    


  • Danke, Flenders. Ich habe ein wenig hier und da getestet und löse es jetzt so:
    Das ist die Datei für die Katalogauswahl:

    <?php
    	session_start();
    	include ("connect_go.inc.php");
    	connect();
    	$erg = mysql_query("SELECT id, titel, autor_nn, autor_vn, isbn, preis, ersch_jahr, lagerbestand 
    		   				FROM buecherliste
    						WHERE autor_nn = 'hoeg'");
    	echo "Folgende Titel wurden gefunden:<br><br>";
    	echo "<table border>";
    	echo "<tr>";
    	echo "<th>id<th>Titel<th>Nachname<th>Vorname<th>ISBN<th>Preis<th>Erscheinungsdatum<th>Lagerbestand<th>Warenkorb<th>Menge";
    	echo "</tr>";
    	while ($row = mysql_fetch_row($erg))
    	{
    		echo "<tr>";
      		echo "<form name=auswahl action=bestaetigung.php method=POST target=new>
    			<td>
    				<input type=hidden name=id value=$row[0]>
    				$row[0]
    			</td>
          		<td>
    				<input type=hidden name=titel value=$row[1]>
    				$row[1]
    			</td>
          		<td>
    				<input type=hidden name=nachname value=$row[2]>
    				$row[2]
    			</td>
          		<td>
            		<input type=hidden name=vorname value=$row[3]>
    				$row[3]
    			</td>
          		<td>
            		<input type=hidden name=isbn value=$row[4]>
    				$row[4]
    			</td>
    			<td>
            		<input type=hidden name=preis value=$row[5]>
    				$row[5]
    			</td>
    			<td>
            		<input type=hidden name=erscheinungsdatum value=$row[6]>
    				$row[6]
    			</td>
    			<td>
            		<input type=hidden name=lagerbestand value=$row[7]>
    				$row[7]
    			</td>			
          		<td>
            		<input name=submit type=image src=warenkorb.gif alt=in_den_Warenkorb>
            	</td>
          		<td>
            		<input type=text maxlength=2 size=2 name=anzahl>
    			</td>";
      		echo "</form>";
    		echo "</tr>";
    	}
    	mysql_close();
    ?>
    

    Und das hier die Datei für die Bestellbestätigung

    <?php
    	session_start();
    ?>
    <html>
    	<head>
    		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    		<title>Artikel hinzugefügt</title>
    		<!--esi localhost="http://localhost/dummy/"-->
    	</head>
    	<body>
    		<?php     
    			$gesamtpreis = round($preis * $anzahl, 2);
                echo "Ihr Artikel wurde in den Warenkorb gelegt. Sie können die gewählte Menge jederzeit ändern.<br><br>
    			<table border>
    				<tr><br>
    					<th>ISBN</th><br>
    					<th>Nachname</th><br>
    					<th>Preis</th><br>
    					<th>Anzahl</th><br>
    					<th>Gesamtpreis inkl. MwSt.</th><br>
    				</tr><br>
    				<tr><br>
    					<td>$isbn</td><br>
    					<td>$nachname</td><br>
    					<td>$preis</td><br>
    					<td>$anzahl</td><br>				            
                        <td>$gesamtpreis Euro</td><br>
    				</tr><br>
    			</table><br>";
    		?>
    	</body>
    </html>
    

    Das Dumme ist nur, dass die Ausgabe der Bestellbestätigung, je nachdem wie viele Treffer in der Katalogauswahldatei gefunden wurden, ganz weit unten beginn. Das heißt, die Bestätigungstabelle beginnt mit jedem Treffer in der Katalogauswahldatei immer tiefer, obwohl es ne target=new-Seite ist.



  • Achso, ich dachte du hast mehrere Artikel mit imputfeldern, die sich über einen submitbutton bestellen lassen 🙄
    Dein zweites Problem verstehe ich gerade nicht so ganz, aber setz doch einfach einen Anker und spring direkt nach unten oder mach diese Ausgabe oben auf die Seite



  • Hallo Flenders,
    du hast mein Problem 100%ig erfasst, genau das war mein Problem, aber ich habe es dann doch etwas anders gelöst, wie du siehst. Es kam mir in den Sinn und lief.
    Ich danke dir für die Anteilnahme 🙂



  • Ich habe noch eine weitere Frage. In dem obigen Codeauszug (03 Aug 2003 14:57) befindet sich in $row[1] der Titel eines Buches. Wenn ich das jetzt an das Bestellbestätigungsformular übergebe, wird nur das erste Wort übergeben, nicht der gesamte Satz. Bin daher auf den Nachnamen ausgewichen, aber wenn der jetzt mal aus zwei Worten besteht, wird wieder nur das erste Wort übergeben.
    Die Session-ID wird auch nicht übergeben. Obwohl ich doch zu Beginn der Bestellbestätigung session_start() aufrufe.
    Kann mir jemand helfen? Ganz besonders wichtig ist mir die Session-ID. Normalerweise kann ich sie problemlos zwischen Seiten hin- und hertragen, nur in diesem Beispiel nicht. Ohne Session-ID aber kann ich nichts in der Datenbank sinnvoll abspeichern.
    Danke!



  • flenders schrieb:

    btw solltest du Attribute immer in "" bzw. '' einschließen

    Entweder du aktivierst session.use-trans_sid (siehe auch Wieder Sessions...) oder du fragst mit session_id() diese ab, übergibst sie (per URI oder Cookie) und setzt sie vor dem Aufruf von session_start() mithilfe von session_id() wieder 🙂



  • Danke mal wieder, Flenders.



  • Verstanden habe ich aber immer noch nicht, "warum" die id in dem Beispielen nicht übergeben wird. Auf allen Seiten wird sie übergeben, nur nicht hier.



  • Klappt es denn mit anderen Formularen?



  • Ja, es klappt mit dem gesamten Shop, er läuft. An jede Seite wird die id übergeben, und ich kann sie auch problemlos auslesen. Kurzum: no problems.

    Bis ... auf das Beispiel, das ich da gepostet habe. Die Bestellbestätigungsseite nimmt die id nicht auf, weiß der Teufel warum. Ich habe es jetzt so gelöst, die id in einem versteckten input-Feld an die Bestellbestätigungsseite zu übergeben:

    <input type='hidden' name='sess_id' value='$sess_id'>
    

    Damit kann ich jetzt auch auf der Bestellbestätigungsseite mit der id arbeiten, insofern alles ok. Aber auf normalem Wege wie bei den anderen Seiten, eben mit session_start(), gehts komischwerweise nicht, die id wird dadurch nicht weitergereicht. Ich vermute, dass das irgendwas damit zu tun hat, dass alles, was zwischen <form> und </form> liegt, per echo geschrieben wird.
    Ich könnte ja zufrieden sein, aber es wurmt mich, dass ich nicht herauskriege, wo der Fehler liegt.

    PS
    Danke für den Hinweis mit den Anführungsstrichen 🙂


Anmelden zum Antworten