PHP Übergabe mehrerer Formularfelder

RolandAMS

Cadet 4th Year
Registriert
März 2007
Beiträge
81
Moin Gemeinde!

Folgendes Problem:

Aus der Datei englischesingles-main.php versuche ich MEHRERE ID's an eine postmail.php zu schicken. Die Verbindung zur Datenbank läuft ohne Probleme, das Abschicken der Mail mit den Infos ebenfalls (die beiden php-Dateien sind also voll funktionsfähig).

Das alles funktioniert jedoch nur, wenn ich nur EINE Checkbox markiere. Wie muss ich den Code abändern, damit ich auch mehrere Checkboxen (id's) von englischesingles-main.php an postmail.php übersenden kann und wie kann ich dann in der postmail.php dann die Inhalte abgreifen???

ENGLISCHESINGLES-MAIN.PHP:
Code:
<h1>Englische Singles</h1>

  <?php
include("db_connect.php");
  ?>
  
 <h2>Liste nach Interpret sortiert</h2>
 
 <table border="0" cellpadding="0" cellspacing="0">
			<tr bgcolor="#f87820">
				<td><img src="img/blank.gif" alt="" width="10" height="25"></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="20" height="6"><br><b>ID</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="150" height="6"><br><b>Interpret</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="200" height="6"><br><b>Titel</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="20" height="6"><br><b>Jahr</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="70" height="6"><br><b>Label</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="70" height="6"><br><b>&nbsp;</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="20" height="6"><br><b>Zustand: Platte, &nbsp;</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="20" height="6"><br><b>Cover</b></td>
				<td class="tabhead"><img src="img/blank.gif" alt="" width="20" height="6"><br><b>&nbsp; Preis</b></td>
				<td><img src="img/blank.gif" alt="" width="10" height="25"></td>
			</tr>

			<?php
				$id=$_REQUEST['id'];
				$interpret=$_REQUEST['interpret'];
				$titel=$_REQUEST['titel'];
				$jahr=$_REQUEST['jahr'];
				$labelname=$_REQUEST['labelname'];
				$labelnr=$_REQUEST['labelnr'];
				$zustandplatte=$_REQUEST['zustandplatte'];
				$zustandcover=$_REQUEST['zustandcover'];
				$preis=$_REQUEST['preis'];

				$result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles ORDER BY interpret;");

				$i = 0;
				while ($row = mysql_fetch_array($result)) {
					if ($i > 0) {
						echo "<tr valign='bottom'>";
						echo "<td bgcolor='#ffffff' height='1' style='background-image:url(img/strichel.gif)' colspan='6'></td>";
						echo "</tr>";
					}
					echo "<tr valign='middle'>";
					echo "<td class='tabval'><img src='img/blank.gif' alt='' width='10' height='20'></td>";
					echo "<td class='tabval'>".$row['id']."&nbsp;</td>";
					echo "<td class='tabval'><b>".$row['interpret']."</b></td>";
					echo "<td class='tabval'>".$row['titel']."&nbsp;</td>";
					echo "<td class='tabval'>".$row['jahr']."&nbsp;</td>";
					echo "<td class='tabval'>".$row['labelname']."&nbsp;</td>";
					echo "<td class='tabval'>".$row['labelnr']."&nbsp;</td>";
					echo "<td class='tabval-right'>".$row['zustandplatte'].", &nbsp;</td>";
					echo "<td class='tabval'>".$row['zustandcover']."&nbsp;</td>";
					echo "<td class='tabval-center'>".$row['preis']."&nbsp;</td>";

					echo "<td class='tabval'>
					
					<form action=postmail.php method=post><input type='checkbox' name='id' value=".$row['id'].">
					
					</td>";
					echo "</tr>";
					$i++;
				}

				echo "<tr valign='bottom'>";
				echo "<td bgcolor='#fb7922' colspan='6'><img src='img/blank.gif' alt='' width='100%' height='8'></td>";
				echo "<td bgcolor='#fb7922' colspan='6'><img src='img/blank.gif' alt='' width='100%' height='8'></td>";
				echo "</tr>";
				
				mysql_close();
			?>
			</select>
		</table>
		<input type=submit border=0 value="MARKIERTE ELEMENTE BESTELLEN"></form>

POSTMAIL.PHP:
Code:
<?php
include("includes/db_connect.php");

$id=$_POST['id'];
$result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id=".$id.";");

$i = 0;
while ($row = mysql_fetch_array($result)) {
					$mail_id=$row['id'];
					$mail_interpret=$row['interpret'];
					$mail_titel=$row['titel'];
					$mail_jahr=$row['jahr'];
					$mail_labelname=$row['labelname'];
					$mail_labelnr=$row['labelnr'];
					$mail_zustandplatte=$row['zustandplatte'];
					$mail_zustandcover=$row['zustandcover'];
					$mail_preis=$row['preis'];
					$i++;
				}
mysql_close();

//MAIL PARAMETER
$to = "recipient@xxx.com";
$subject = "E-Mail-Bestellung";
$body = "Details dieser Bestellung:\n\nID: ".$mail_id."\nInterpret: ".$mail_interpret."\nTitel: ".$mail_titel."\nJahr: ".$mail_jahr."\nPreis: ".$mail_preis." Euro";
echo "Zur Kontrolle:<br/><br/> Bestellt wurde Platte mit der ID: ".$id."(".$mail_interpret.", ".$mail_titel." von ".$mail_jahr." zum Preis von ".$mail_preis." Euro).";

//MAIL ABSCHICKEN
if (mail($to, $subject, $body)) {
  echo("<p>Email erfolgreich versandt!</p>");
 } else {
  echo("<p>Email nicht versandt - Fehler mit Befehl mail...</p>");
 }
?>

Für jeden Tipp bin ich sehr dankbar!!!
 
Zuletzt bearbeitet:
Aus
PHP:
<input type='checkbox' name='id' value=".$row['id'].">
machst du
PHP:
<input type='checkbox' name='id[]' value=".$row['id'].">

Das wird in PHP dann als Array angesprochen und enthält die Werte der aktivierten Checkboxen.
 
Danke für den Hinweis; haben den letzten Post eingebaut.
Aaaaaah ich werde noch verrückt. Jetzt probiere ich schon stundenlang, kein Ergebnis.

Ich bekomme immer "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in postmail.php on line 8"

PHP:
include("includes/db_connect.php");

$id=$_POST['id'];
$result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id=".$id.";");

$i = 0;
while ($row = mysql_fetch_array($result)) {
					$mail_id=$row['id'];
					$mail_interpret=$row['interpret'];
					$mail_titel=$row['titel'];
					$mail_jahr=$row['jahr'];
					$mail_labelname=$row['labelname'];
					$mail_labelnr=$row['labelnr'];
					$mail_zustandplatte=$row['zustandplatte'];
					$mail_zustandcover=$row['zustandcover'];
					$mail_preis=$row['preis'];
					$i++;
				}
mysql_close();

Zeile 8 ist die Zeile mit: while ($row...
Ich bin für jeden Tipp wie immer sehr dankbar. Google hat mir leider nix brauchbares geboten. :(
 
Mach nach der query und vor dem fetch mal ein
echo mysql_errno() . ": " . mysql_error(). "\n";
Außerdem: Du musst unbedingt den Input prüfen! Also prüfen, ob $_POST['id'] eine Zahl ist ODER zumindest mysql_real_escape_string verwenden. Ansonsten hast du gleich mal eine schöne Lücke für SQL Injections eingebaut!
 
- echo mysql_errno() . ": " . mysql_error(). "\n"; ergibt: 1054: Unknown column 'Array' in 'where clause'
- Die Überprüfung, ob $id numerisch ist mittels (is_numeric($id)) ergibt: nix (keine Ausgabe mittels echo)
- der Inhalt der Variable $id ist laut echo: 'Array'

?!?!
 
Er sagt dir doch was los ist. Du bekommst ein Array und musst das erst entsprechend umwandeln. Am Besten so in der Art:
PHP:
include("includes/db_connect.php");
$debug == true;    // debugmodus; im Produktivmodus dann auf false setzen weil der User keine Fehler sehen braucht!
if(isset($_POST['id']) && is_array($_POST['id']) && count($_POST['id'] > 0){  // überprüfen ob übertragen wurde und es auch ein befülltes Array ist
  $idsfound = "";   // Text initialisieren, in der Schleife wirds angehängt
  for($i = count($_POST['id'])-1; $i > -1; --$i){   // Array durchgehen
    if(strlen($_POST['id'][$i]) > 0 && is_numeric($_POST['id'][$i])) $idsfound .= $_POST['id'][$i].",";
  }
  if(strlen($idsfound) > 1){       // überprüfen ob mindestens ein Element gefunden wurde
     $idsfound = substr($idsfound, 0, strlen($idsfound) - 1);   // das Komma am Ende entfernen damit die Abfrage geht
     $result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id IN (".$idsfound.");");
     if(mysql_errno()  != 0){
       if($debug == true) echo mysql_errno() . ": " . mysql_error(). "\n";
     } else {
       $i = 0;
       $body = "";
       while ($row = mysql_fetch_array($result)) {
         $body .= "ID: ".$row['id']."\nInterpret: ".$row['interpret']."\nTitel: ".$row['titel']."\nJahr: ".$row['jahr']."\nPreis: ".$row['preis']." Euro\n\n";
         $i++;
       }
       if($i > 0){
         $to = "recipient@xxx.com";
         $subject = "E-Mail-Bestellung";
         $body = "Details dieser Bestellung:\n\n".$body;
         echo "Zur Kontrolle: Bestellt wurden:<br/><br/>".nl2br($body);
         if (mail($to, $subject, $body)) {
           echo("<p>Email erfolgreich versandt!</p>");
         } else {
           echo("<p>Email nicht versandt - Fehler. Bitte versuchen Sie es später erneut oder melden Sie sich unter ".$to."!</p>");
         }
       }
   }
   mysql_close();
  }
}
 
Zuletzt bearbeitet:
Zwei Dinge:
1. Du übergibst $row['preis'] direkt in die E-Mail. Da könnte jemand doch geschickt einen anderen Preis übergeben?
2. SQL-Injection
$result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id=".$id.";");
Soll sowas sein:
$result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id=".intval($id).";");
 
@Einhörnchen: 1. Ist nicht stichhaltig. Das kommt aus der Datenbank und der sollte man eigentlich vertrauen. Ansonsten hat man eh ein Problem. Punkt 2 hatte ich schon weiter oben erwähnt, geht aber mit deiner Überprüfungsvariante nicht, weil es ein Array ist und intval damit nichts anfangen kann.
 
Du hast recht, habe in meiner Müdigkeit angenommen, dass du dort $preis aus $_REQUEST['preis'] verwendest.
 
NA IS DENN SCHO WEIHNACHTEN! DANKE! VIELEN DANK!

eine klammer in der ersten if-abfrage fehlte, lösung ist:
PHP:
if(isset($_POST['id']) && is_array($_POST['id']) && count($_POST['id'] > 0)){  // überprüfen ob übertragen wurde und es auch ein befülltes Array ist
  $idsfound = "";   // Text initialisieren, in der Schleife wirds angehängt
  for($i = count($_POST['id'])-1; $i > -1; ++$i){   // Array durchgehen
    if(strlen($_POST['id'][$i]) > 0 && is_numeric($_POST['id'][$i])) $idsfound .= $_POST['id'][$i].",";
  }
  if(strlen($idsfound) > 1){       // überprüfen ob mindestens ein Element gefunden wurde
     $idsfound = substr($idsfound, 0, strlen($idsfound) - 1);   // das Komma am Ende entfernen damit die Abfrage geht
     $result=mysql_query("SELECT id,interpret,titel,jahr,labelname,labelnr,zustandplatte,zustandcover,preis FROM englischesingles WHERE id=".$idsfound.";");
     $i = 0;
     while ($row = mysql_fetch_array($result)) {
       $mail_id=$row['id'];
       $mail_interpret=$row['interpret'];
       $mail_titel=$row['titel'];
       $mail_jahr=$row['jahr'];
       $mail_labelname=$row['labelname'];
       $mail_labelnr=$row['labelnr'];
       $mail_zustandplatte=$row['zustandplatte'];
       $mail_zustandcover=$row['zustandcover'];
       $mail_preis=$row['preis'];
       $i++;
     }
   mysql_close();
  }
}
 
Zurück
Oben