Weiterleitung mit Variablenübergabe

Alles, was PHP betrifft, kann hier besprochen werden.

Weiterleitung mit Variablenübergabe

Postby startist » 25. July 2008 12:51

Hallo,

ich habe ein Formular, dass per POST Daten sendet, dieses Formular ruft die gleiche Seite auf, in der es liegt. Wenn eine bestimmte Bedingung vorliegt, soll nun aber eine andere Seite aufgerufen werden. Nun, dies erledige ich mit header('Location: ...').

Wie kann ich aber die Werte aus dem Formular "weiterreichen"? Ich kann natürlich die Werte in der Session ablegen, aber das erscheint mir unkomfortabel. Wie kann man das besser lösen?

Grüße,
startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Nobbie » 25. July 2008 12:54

>Nun, dies erledige ich mit header('Location: ...').

Was der Grundfehler ist, denn mit header() soll man nur Seiten aufrufen, die entfernt (auf anderen Rechnern) liegen. Ansonsten ist header() totaler Quatsch, wird leider in vielen Foren propagiert (mangels Programmiererfahrung), denn es frißt viel zu viele Ressourcen und verursacht auch noch Probleme - u.a. Dein aktuelles Problem.

Viel besser und einfacher ist es, stattdessen include() gefolgt von exit() zu benutzen - schneller, besser und Deine Postvariablen stehen auch noch zur Verfügung.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby Wiedmann » 25. July 2008 13:29

Wie kann ich aber die Werte aus dem Formular "weiterreichen"? Ich kann natürlich die Werte in der Session ablegen, aber das erscheint mir unkomfortabel. Wie kann man das besser lösen?

Genau dafür sind Sessions da.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby startist » 25. July 2008 13:34

stattdessen include() gefolgt von exit() zu benutzen


Da ich immer nur die index.php aufrufe, geht das nicht. Ich kann diese Datei ja nicht in sich selbst einbinden.

Genau dafür sind Sessions da.


Na dann mach ich's eben doch über die Session ;)

Grüße,
startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Nobbie » 25. July 2008 13:54

startist wrote:
stattdessen include() gefolgt von exit() zu benutzen


Da ich immer nur die index.php aufrufe, geht das nicht. Ich kann diese Datei ja nicht in sich selbst einbinden.


Warum nicht?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby Nobbie » 25. July 2008 14:16

Wiedmann wrote:
Wie kann ich aber die Werte aus dem Formular "weiterreichen"? Ich kann natürlich die Werte in der Session ablegen, aber das erscheint mir unkomfortabel. Wie kann man das besser lösen?

Genau dafür sind Sessions da.


Eigentlich nicht - Sessions (und Cookies) sind da, um über Transaktionsgrenzen kontextbezogene Transaktionsdaten zu sichern. Aber: im Datenfluß liegt hier gar keine Transaktion vor, sondern die fehlerhafte Programmierung, ein Dokument via HTTP Header und dann doch (vom Benutzer unbemerkt) via Transaktion zu zeigen.

Das ist programmiertechnisch eine Katastrophe, denn dem Server stehen ja schon alle Daten zur Verfügung und nun muss nur noch die gewünschte Information gesendet werden - eine Weiterleitung via HTTP Header ist dazu überhaupt nicht notwendig.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby startist » 25. July 2008 21:04

Bitte achten Sie darauf,daß Sie die gerade ausgeführte Datei nicht durch den include-Befehl
erneut aufrufen, da es sonst zu einer Endlosschleife kommen kann.


Dies schreibt selfphp. Wie ist das denn nun?

Auch wenn mit $_SESSION[] die Variablenübergabe funktioniert, hab ich gerade das nächste Problem entdeckt: IE ignoriert den header(). Sowohl in Version 6.5 als auch in Version 7. Das Programm muss aber auch in diesen Browsern laufen (ich finde ständig neue Gründe, den IE zu hassen). :evil:

@Nobbie

