Sekunden warten bis Weiterleitung folgt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Sekunden warten bis Weiterleitung folgt

    Hallo,

    ich hab leider ein Problem mit meinem Skript.
    Wenn ein Eintrag abgesendet wurde und alles erfolgreich klappt dann wird auf im Template ein Bereich noch aktiviert wo steht das der Eintrag erfolgreich war.
    Allerdings soll dann nach 5 Sekunden eine Weiterleitung erfolgen. Die Weiterleitung klappt mit header() wenn ich ob_start() und ob_end_flush() benutze. Nur das mit sleep() will nicht so wirklich.

    Hier erstmal das Skript (habe einige Überprüfung über die Formularfelder rausgelassen, die if-Anweisung würden jetzt hier keine Rolle spielen):

    Quellcode

    1. define('GLOBAL_INCLUDED', true);
    2. $vegb_root_path = dirname(__FILE__);
    3. require $vegb_root_path.'/global.php';
    4. ob_start();
    5. $information = false;
    6. $entry_added = false;
    7. if(isset($_POST['add_entry_submit']))
    8. {
    9. $addEntry = $gbook->addEntry($entry['entry_name'], $entry['entry_text'], $entry['entry_mail'], $entry['entry_website'], $entry['entry_IP']);
    10. if($addEntry == true)
    11. {
    12. $information = true;
    13. $information_text = $language['ADD_ENTRY_SUCCESSFULL'];
    14. $entry_added = true;
    15. }
    16. else
    17. {
    18. $information = true;
    19. $information_text = $language['ADD_ENTRY_ERROR'];
    20. }
    21. $smarty->assign($entry);
    22. }
    23. if($information)
    24. {
    25. $smarty->assign('information', $information);
    26. $smarty->assign('information_text', $information_text);
    27. }
    28. $smarty->display('entry.tpl');
    29. if($entry_added)
    30. {
    31. sleep(5);
    32. header('Location: index.php');
    33. ob_end_flush();
    34. }
    Alles anzeigen


    Wenn der Beitrag erfolgreich hinzugefügt wurde, wird $entry_added auf true gesetzt. Nach dem Smarty das Template ausgibt soll überprüft ewrden ob $entry_added true ist und demnach 5 Sekunden warten und auf index.php umleiten.
    Das Problem ist nun: Sobald ich auf absenden drücke, lädt er 5 Sekunden lang und ich werde direkt auf index.php geleitet ohne das die Ausgabe kam, das der Beitrag hinzugefügt wurde. Nachdem der Text darsteht soll das Skript 5 Sekunden warten und dann erst weiterleiten.

    Ich hab schon ausprobiert sleep(5); vor der if-Schleife zu setzen allerdings wartet er dann IMMER 5 Sekunden bevor er das Template ausgibt.

    Weis einer wie ich das regeln kann?

    Vielen Dank und fröhliche Weihnachten!
  • phillipgerard hat recht, ein Refresh im Header ist um einiges eleganter für einen Fall.
    Aber mal eine kurze Erläuteurung, warum er nicht das macht, was du willst:

    Quellcode

    1. ob_start();

    Ab hier fängst du an, sämtliche Ausagaben (ausgenommen der Header-Angaben) zu puffern, also lädt der Browser mindestens so lange, bis dein Skript auf ob_end_flush gestoßen ist.

    Quellcode

    1. sleep(5);

    hier schiebst du noch einmal zuästzlich 5 Sekunden rein, allerdings ist der Ausgabepuffer immer noch aktiv, also es wurde noch nichts an den Browser gesendet, ergo er lädt noch.

    Quellcode

    1. header('Location: index.php');

    hier wird die neuen Seite übergeben und der Browser wird umgeleitet. Diese Angabe wird direkt gesendet, da sie zu den Header-Angaben gehört, aber für deinen Fall nicht weiter wichtig,

    Quellcode

    1. ob_end_flush();

    Hier erfolgt erst die Ausgabe deiner ersten Seite. Ob davon jemals etwas im Browser (und sei es nur für ein paar ms) angezeigt wird, ist fraglich, da du ihm ja schon die neue Seite gesagt hast, die er laden soll.

    Hoffe, du verstehst was ich meine, denn es soll hier ja niemand dumm sterben :).
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Yeah, vielen Dank, mit dem Refresh 5; im header() Befehl geht es einwandfrei!

    Das ob_end_flush() muss aber dennoch nach header() stehen (wenn ich es davor setzte geht es nicht).

    Und warum das davor nicht geht ist mir jetzt auch klar :). Allerdings würds mich interessieren wie es funktioniert hätte ohne das Refresh 5; ?
    Wenn ich ob_end_flush() nach der Smarty Template ausgabe mache und dann in der if-Anweisung sage sleep(5) und header(index.php) sagt er ja das er den Header nicht senden kann.
    Ich habe schon probiert mit ob_end_clean() den Ausgabepuffer zu löschen allerdings krieg ich die Meldung das überhaupt keiner existiert.
    Benutzte ich die ob_Anweisungen irgendwie falsch oder wie läuft das?
  • Ich denke, ich weiß wo dein Problem liegt. Headerdaten müssen IIRC vor jeder Ausgabe an den Client stehen, also bevor du etwas sendest, was der Client im Browser sieht.
    Es funktioniert einfach nicht mit header() und sleep. Es schließt sich gegenseitig aus, da du weder zuerst den Inhalt senden, warten und dann header() senden kannst, noch erst header() senden und dann was anderes machen.
    Die einzigste Möglichkeit ist es, dem Server explizit zu sagen, dass er nach x Sekunden auf eine neue Seite gehen soll.
    Eine Alternative wäre eine meta refresh Angabe. Aber diese muss wiederrum vom Client untersützt sein, und ist somit nicht mehr zu 100% sicher.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.