code vereinfachen_ bitte helfen!
paul
- php
hallo zusammen, ich habe folgenden code geschrieben:
$beitrag_03='';
if(isset ($_POST['beitrag_03'])) {
$beitrag_03 = '."&beitrag_03="'.$_POST['beitrag_03'];
das funktioniert auch alles ganz wunderbar. nun möchte ich diese bedingung aber für ca. 10 variablen erstellen und bin mir sicher, dass das besser geht, als 10 mal den ganzen "müll" hinzuschreiben. wie macht das der smarte programmierer? mit einer schleife? oder einer funktion?
bitte um beispiel, wenn möglich!
paul
Grüße,
hallo zusammen, ich habe folgenden code geschrieben:
$beitrag_03='';
if(isset ($_POST['beitrag_03'])) {
$beitrag_03 = '."&beitrag_03="'.$_POST['beitrag_03'];
du wandelst hier anscheinend "POST in GET" (salopp gesagt) um - darf man den Sinn erfahren?
MFG
bleicher
--
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_-
[Die Essenz der Egomanie](http://double.iblogger.org/)
![](http://img296.imageshack.us/img296/9641/minibannerso7.jpg)
[ie:{ fl:( br:< va:| ls:\[ fo:# rl:? n4:? ss:| de:> js:| ch:| sh:( mo:| zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3C+va%3A%7C+ls%3A%5B+fo%3A%23+rl%3A%3F+n4%3A%3F+ss%3A%7C+de%3A%3E+js%3A%7C+ch%3A%7C+sh%3A%28+mo%3A%7C+zu%3A%7C)
du wandelst hier anscheinend "POST in GET" (salopp gesagt) um - darf man den Sinn erfahren?
naja, ich hab ein formular, dieses schick ich mit POST "an sich selbst" ab und überprüfe die eingegebenen werte. wenn diverse bedingungen erfüllt werden, leite ich zu einer anderen datei weiter, die die angegebenen (GET-) parameter (datenbankmäßig) weiterverarbeitet. ist das etwa verkehrt?
Grüße,
naja, ich hab ein formular, dieses schick ich mit POST "an sich selbst" ab und überprüfe die eingegebenen werte. wenn diverse bedingungen erfüllt werden, leite ich zu einer anderen datei weiter, die die angegebenen (GET-) parameter (datenbankmäßig) weiterverarbeitet. ist das etwa verkehrt?
nein - ist auch ein weg - aber du kannst ggf. die Funktionen der Weitervearbeitung bedingt einbinden - das erspart weiterleiten?
MFG
bleicher
Hallo Paul,
...überprüfe die eingegebenen werte. wenn diverse bedingungen erfüllt werden, leite ich zu einer anderen datei weiter, die ... weiterverarbeitet. ist das etwa verkehrt?
IMHO ja. Beim Programmieren sollte auch immer effizient verfahren werden. Die Daten sollten also, wenn sie im Script validiert wurden, sofort verarbeitet werden. Jede erneute Anfrage bringt auch Datenverkehr auf Protokollebene mit sich, der nicht sein muss und zum einen die Wartezeit verlängern – aber auch zu Fehler führen kann, wenn beispielsweise die Verbindung abreißt.
+-----------+ +-----------+
| Server | | Server |
+-----------+ +-----------+
| |
htmlformular htmlformular
↓ ↓
+-----------+ +-----------+
| Browser | | Browser |
+-----------+ +-----------+
| |
POST daten POST daten
↓ ↓
+-----------+ +-----------+
| Server | | Server | → Verarbeitung
+-----------+ +-----------+
|
Umleitung
↓
+-----------+
| Browser |
+-----------+
|
GET daten
↓
+-----------+
| Server | → Verarbeitung
+-----------+
Dazu sind sicher nur ein paar wenige Anpassungen notwendig, um effizient zu verfahren. Damit der Code der Validierung von der Verarbeitung getrennt bleibt, was die Übersichtlichkeit fördert, so wie es ja bis jetzt auch der Fall ist, bietet sich include() (oder auch require()) an.
Zu Deinem Eigentlichen Ansinnen, mehrere Formulardaten zu validieren, mache Dir klar, dass $_POST ja bereits ein Array ist, was Du mit einer Kontrollstrukturen abarbeiten kannst: http://de2.php.net/manual/de/language.control-structures.php
Gruß aus Berlin!
eddi
Moin!
»» du wandelst hier anscheinend "POST in GET" (salopp gesagt) um - darf man den Sinn erfahren?
naja, ich hab ein formular, dieses schick ich mit POST "an sich selbst" ab und überprüfe die eingegebenen werte. wenn diverse bedingungen erfüllt werden, leite ich zu einer anderen datei weiter, die die angegebenen (GET-) parameter (datenbankmäßig) weiterverarbeitet. ist das etwa verkehrt?
Ja, das ist verkehrt.
Zum einen: Eine GET-URL darf nur begrenzt lang werden. Diese Begrenzung ist in der existierenden Serversoftware begründet, eine Begrenzung in irgendeinem Standard existiert nicht, deshalb kann man auch nicht exakt sagen, welche Längen noch funktionieren. Deine Feldnamen sehen aber nun gerade so aus, als ob sie längeren Text enthalten würden, deshalb also auch potentiell zu lang werden könnten.
Zweitens: GET und POST haben auch einen technischen Sinn. GET ist dann einzusetzen, wenn die Ausführung des Requests auf dem Server nur lesende Operationen durchführt, aber nichts dauerhaft verändert. POST hingegen sollte zum Einsatz kommen, wenn datenverändernde Operationen durchgeführt werden.
Wenn du die Aufgabe vernünftig durchführen willst, dann führst du in deinem per POST aufgerufenen Skript alle Operationen durch, die Daten schreiben, und leitest danach erst weiter auf ein Skript, welches die erfolgreiche Ausführung dieser Operation meldet. Dann kann der Benutzer diese Erfolgsseite so oft reloaden, wie er will, ohne ständig neue Datensätze anzulegen. Bei deiner jetzigen Variante würde er mit jedem Reload neue Datensätze schreiben.
Außerdem hast du bei der Bildung der URL (die ja sowieso überflüssig wird) einen ganz wichtigen Aspekt vergessen: Escaping! In dem Textfeld können Zeichen eingegeben werden, die in der gebildeten URL Sonderbedeutung haben. Ohne Escaping würde bei ungünstiger Texteingabe dein ganzer Weiterleitungsmechanismus einfach scheitern - ärgerlich für die Anwender. Escaping ist aber auch für die Absicherung gegen Angriffe eine sehr wichtige Maßnahme.
- Sven Rautenberg
Hello,
Außerdem hast du bei der Bildung der URL (die ja sowieso überflüssig wird) einen ganz wichtigen Aspekt vergessen: Escaping! In dem Textfeld können Zeichen eingegeben werden, die in der gebildeten URL Sonderbedeutung haben. Ohne Escaping würde bei ungünstiger Texteingabe dein ganzer Weiterleitungsmechanismus einfach scheitern - ärgerlich für die Anwender. Escaping ist aber auch für die Absicherung gegen Angriffe eine sehr wichtige Maßnahme.
Wieso escaping?
Müssten die Parameter nicht für den URi codiert werden?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Moin!
Wieso escaping?
Müssten die Parameter nicht für den URi codiert werden?
Genau - das nennt sich Escaping.
- Sven Rautenberg
Hello,
Wieso escaping?
Müssten die Parameter nicht für den URi codiert werden?Genau - das nennt sich Escaping.
Da bin ich anderer Meinung.
Unter Escaping verstehe ich die Umschaltung zwischen Sonderbedeutung und Textbedeutung eines Zeichens (Befehls, ...) durch Voranstellen eines Maskierungszeichens ("Escape-Characters")
http://de.wikipedia.org/wiki/Maskierungszeichen
aber _ohne_ das betroffene Zeichen selber zu ändern.
Unter Codierung (hier URL-Codierung) verstehe ich das Ändern der Zuordnung zwischen Code und Bedeutung, was dem Austauschen von Zeichen mit Sonderbedeutung gegen andere gleich kommt.
Das Escaping lässt ich am Ziel einfach durch das Entfernen des einen einzigen (eventuell im Text mehrfach auftretenden) Escape-Characters wieder entfernen, während ein codierter Text eine Rückkodierung erforderlich macht, also mehrere Zuodnungen zwischen "Transportbitmuster" und ursprünglicher Bedeutung vorhanden sind. Es wird eine Transformationstabelle erforderlich (oder eben ein Algorithmus, der diese ersetzt).
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
hallo zusammen, ich habe folgenden code geschrieben:
$beitrag_03='';
if(isset ($_POST['beitrag_03'])) {
$beitrag_03 = '."&beitrag_03="'.$_POST['beitrag_03'];
>
> das funktioniert auch alles ganz wunderbar. nun möchte ich diese bedingung aber für ca. 10 variablen erstellen und bin mir sicher, dass das besser geht, als 10 mal den ganzen "müll" hinzuschreiben. wie macht das der smarte programmierer? mit einer schleife? oder einer funktion?
Der nutzt Arrays.
Um Werte bereits in $\_POST als Array zu bekommen, hängst du eckige Klammern an den Feldnamen in deinem Formular an:
name="feldname[]"
Und wenn du den Index gleich vorgeben willst (wenn mehrere Daten"sätze" bestimmter Struktur übergeben und die Zusammengehörigkeit sichergestellt werden soll) - dann nutzt du name="feldname[0]", name="feldname[1]" o.ä.
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
»» ~~~php
»» $beitrag_03='';
»» if(isset ($_POST['beitrag_03'])) {
»» $beitrag_03 = '."&beitrag_03="'.$_POST['beitrag_03'];
»»
> Um Werte bereits in $\_POST als Array zu bekommen, hängst du eckige Klammern an den Feldnamen in deinem Formular an:
> name="feldname[]"
> Und wenn du den Index gleich vorgeben willst (wenn mehrere Daten"sätze" bestimmter Struktur übergeben und die Zusammengehörigkeit sichergestellt werden soll) - dann nutzt du name="feldname[0]", name="feldname[1]" o.ä.
aha, also ein array im array?
würde der code für das obrige beispiel dann etwa so aussehen?
~~~php
$beitrag_03='';
if(isset ($_POST['beitrag[03]'])) {
> »» $beitrag_03 = '."&beitrag_03="'.$_POST['beitrag[03]'];
und das ganze dann in eine schleife für jeden beitrag[] packen? oder lieg ich jetzt ganz falsch??
Hi,
würde der code für das obrige beispiel dann etwa so aussehen?
if(isset ($_POST['beitrag[03]'])) {
Jein, nicht ganz.
$_POST mittels print_r ausgeben lassen, Struktur anschauen - dann sollte es klar werden.
MfG ChrisB
Hallo,
»» if(isset ($_POST['beitrag[03]'])) {
Jein, nicht ganz.
$_POST mittels print_r ausgeben lassen, Struktur anschauen - dann sollte es klar werden.
und Vorsicht mit führenden Nullen! Sobald ein Ausdruck mit einer führenden Null als Zahl interpretiert werden soll, bedeutet das oktale Notation.
Also:
006 == 6
007 == 7
008 ungültig
009 ungültig
010 == 8
011 == 9
...
020 == 16
077 == 63
So long,
Martin
Hi Martin,
ergaenzend:
008 ungültig
009 ungültig
ist aber in PHP == 0. Eine ungueltige Ziffer und alles nachfolgende wird ignoriert, siehe Handbuch, erste "Warnung"-Box. Und zwar ohne Warning oder Notice - der Himmel weiss, warum...
Viele Gruesse,
der Bademeister
Hallo,
»» 008 ungültig
»» 009 ungültig
ist aber in PHP == 0. Eine ungueltige Ziffer und alles nachfolgende wird ignoriert, siehe Handbuch, erste "Warnung"-Box. Und zwar ohne Warning oder Notice - der Himmel weiss, warum...
danke für diesen wertvollen Hinweis, das wusste ich selbst auch noch nicht. Ich hätte das als schwerwiegenden Fehler (wie ein Parse Error) eingestuft, der zum Abbruch des Scripts führen sollte.
Ciao,
Martin
Hallo Paul,
entweder Du änderst das HTML-Formular wie von ChrisB vorgeschlagen. d.h. aus <input name="beispiel_01"
...> wird <input name="beispiel[]" ...> und aus <input name="beispiel_02" ...> wird ebenfalss <input name="beispiel[]" ...> usw.
Dann kommen die Werte als array an und können mit einer Schleife durchlaufen werden:
foreach($_POST['beispiel'] as $wert)
{
// tu was mit dem $wert
}
oder Du läßt das Formular wie es ist und 'konstruierst' die abzufragen Variablen.
Das geht aber nur, wenn es wirklich immer exakt die gleiche Anzahl Variablen sind (hier 10). Man könnte auch beliebig viele Variblennamen erstellen und die Schleife dann abbrechen, sobald eine Varible nicht mehr existiert.
Vorausgesetzt, das erste Form-Feld heisst 'beispiel_01', das letzte '..._10':
for($i=1;$<=10;$i++)
{
$z = $i > 9 ? '0' . $i : $i;
$varname = 'beispiel_' . $z;
$wert = $_POST[$$varname];
// tu was mit dem $wert
}
oder für unbekannt viele Formfelder beispiel_01 bis beispiel_xx
$i=1;
do
{
$z = $i > 9 ? '0' . $i : $i;
$varname = 'beispiel_' . $z;
if(exist($_POST[$$varname])
{
$wert = $_POST[$$varname];
$wertExistiert = true;
$i++;
// tu was mit dem $wert
}
} while ($wertExistiert)
Gruß vom foomaker
super, danke für die exakte beantwortung meiner frage:-))