Ich würde deinen Tipp gerne mal ausprobieren, hab da aber irgendwie eine Denkblockade. Ich muss bei dem Vorgang GET wie auch POST-Variablen übergeben? Mit include()? :?:
Und nach include() dann exit()? Ich kapiers nicht ... :(

Grüße, startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Xardas der Dunkle » 25. July 2008 21:13

Code: Select all
[..] Wenn eine bestimmte Bedingung vorliegt, soll nun aber eine andere Seite aufgerufen werden. [..]

Was sind das den zu Bedingungen?
Und wieso muss überhaupt alles neu geladen werden?
Wofür gibt es Funktionen, bzw. noch schöner Classen und Methoden :D

z.B.:
Code: Select all
if(!empty($_POST['id'])) {
     save();
} else {
     update();
}
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Nobbie » 25. July 2008 21:48

startist wrote:
Bitte achten Sie darauf,daß Sie die gerade ausgeführte Datei nicht durch den include-Befehl
erneut aufrufen, da es sonst zu einer Endlosschleife kommen kann.


Dies schreibt selfphp. Wie ist das denn nun?


So ist es nun. Wo ist Dein Problem - "zu einer Endlosschleife kommen kann". Das ist aber doch genau so möglich, wenn Du via header() die gleiche index.php in sich selbst aufrufst. Wo ist da der Unterschied?

startist wrote:Auch wenn mit $_SESSION[] die Variablenübergabe funktioniert, hab ich gerade das nächste Problem entdeckt: IE ignoriert den header(). Sowohl in Version 6.5 als auch in Version 7. Das Programm muss aber auch in diesen Browsern laufen (ich finde ständig neue Gründe, den IE zu hassen). :evil:


Hunderttausendprozentig ignoriert IE den header nicht! Aber ich ahne, dass Du einen Fehler im Script hast (Output vor der header() Anweisung) und ggf. mangels richtiger Fehlermeldungseinstellungen von PHP keine Meldung bekommst - das hat mit IE überhaupt nichts zu tun.

startist wrote:Ich würde deinen Tipp gerne mal ausprobieren, hab da aber irgendwie eine Denkblockade. Ich muss bei dem Vorgang GET wie auch POST-Variablen übergeben? Mit include()? :?:
Und nach include() dann exit()? Ich kapiers nicht ... :(


Du mußt GAR NICHTS übergeben, bei include() ist einfach "alles da". Wobei es ein weiteres Programmierverbrechen ist, sowohl GET wie auch POST Variablen zu erwarten - nur eine Methode wird zu einem Zeitpunkt ausgeführt, leider(!) stellt PHP dennoch beide Arrays zur Verfügung, was eigentlich völliger Blödsinn ist.

Ich verstehe nicht, was es daran nicht zu verstehen gibt, weil include() so popelseinfach ist, dass es doch gar nichts zu fragen gibt - wo ist das Problem?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby Xardas der Dunkle » 25. July 2008 21:52

Code: Select all
Wobei es ein weiteres Programmierverbrechen ist, sowohl GET wie auch POST Variablen zu erwarten - nur eine Methode wird zu einem Zeitpunkt ausgeführt, leider(!) stellt PHP dennoch beide Arrays zur Verfügung, was eigentlich völliger Blödsinn ist.


Es wird zwar nur eine Methode ausgeführt, aber du kannst trotzdem einer per POST aufgerufenen Seite GET-Parameter übergeben, was sogar sehr häufig genutzt wird.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Postby Nobbie » 25. July 2008 22:46

Xardas der Dunkle wrote:Es wird zwar nur eine Methode ausgeführt, aber du kannst trotzdem einer per POST aufgerufenen Seite GET-Parameter übergeben, was sogar sehr häufig genutzt wird.


Genau dieses "Verbrechen" meine ich. Und genutzt wird es nur von schlechten Programmierern, die nicht einmal wissen, was eigentlich der Unterschied zwischen GET und POST ist. Und benötigen tut man das ganze sowieso nicht.

Wenn ich im PHP Gremium säße, dann würde ich dafür stimmen, dass entweder das POST oder das GET Array zur Verfügung steht - passend zum Datenfluss des HTTP Protokolls.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby startist » 26. July 2008 09:19

Also, ich bin ja für alle Ideen erst einmal offen, also hab ich include() ausprobiert. Nun, in meinem Fall passierte genau das, was bei selfphp steht. Ist ja auch logisch, da die Bedingung, die zur Anweisung führt, dann stets wahr ist.

Na ja, am Ende wollte ich es mir mit der header() Funktion leichter machen. Ich werde dann wohl doch klassisch eine if() Bedingung ausführen und dann eine Funktion aufrufen, anstatt header() zu verwenden. Das macht nur meinen Code etwas unübersichtlich, da ich diesen nach einem Schema aufgebaut habe, nach dem ich arbeite. Und bei nunmehr mehr als 60 Dateien mit Klassen, Methoden, Funktionen, Templates etc. ist es gut den Überblick zu behalten.

Ich finde, wenn mir PHP die Möglichkeit gibt, GET und POST gleichzeitig zu nutzen, dann kann ich das auch tun. Schließlich wurde PHP letztendlich doch auch dafür entwickelt, um einen größeren Kreis von Leuten das Programmieren für Webserver zugänglich zu machen oder zu erleichtern. Gerade Autodidakten wie ich sind da dankbar für den relativ leichten Einstieg. :wink:

Ist aus meiner Sicht auch unsinnig, nicht beide Methoden gleichzeitig nutzen zu können. Mit GET steuere ich seit eh und je die Seite, POST nutze ich in der Regel für Formulare. Ich müsste bei Formularen jedesmal unsichtbare Felder erstellen, um die Steuerungsvariablen mitzusenden, wenn ich mich für eine Methode entscheiden müsste. Das wäre doch mehr Arbeit und eine mögliche Fehlerquelle mehr. Warum kompliziert, wenn's auch einfach geht ... :)

Grüße, startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Nobbie » 26. July 2008 09:56

>Na ja, am Ende wollte ich es mir mit der header() Funktion leichter machen.

Die würdest Du ja genauso verschachtelt aufrufen und dann stirbt der Browser ebenso. Auch dort muss eine Bedingung rein, denn ein bedingungsloser header() auf sich selbst geht genau so in die Knie.

>Ich finde, wenn mir PHP die Möglichkeit gibt, GET und POST gleichzeitig zu nutzen, dann kann ich das auch tun.

Ich halte es für einen Designfehler im PHP (auch das PHP Development ist nicht feherfrei) und es ist nie ausgeschlossen, dass solche Fehler mal irgendwann rausgebügelt werden - ähnlich wie die Entwicklung der register_globals Geschichte, das war auch mal überhaupt kein Thema, ab PHP6 kann man gar nicht mehr damit arbeiten. Und spätestens wenn vielleicht dieser GET/POST-Widerspruch auch rausgeworfen wird, arbeiten Deine Scripts nicht mehr.

>Ist aus meiner Sicht auch unsinnig, nicht beide Methoden gleichzeitig nutzen zu können.

Es ist völlig unsinnig, weil es ja die Abbildung des HTTP Requests darstellen soll. Und der kann entweder GET oder POST (oder auch HEAD usw.) sein - aber nicht mehrere auf einmal.

>Mit GET steuere ich seit eh und je die Seite,

Das halte ich ebenso für eine Seuche, die sich aus welchen Gründen auch immer eingebürgert hat. Da wird ein monströses Zentraldokument (index.php) mit tausenden von Variablen versorgt, um danach das ganze wieder auseinanderzupfriemeln und zu entscheiden, welche Aktion eigentlich WIRKLICH erfolgen soll - wozu braucht man dann noch das Attribut ACTION im FORM-Tag, wenn es eh immer dieselbe ist (index.php), aber dann doch so nicht gemeint ist. Total kaputt! Grausam zu warten (ein Dritter wird Deinen Code mit der Kneifzange nicht anfassen) und total unübersichtlich und schlecht programmiert.

Kontrollfluss und Datenfluss sind nicht erkennbar, sondern werden in kryptischen Steuervariablen gründlich versteckt, was zusätzlich zu grauenhaften URLs führt, die gefallen dann dem Entwickler auch irgendwann nicht mehr (Stichwort "Suchmaschinen"), und anstatt dann endlich ein Einsehen zu haben, dass das schlechter Programmierstil ist, wird dann auch noch ein Overhead oben drauf gesetzt, um mit Hilfe eines weiteren zentralen Steuermoduls plus Apaches mod_rewrite einen vernünftigen Kontrollfluss vorzusimulieren - HANEBÜCHEN!!

Und Autodidakten schauen sich dann diese grottenschlecht programmierten CMS an (meistens sind es CMS) und befinden dann, dass das wohl der Programmierstil ist, den man heutzutage modern nennt. In jeder halbwegs vernünftigen IT-Abteilung oder Softwareschmiede würde man Dich dafür lynchen und Du würdest nicht einmal das Konzept dazu bewilligt bekommen.

Alles, was überhaupt an "Steuerinformationen" relevant sein sollte, muss Kontext bezogen sein aus der Userinteraktion (und nicht aus dem Kontrollfluss) und das sind dann die sog. "Session-Daten". Die werden komfortabel mit dem PHP-eigenen Sessionhandling verwaltet und das ist auch schon alles, was an Transaktionsinformationen notwendig sein soll - und nicht irgendwelche GET-Variablen (oder Hidden Fields), die nicht vom User, sondern vom System gesetzt werden.

Sorry, das mußte ich mal los werden, aber diese Art von "Programmierung" ist das Ende der Programmierung! So lehrt und lernt das niemand(!) in der IT-Branche und/oder an der Universität - das ist irgendwie ein Geschwür, welches sich im WWW von alleine entwickelt und verselbständigt hat.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Postby startist » 26. July 2008 11:13

@Nobbie

Danke für deine Standpauke, ich kann damit leben und möchte meinen Progammierstil natürlich verbessern. Glücklicherweise fange ich dieses Jahr ein Medieninformatik-Studium an (auch wenn ich schon Mitte 30 bin :oops: ) Vielleichts hilfts ja ...

Leider hilft mir das bei meinem derzeitigen Projekt nicht weiter, da schon mehr als 100 Arbeitsstunden drin stecken. Zum Glück ist das ein reines Intranet-Projekt, wo für die Anwendung ein eigener Xampp auf einem eigenen Rechner installiert ist. Ein Update auf eine neuere PHP-Version ist dort sehr unwahrscheinlich.
Never Change A Running System ;)

Und warum soll man bei der Weiterentwicklung nicht auch auf Anwenderwünsche hören. Ich denke, du siehst das ein bischen zu einseitig von der IT-Seite (du scheinst ja was in die Richtung studiert zu haben). Einfache Anwendbarkeit für eine große Anzahl von Leuten ist doch auch ein Argument und ein Grund für den Erfolg von PHP.

Übrigens: Meine Index ist ziemlich klein und hat nur die Aufgabe, die richtigen Dateien einzubinden und den zurückgegebenen Inhalt samt Template auszugeben. Und auch meinen Code hab ich wenigstens durchkommentiert.

Ich bin natürlich "lernfähig" und will mich weiterentwickeln. Vielleicht kannst du nun nach deinem "Ausbruch" konkrete Tipps und Hinweise nennen, wie man das angeht, oder wo ich entsprechende Beispiele finde, um es später besser zu machen. Nenn mir bitte ein aus deiner Sicht hervorragendes Beispiel, dass ich mir mal in Ruhe ansehen kann.

PHP-Lernseiten gibt es eine ganze Menge in Web. Aber wie man konkrete und komplexe Projekte angeht, dafür gibts es schon weniger Seiten. Also schau ich mir natürlich an, wie es andere machen. So viele CMS arbeiten mit GET und POST gleichzeitig, dass man tatsächlich denken muss, das geht so (weswegen ich mir schon deshalb nicht vorstellen kann, dass dieser Fehler vom Gremium irgendwann entfernt wird). Auch in meinen Büchern sind solche Beispiele zu finden.

Grüße, startist
User avatar
startist
 
Posts: 55
Joined: 24. June 2008 14:10
Location: Dresden

Postby Nobbie » 26. July 2008 12:53

>Übrigens: Meine Index ist ziemlich klein und hat nur die Aufgabe, die richtigen Dateien einzubinden und den zurückgegebenen Inhalt samt Template auszugeben.

Genau - wieso steuerst Du nicht via action=.... diese Seiten direkt an? Wieso muss immer index.php angesteuert werden, nur um dann doch eine andere Seite aufzurufen?

Die index.php sollte idealerweise nur das sein, wozu sie gedacht ist: die Einstiegsseite.

100 Stunden mag Dir viel erscheinen, aber in Mannwochen ausgedrückt ist das noch nicht einmal 3 Wochen - also eigentlich nicht viel. Und der Aufwand, von den Steuervariablen wegzukommen und stattdessen direkt die gewünschte Seite anzusteuern, ist sicherlich erheblich kleiner - vor allem, wenn es sowieso schon strukturiert ist.

Dann brauchst Du auch nicht header() oder include() zu überlegen, sondern hast direkt das gewünschte Script angestoßen.

>Aber wie man konkrete und komplexe Projekte angeht, dafür gibts es schon weniger Seiten.

Das ist natürlich auch das größte Problem und das können selbst in der Industrie nur sehr wenige Programmierer (ich mache das seit über 20 Jahren). Ein vernünftiges Datendesign und Funktionsanalyse ist eigentlich Pflicht - aber genau das machen die allerwenigsten, und schon gar nicht die große Menge der Autodidakten.

Das ist aus meiner Sicht auch der Grund, warum im Internet immer mehr sehr schlecht programmierte Software frei angeboten wird (ohne Dich persönlich angreifen zu wollen).

>So viele CMS arbeiten mit GET und POST gleichzeitig, dass man tatsächlich denken muss, das geht so (weswegen ich mir schon deshalb nicht vorstellen kann, dass dieser Fehler vom Gremium irgendwann entfernt wird)

Ja, es funktioniert ja auch. Aber es ist ein Designfehler und darf eigentlich nicht als Programmierstil propagiert werden. Viele dieser Bücherschreiber wissen möglicherweise gar nicht, wie ein HTTP Request definiert wird und stattfindet.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 8 guests