PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : $_POST daten fehlen


Afrika
29.09.2005, 18:56:39
Ich habe ein Bestellformular, welches die Daten so bekommt:
foreach($user_cart->items as $key => $row) {
print '<input type="hidden" name="Schriftzug " value= " ' . $key . '">';
print '<input type="hidden" name="Menge " value= "' . $row['qty'] . '">';
print '<input type="hidden" name="Schriftart " value= "' . $row['product'] . '">';
print '<input type="hidden" name="Farbe " value= "' . $row['color'] . '">';
print '<input type="hidden" name="Fett " value= "' . $row['fett'] . '">';
print '<input type="hidden" name="Kursiv " value= "' . $row['kursiv'] . '">';
print '<input type="hidden" name="Gesamtlaenge " value= "' . $row['laenge'] . '">';
Nun hatte ich es per mailto versendet, wo auch bei mehreren Artikeln im Korb diese untereinander standen.
Nun will ich es aber anders lösen, aber wenn ich
echo '<pre>';
print_r($_POST);
echo '</pre>';
abrufe, dann zeigt es nur den letzten Artikel an. Wieso ist das so?
Kann ich das anders lösen?

Matt
29.09.2005, 19:35:32
Nunja, die lösung ist einfach: Es zeigt nur den letzten an, weil du für jedes objekt in deinem einkaufswagen die werte in die selbe variable speicherst - du überschreibst die werte also ständig. der letzte wert, der den vorigen überschrieben hat ist der, der am ende bleibt.

Eine simple lösung wäre beispielsweise, die werte so anzugeben:


print '<input type="hidden" name="Schriftzug[]" value= " ' . $key . '">';


dann werden alle werte für Schriftzug in einem array gespeichert...


Alternativ könntest du in deiner schleife auch noch eine Variable hochzählen:

$i=0;
foreach($user_cart->items as $key => $row) {

print '<input type="hidden" name="Schriftzug'.$i.'" value= " ' . $key . '">';
# und so weiter...
$i++;
}


Bedenke aber, dass Bestellformulare und Shopsysteme mit realem geld zu tun haben und es eine menge bösartiger Menschen im Internet gibt, die nur auf ein schlecht programmiertes Shopsystem warten, um sich zu bereichern, oder 20.000 Mountainbikes auf kosten eines anderen Benutzers zu bestellen.
Mal ganz ehrlich: Würdest du bei Amazon kaufen, wenn du wüsstest, dass das System von einem Praktikanten (oder jemand anderem mit wenig ahnung) programmiert wurde?

Ich will dich jetzt nicht falsch einschätzen, aber das war ein ziemliches anfängerproblem - und auch wenn du sonst perfekt programmieren kannst - webprogrammierung ist etwas anders - vor allem was den sicherheitsaspekt betrifft! (Vergiss vor allem nicht die moralische Anforderung an einen Händler gegenüber seiner Kunden, die erwarten, dass sie mit absoluter sicherheit und vertraulichkeit rechnen können)

c4
29.09.2005, 19:36:58
Die zwei rettenden Zeichen sind sicher [ und ]

Zeig mal das Formular und etwas mehr Code.

Afrika
29.09.2005, 21:03:15
Die ganze Form:
print '<form action="mailto:test@test.de" method="post" enctype="text/plain">';



foreach($user_cart->items as $key => $row) {
print '<input type="hidden" name="Schriftzug " value= " ' . $key . '">';
print '<input type="hidden" name="Menge " value= "' . $row['qty'] . '">';
print '<input type="hidden" name="Schriftart " value= "' . $row['product'] . '">';
print '<input type="hidden" name="Farbe " value= "' . $row['color'] . '">';
print '<input type="hidden" name="Fett " value= "' . $row['fett'] . '">';
print '<input type="hidden" name="Kursiv " value= "' . $row['kursiv'] . '">';
print '<input type="hidden" name="Gesamtlaenge " value= "' . $row['laenge'] . '">';

}
print '<tr><td>
<input type="radio" name="Spiegelverkehrt" value="nein" checked>Normal<br>
<input type="radio" name="Spiegelverkehrt" value="Ja">innen<br></td></tr>

<tr><td>&nbsp;</td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA"><h5>Bitte senden an:</h5></font></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">Nachname:</font></td><td><input name="Nachname"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">Vorname:</font></td><td><input name="Vorname"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">Forum Nick:</font></td><td><input name="Nickname"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">Strasse:</font></td><td><input name="Strasse"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">PLZ:</font></td><td><input name="PLZ"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">ORT:</font></td><td><input name="Ort"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">LAND:</font></td><td><input name="Land"></td></tr>
<tr><td><font face="VERDANA,ARIAL,HELVETICA">Versand:</font></td><td>
<select name="Versand">
<option value="Post 2 EUR" checked>Deutschland 2 EUR</option>
<option value="Post 2 EUR" >Europa 3,50 EUR</option>
<option value="Post 2 EUR" >Welt 5,00 EUR</option>
<option value="Abholung">Hole ich ab</option>
<option value="Sammelbestellung">Sammelbestellung**</option>

</select>
</td></tr><tr><td><font face="VERDANA,ARIAL,HELVETICA">Sammelcode</font></td><td><input name="Sammelcode"><br>
** Nur bei Sammelbestellung<br>(Den Code anfragen)</td></tr>
<tr><td><INPUT type="submit" value="Absenden">
</tr></table>';

Bei der Lösung:
print '<form action="bezahl.php" method="post">';
und in der bezahl.php ist drin:
<?php
echo '<pre>';
print_r($_POST);
echo '</pre>';

?>
Dann kommt nur de letzte Artikel.
Bei mailto kommen alle.

@Matt
Das Sicherheitsproblem ist mir bekannt, allerdings ist das für ein Forum, und deswegen ist betrug eigentlich ausgeschlossen. Aber THX für Deine Besorgnis

c4
29.09.2005, 21:05:51
Was sollen denn diese Leerzeichen bei den Feldnamen (name="Schriftzug ")?

Ändere diese mal so ab: name="Schriftzug[]" und dann schau Dir $_POST nochmal an.

Afrika
30.09.2005, 11:33:46
Das sieht schon gut aus.
Array
(
[Schriftzug] => Array
(
[0] => test1
[1] => test2
)

[Menge] => Array
(
[0] => 1
[1] => 1
)
.
.
.

Kann ich die Ausgabe der Bestellungen denn nun irgendwie formatieren?
also das ich einen zusammenhängenden text bekomme?
Also so in der Art:
Schriftzug1 test1 Menge 1 ...
Schriftzug2 test2 Menge1 ...

xabbuh
30.09.2005, 12:41:08
Einfach die Arrays mit foreach durchlaufen:

<?php
foreach($_POST['Menge'] as $key => $data) {
printf('Schriftzug%d %s Menge %d', $key + 1, $_POST['Schriftzug'][$key], $_POST['Menge'][$key]);
}
?>

Afrika
30.09.2005, 13:34:01
Das klappt.
Wenn ich aber alle Daten haben möchte:
foreach($_POST['Menge'] as $key => $data) {
printf('Schriftzug%d %s Menge %d %s Schriftart %d
%s Farbe %d %s Kursiv %d %s Gesamtlaenge %d %s Spiegelverkehrt %d',
$key + 1, $_POST['Schriftzug'][$key], $_POST['Menge'][$key], $_POST['Schriftart'][$key],
$_POST['Farbe'][$key], $_POST['Kursiv'][$key], $_POST['Gesamtlaenge'][$key],
$_POST['Spiegelverkehrt'][$key]);
}

Dann kommt das hier:
Warning: printf(): Too few arguments in /srv/www/htdocs/.....

xabbuh
30.09.2005, 14:06:57
Du definierst mit %d und %s mehr Platzhalter als du letztendlich an Argumenten übergibst. Warum bentutzt du zum Beispiel d bei Farbe und Schriftart?

Afrika
30.09.2005, 14:46:10
Kann ich da denn beliebige Platzhalter nehmen, oder wie definiere ich das?

xabbuh
30.09.2005, 15:17:18
Kann ich da denn beliebige Platzhalter nehmen, oder wie definiere ich das?
Der Platzhalter gibt an, welchen Datentyp der eigentliche Wert hat, der hier eingesetzt wird.
-> http://www.php.net/sprintf

Afrika
30.09.2005, 15:35:43
OK, ich habs jetzt. THX

Afrika
30.09.2005, 16:36:55
Wie kriege ich denn jetzt die Daten, die mit printf ausgegeben werden in ein Array oder jedenfalls so, dass diese Daten komplett in einer Form weiterverarbeitet werden können?
Quasi als $text

xabbuh
30.09.2005, 20:40:15
Wie soll das Array denn aufgebaut sein?

Afrika
30.09.2005, 23:39:18
Habe es nun so:
<?php
foreach($_POST['Menge'] as $key => $data) {
$text = sprintf('Schriftzug%d %s Menge %d', $key + 1, $_POST['Schriftzug'][$key], $_POST['Menge'][$key]);
}
?>
Da kommt aber bei der Ausgabe wieder nur die letzte Bestellung

meikel (†)
01.10.2005, 06:00:42
> Da kommt aber bei der Ausgabe wieder nur die letzte Bestellung

Weil $text bei jedem Schleifenlauf immer wieder überschrieben wird. Logisch, daß da der letzte übrig bleibt.

Afrika
01.10.2005, 10:59:33
Und was kann ich dagegen tun?

meikel (†)
01.10.2005, 17:48:57
Und was kann ich dagegen tun?
Nachdenken. Ich weiß nicht mal, was Du mit den Daten veranstalten möchtest.

Stevie B.
01.10.2005, 22:25:39
Im Zweifel wieder ein Array setzen...

<?php
foreach($_POST['Menge'] as $key => $data) {
$text[] = sprintf('Schriftzug%d %s Menge %d', $key + 1, $_POST['Schriftzug'][$key], $_POST['Menge'][$key]);
}
foreach($text as $daten) {
print $daten."<br>";
}
?>

Afrika
04.10.2005, 14:30:36
Das hat geklappt.
THX