You are not logged in.

  • Login

1

Tuesday, December 22nd 2009, 8:48pm

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):

PHP Quellcode

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


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!

2

Tuesday, December 22nd 2009, 11:50pm

Vergiss sleep(). Benutze

Source code

1
header("Refresh: 5; url.de");

3

Wednesday, December 23rd 2009, 9:43am

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:

PHP 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.

PHP 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.

PHP 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,

PHP 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 :).

4

Wednesday, December 23rd 2009, 11:31am

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?

5

Wednesday, December 23rd 2009, 5:16pm

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.

6

Wednesday, December 23rd 2009, 7:22pm

Wohl ein Verständnisproblem. Bei sleep legst du den Webserver schlafen, beim Refresh-Befehl wartet der Browser. Überleg dir also mal wie das mit sleep gehen soll.

Similar threads

Social bookmarks