Automatische weiterleitung beim Login!
gepostet vor 19 Jahre, 8 Monate von Asrac
Hi,
ich habe auf dem Server in nem PHPscript einen Link der auf ein anderes PHPscript weitergeleitet werden soll .
Sieht so aus:
header("Location: test2.php?u=$u&s=$s&time=".time());
Das geht auf dem PC daheim auf dem Localhost Prima.
Aber auf dem Server mit neuestem PHP und MySQL geht es nicht kommt folgender Fehlercode:
Warning: Cannot modify header information - headers already sent by (output started at /home/webservice/blabla/test.php:11) in /home/webservice/blabla/test.php on line 209
Ein Kumpel von mir hat den Tipp gegeben "Schreib es doch so...":
echo " self.location(\"test2.php?u=$u&s=$s\");";
Da kommt dann keine Fehlermeldung, aber weiterleiten macht er auch nicht.
Wer kann mir helfen eine Weiterleitung im Code zu setzten die Variablen übergiebt, damit einfach gesprungen werden kann auf ein anderes Script ohne einen Link drücken zu müssen?
Dringend Hilfe gesucht!
gepostet vor 19 Jahre, 8 Monate von Crafty-Catcher
gepostet vor 19 Jahre, 8 Monate von Gambler
Die Meldung kommt wahrscheinlich weil du vorher was mit ner Session machst oder mit Cookies?
Ansonsten halt per html nen refresh auf ne andere Seite. Kannst den HTML Code z.B. beim WBB Login finden.
gepostet vor 19 Jahre, 8 Monate von neit
Wenn du kreuz und quer Änderungen an den Headern machen willst mußt du einfach am Anfang des Skripts das Output-Buffering mit ob_start(); anwerfen und am Ende des Skriptes via ob_end_flush(); alles ausgeben. Dann kannst du header(); aufrufen wann und wo du willst, auch wenn schon Cookies oder dergleichen gesendet wurden.
gepostet vor 19 Jahre, 8 Monate von Asrac
Leute bitte.....
Ich will nicht im Head springen!
IM Code vom Script und nicht im META !
Nach einer Abfrage ob das Passwort erfüllt ist!
Also wenn if True ist!
Alles klar?
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
Du darfst den header-Befehl nicht nach einer Ausgabe von nur einem einzigen Code an den Browser schicken.
Also:
echo ( '' );
header ( 'Location: trula' );
ist NICHT möglich
gepostet vor 19 Jahre, 8 Monate von Asrac
Also nachdem das Formular mit login und Password vom User abgeschickt wurde, darf in dieser Funktion keine ausgabe mehr sein, auch wenn sie durch If anweisung nicht bearbeitet wird?
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
if ( !$_REQUEST [ 'login' ] )
{
echo ( '' );
}
else
{
header ( 'Location: trula' );
}
?>
Ist ok. Aber irgendwo wirst du ne Ausgabe haben. Evtl auch nur eine Leerzeile in einer deiner Dateien. Achte darauf, dass zu Beginn und zu Ende deiner inkludierten und deine Haupt-Datei keine überflüssigen Leerzeilen sind. PHP ist da etwas frickelig.
gepostet vor 19 Jahre, 8 Monate von neit
Also entweder lest ihr nicht was ich schreibe oder es ist zu unverständlich.
Ein einfaches ob_start(); am Anfang des Skriptes und man hat die ganze Problematik nicht!
Ausgabe des Output-Buffers am ende des Skriptes dann via ob_end_flush(); ...
gepostet vor 19 Jahre, 8 Monate von MannaZ
Original von neit
Also entweder lest ihr nicht was ich schreibe oder es ist zu unverständlich.
Ein einfaches ob_start(); am Anfang des Skriptes und man hat die ganze Problematik nicht!
Ausgabe des Output-Buffers am ende des Skriptes dann via ob_end_flush(); ...
Hört sich ja ganz praktisch an, aber ist diese Methode nicht sehr Performancefressend?
Wenn nicht, werde ich mir auch überlegen sie zu verwenden.
gepostet vor 19 Jahre, 8 Monate von Asrac
@neit,
Wie muß ich den Code einbinden und was bewirkt es genau?
Kenne das verfahren nicht und möchte auf meine Weiterleitung nicht verzichten.
Vor allem da es daheim auf meinem PC und dem Localhost dort funktioniert!
Wäre schön wenn du es mir erklären könntest!
Und bestehen dann Sicherheitslücken dabei?
gepostet vor 19 Jahre, 8 Monate von neit
Du mußt einfach irgendwo am Anfang deines Skriptes ob_start(); aufrufen. Dann kommen alle deine echo();'s und print();'s. Die werden dann allerdings nicht direkt ausgegeben sondern landen im Buffer. Das ermöglicht dir an jeder beliebigen Stelle z.B. Header- und Cookie-Funktionen zu verwenden.
Wenn dann alles andere erledigt ist erreichst du die ausgabe der Daten via ob_end_flush();. Am besten ist du schaust dir dazu nochmal das PHP-Manual an, gibt noch ne reihe weitere Funktionen die dabei interessant sein können.
Die Skripte werden dadruch eher schneller und ein Sicherheitsrisiko ist es schon garnicht. Ein weiterer Vorteil ist eine einfache Aktivierung von gzip via ob_start("ob_gzhandler");. Ich habe diese Funktionen biser immer als Grundlage aller meiner Skripte betrachtet.
gepostet vor 19 Jahre, 8 Monate von Kampfhoernchen
Ich darf mal kurz die PHP-API zitieren:
Anmerkung: HTTP/1.1 verlangt einen absoluten URI inkl. dem Schema, Hostnamen und absoluten Pfad als Argument von Location:, aber manche Clients akzeptieren auch relative URIs. Gewöhnlich können Sie mittels $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] und dirname() aus einem relativen Link einen absoluten URI selbst erstellen:
header("Location: http://".$_SERVER['HTTP_HOST']
.dirname($_SERVER['PHP_SELF'])
."/".$relative_url);
?>
Ich glaub nämlich nicht, dass vorher was ausgeben wird, wenns auf deinem localhost funktioniert. Immer absolute URIs verwenden.
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
@kampfhoernchen:
Es mag zwar nicht dem Standard entsprechen, aber relative Pfadangaben funktionieren in allen von mir getesteten Browsern (sogar lynx, der gibt allerdings ne Info heraus).
Was natürlich nicht heißen sollte, dass man sich nicht an die Standards halten braucht!
gepostet vor 19 Jahre, 8 Monate von Kampfhoernchen
Das liegt aber nicht am Client, sondern (so nehm ich an) am Webserver.
Beispiel. Local benutz ich Apache 2.0.irgendwas, auf meinem Server die neueste einser-Version von Apache.
Local macht ers mit den relativen uris, auf meinem Server nicht.
gepostet vor 19 Jahre, 8 Monate von Asrac
Danke an :
Kampfhoernchen
Neit
Das sind schon mal viele Hilfen die ich erstmal abarbeiten mu0, da ich gerade meine erste Alpha ins netz stelle und schon die ersten Probleme auftreten ohne das der erste Tester das Game betreten hat.
Dieses Gehört dazu! Ist zwar auch mit einem Link möglich aber weiterleitung ist einfach Estetischer.
Merci nochmal, ich teile euch das ergebnis noch mit!
:wink:
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
@Hörnchen:
Im Betrieb nutzen wir den Apache 1 ebenso und da klappt es. Naja ist ja auch egal, je näher man am Standard ist, desto besser wird es ;-)
Aber deine Info werde ich mal überprüfen, vielleicht gibt es dann doch Probleme bei einer Website. Danke
gepostet vor 19 Jahre, 8 Monate von Kampfhoernchen
Ich glaub man kann das irgendwo in der config von Apache einstellen, wie er das handeln soll. Mit absoluten is man aber immer auf der sicheren Seite.
gepostet vor 19 Jahre, 8 Monate von Asrac
hab am anfang des Scripts folgense Zeile reingestellt:
ob_start();
am ende das:
ob_end_flush();
?>
Erfolg 0
Hat leider nix gebracht!
Hatte gehofft so wird es was.
*heul*
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
Sicher, dass vor deinem ersten
gepostet vor 19 Jahre, 8 Monate von BLUESCREEN
Original von TheUndeadable
Sicher, dass vor deinem ersten
Irgendwo wird er da was ausgegeben haben - im Zweifelsfall Zeilenumbrüche von Leerzeilen oder andere Whitespaces.
Wenn man eh im HTTP-Header eine Location-Angabe hat, dann sollte es IMHO eh keine Ausgaben geben - auch nach dem Header nicht.
Außerdem steht doch schon in der Fehlermeldung, dass die Ausgabe in Zeile 11 deiner Datei begann:
output started at /home/webservice/blabla/test.php:11
gepostet vor 19 Jahre, 8 Monate von Asrac
Ja da habe ich noch was vor stehen.
Tüftel noch dran wie das besser zu machen ist damit nix mehr davor steht.
Aber ich kämpfe zur Zeit auf allen Fronten.
(sieh Topic Fehlermeldung)
Gedult bitte ich arbeite dran!
gepostet vor 19 Jahre, 8 Monate von Asrac
So!
Es geht jetzt, da ich das Script in 2 teile gespalten habe!
Aber wie bekomme ich den Kram hier in PHP eingebettet?
Will eigentlich ganz auf HTML verzichten in den Scripten!
Kann es mir jemand für obere Beispiel als Code zeigen?
gepostet vor 19 Jahre, 8 Monate von None
Öhm....das sind aber so die Basis PHP Grundlagen.
PHP führt nur aus was in oder oder <% %> steht. Ersteres ist Standard. Die andren musst du in der config einstellen.
Alles was nicht in diesen Tags steht wird einfach ausgegeben.
gepostet vor 19 Jahre, 8 Monate von Asrac
Eidiwei....
Das weiss ich alles selber!
Das meine ich doch nicht!
Wie php geöffnet und geschlossen wird ist mir nicht unbekannt!
In das Script selber will ich den HTML Code der ersten Zeilen einbetten und zwar ALS PHP-Code!
Geht es mich echo?
Und wenn ja wie?
gepostet vor 19 Jahre, 8 Monate von TheUndeadable
Falls du das 'HTML' in PHP ausgeben möchtest, empfehle ich dir die Variante der Vorlagen.
templates/header.html enthält in diesem Falle deinen Kopf
$szTemplate = join ( '', file ( 'templates/header.html' ) );
echo ( $szTemplate );
Wenn du die Sache natürlich nicht auslagern möchtest bietet sich folgende Lösung an:
echo ( <<< EOT
EOT
);
Am vernünftigsten ohne Vorlagen würde ich folgendes vorschlagen:
if ( loginok )
{
header ( 'Location: weiter.php' );
die;
}
?>
// Make dynamic part
?>
Zum HTML: Das was du HTML nennst, ich kein HTML, der korrekt Tag wäre:
gepostet vor 19 Jahre, 8 Monate von Asrac
aha...das ist doch mal ne Aussage!
Muß es erst mal wirken lassen !
Aber danke, damit kann ich mehr anfangen!
gepostet vor 19 Jahre, 8 Monate von BLUESCREEN
Original von TheUndeadable
if ( loginok )
{
header ( 'Location: weiter.php' );
die;
}
?>
(...)
Benutz entweder exit statt die, wenn du keine Fehlermeldung ausgeben willst.
"die" erwartet ein Argument.
gepostet vor 19 Jahre, 8 Monate von Pinzi
Also ich würde ehrlich gesagt an deiner Stelle erstma' nochn paar Tuts machen... Deine Kentnisse sehen bisher noch nich so überzeugend aus :/
gepostet vor 19 Jahre, 8 Monate von Kampfhoernchen
Probieren geht über Studieren!!!!
Für ein vernünftiges Browsergame würd ich jedoch ein Template-System einsetzen. Ich hab für mein Browsergame (und für einige andere Projekte) ein eigenes geschrieben, leider fehlt die Dokumentation noch völlig, deshalb is es für Außenstehende eigentlich nicht zu verstehen. Für jeden, der das nicht kann, empfehle ich die PHPLib (einfach mal danach googeln), von PHPNuke möchte ich abraten.