Poison of the Cursed wrote:Habe ich bei der Weiterleitung was falsch gemacht?
Gelinge ausgedrückt: JA. Aber nicht nur da.
Das ganze Script ist grauenhaft falsch programmiert- es tut mit Leid das so sagen zu müssen. Offensichtlich hat es das Script vorne und hinten nicht getan, weswegen Du wahrscheinlich das Output-Buffering eingeschaltet hast (ob_start()) - dadurch ist die grundsätzlich vollkommen falsche Programmierung nicht ganz so offensichtlich und in der Tat scheint das Script wenigstens auf dem lokalen PC, wo Client und Server identisch sind, halbwegs zu laufen.
In der echten Welt kann es nicht laufen. Es ist durch und durch falsch programmiert.
Erst einmal die einfachen Dinge, um überhaupt solche Scripts später noch einmal zu verstehen:
a) Code innerhalb von if-Anweisungen werden eingerückt, um einen "Tab" (das ist je nach Einstellung 4 oder 8 Leerstellen). Bei geschachelteten if-Anweisung ist entsprechend geschaltet weiter einrzurücken.
b) wenn eine if-Abfrage zu einem logischen Programm-Ende führt, macht man KEINEN else-Zweig auf, sondern schreibt in den if-Block am Ende "exit()" und beendet damit das Script (was ja auch logisch so gewünscht ist).
Und nun zum Thema ob_start() und header()-Weiterleitungen:
a) es ist Unsinn, ob_start() zu benutzen, um Fehlermeldungen zu unterdrücken (Was bei Dir aber der einzige Grund ist). Als erstes nimmst Du das heraus. Und tust es NIE WIEDER hinein, erst wenn das Script vollkommen fehlerfrei läuft, dann könntest Du das tun. Aber für Programmieranfänger empfehle ich das nicht, weil es ihnen noch mehr die Logik des Programmes verschleiert.
b) es ist ebenso Unsinn, mit der header()-Funkion eine "Weiterleitung" auf ein Script zu veranlassen, was auf dem gleichen Server liegt, oder gar auf sich selbst. Scripte, die man heranziehen will, werden mit include() eingebunden, niemals mit header(). Nimm auch das komplett heraus, auch das führt dazu, dass Du die Programmlogik nicht bzw. falsch verstehst. Wenn die header()-Funktion in dieser Weise aufgerufen wird, passiert viel mehr und etwas ganz anderes, als Du Dir unter einer "Weiterleitung" vorstellst. Das könnte ich jetzt genau erklären, aber zunächst brauch man das gar nicht zu verstehen, nimm es erst einmal heraus.
Du mußt Dir unbedingt im klaren darüber sein, wie die Kommunikation zwischen Client (Browser) und Server (Apache und PHP) stattfindet. Wenn Du im Browser eine URL eingibst, fordert dieser den entsprechenden Server auf, die gewünschte Seite zu senden. Das tut Apache und der Inhalt dieser Seite wird vom Browser angezeigt. Die Verbindung zwischen Browser und dem Server ist dann geschlossen, Du könntest sogar das LAN-Kabel aus der Wand oder aus dem Router ziehen (oder WLAN ausmachen), das macht alles gar nichts. Wenn Du im Browser nun einen Link anklickst, oder einen Button drückst, dann sendet Browser wieder eine Anfrage an einen Server, oft ist es der gleiche Server wie davor. Davon weiß dieser Server aber nichts, der hat das komplett vergessen, dass Du vor paar Minuten schon einmal etwas angefordert hast. Er schickt Dir wieder eine Seite (bzw. macht das vielleicht mit Hilfe von PHP, weil Du ein PHP Script angefordert hast) und wieder wird sofort die Verbindung geschlossen, der Server vergisst sofort wieder alles und Du siehst im Browser, was er Dir gesendet hat.
Diese Dinge wie Cookies und Sessionvariablen sind Hilfsmittel (die ich jetzt auch noch nicht erläutere), wie man sich mit Hilfe von PHP beispielsweise "merken" kann, ob dieser Client (Browser) schon mal diesen Server und diese Seite angefragt hat und man damit ggf. den Client "wiedererkennen" kann. Das kann Apache von sich auch nicht, der tut nur saudoof immer dasselbe und weiß von nichts. Und im Prinzip mußt Du auch so denken lernen: Dein PHP Script senden IMMER eine vollständige Seite und sonst nichts. Möglicherweise wird das gleiche PHP Script kurz darauf erneut vom gleichen Anwender aufgerufen, die Sessions und Cookies ermöglichen es Dir, dieses zu erkennen bzw. zu verwalten und darauf zu reagieren. Je nachdem kannst Du dann mit dem gleichen Script eine andere Seite senden - aber immer dran denken: eine ganze HTML-Seite senden und sonst nichts.
Ein guter Programmierstil ist es dabei, NICHT lauter echo-Kommandos in sein Script zu bauen, sondern beispeislweise vorgefertige HTML Seiten zu bauen, wo der ganze Seiteninhalt drin steht und an den Stellen, wo eine Meldung oder ein variabler Inhalt steht (Benutzername zum Beispiel), da schreibst Du in den HTML Code keine festen Wert, sondern PHP Code zur Ausgabe einer Variablen. Das könnte so aussehen:
- Code: Select all
<html>
....
<body>
<p>Willkommen sehr geehrter <?php echo $name?>!</p>
....
</html>
Nun mußt Du im PHP Script die Variable $name mit dem gewünschten Wert versehen, machst Du auch sonst alles notwendige, was Du für die Verarbeitung brauchst, und ganz am Schluss machst Du einen
- Code: Select all
include "datei.html"
und danach kommt nur noch der Abschluss des PHP Script durch "?>"
Da man oft verschiedene Seiten anzeigen will, die sich so stark unterscheiden, dass man das nicht mehr nur durch einfache Variablen in den Griff bekommt (eben genau wie bei Deinem Login), dann baut man verschiedene HTML Dateien, mit verschiedenen Namen, baut die Programmlogik so, dass man verschiedene Dinge prüft, und am Ende jeder Prüfung (if-Abfrage), die eine bestimmte Seite zur Ausgabe als Folge hat, macht man wieder den include (mit dem gewünschten Dateinamen) und dann direkt danach einen "exit()". Damit ist dieser Programmzweig abgeschlossen.
Gewöhne es Dir also auch ab, mit echo die HTML Ausgabe zu machen (nur im HTML Dokument, wo die Variablen ausgegeben werden, da sind sie erlaubt, aber nicht im eigentlich PHP Script), sondern gib stattdessen immer ganze HTML Seiten aus und beende sofort danach das PHP Script.
Wenn man ganz "fortgeschritten" programmiert (aber das braucht nicht unbedingt zu sein), dann wird man sogar die verschiedenen includes auf verschiedene Dateien nicht mehr benötigen, sondern auch den Dateinamen selbst in eine Variable stecken und dann wirklich nur noch ganz am Ende des PHP Scripts einen einzigen include machen, und zwar auf diesen Variablennamen:
- Code: Select all
---
include $datei;
?>
Solche HTML Dateien, wo nur an einzelnen Stellen PHP Variablen auftauchen, nennt man übrigens "Template". Du wirst nun lernen, selbst mit solchen Templates zu arbeiten, anstatt mit echo einzelne Fragmente irgendwo hinzuschreiben, die irgendwo im Nirwana landen, weil ob_start() die Ausgabe unterdrückt...
Also, nimm das ernst, beherzige diese Dinge und versuche es ganz neu auf diese Weise. Du wirst Deinen eigenen Programmcode viel besser verstehen lernen als heute.
P.S.: Das bedeutet NATÜRLICH AUCH, dass Du den ganzen HTML Klumpatsch, der im Moment noch in Deinem login.php drin steh (quasi alles ab Zeile 4), auch aus dem login.php herausnimmst. Das hat dort nichts verloren. Das gehört in das (oder in die) Templates, die Du im Verlauf der login-Prüfungen anzeigen willst. In PHP Scripten sollte nur PHP drin stehen. In den Templates steht dagegen das ganze HTML und ein bißchen PHP, da wo man Variablen eingefügt hat.