2008-12-09 3 views
31

Wie kann ich eine PHP-Funktion auf eine bestimmte Website gehen lassen, wenn es fertig ist?Weiterleitung an angegebene URL bei PHP-Skriptabschluss?

Zum Beispiel:

<?php 
    //SOMETHING DONE 
    GOTO(http://example.com/thankyou.php); 
?> 

Ich würde wirklich gerne die folgende ...

<?php 
    //SOMETHING DONE 
    GOTO($url); 
?> 

ich so etwas wie dies tun wollen:

<?php 
    //SOMETHING DONE THAT SETS $url 
    header('Location: $url'); 
?> 

Antwort

61
<? 
ob_start(); // ensures anything dumped out will be caught 

// do stuff here 
$url = 'http://example.com/thankyou.php'; // this can be set based on whatever 

// clear out the output buffer 
while (ob_get_status()) 
{ 
    ob_end_clean(); 
} 

// no redirect 
header("Location: $url"); 
?> 
+0

Sie haben mich dazu geschlagen. Es ist erwähnenswert, dass, da Header nur gesendet werden können, wenn keine Ausgabe generiert wurde, die gesamte Seite/Anwendung möglicherweise in eine ob_start() eingebunden werden muss. –

+0

Wenn ich dies versuchte, erhielt ich diesen Fehler: "Warnung: Kann Header-Informationen nicht ändern - Header bereits gesendet von (Ausgabe gestartet bei example.php: 1)" Wissen Sie, warum dies passieren würde? – JoshFinnie

+0

Das bedeutet, dass Sie etwas vor ob_start() oder nach dem ob_end_clean() -Baustein ausgeben. Die Ausgabepufferung (die ob_ * -Funktionen) sorgt dafür, dass jede Ausgabe zwischengespeichert wird, so dass Sie sie entweder verwenden oder (wie in diesem Fall) später verwerfen können. Setzen Sie Ihren Code auf // tun Sachen hier –

13

Wenn "etwas getan" Keine Ausgabe über echo/print/etc einleiten, dann:

<?php 
    // SOMETHING DONE 

    header('Location: http://stackoverflow.com'); 
?> 
3
<?php 

// do something here 

header("Location: http://example.com/thankyou.php"); 
?> 
5

Beachten Sie, dass dies nicht funktionieren wird:

header('Location: $url'); 

Sie müssen dies (für variable Expansion) tun:

header("Location: $url"); 
+2

Oder natürlich: header ('Ort:'. $ Url); –

28

Man konnte immer benutzen Sie einfach den Tag um die Seite zu aktualisieren - oder vielleicht einfach das notwendige Javascript in die Seite am Ende zu legen, die die Seite umleiten würde. Man könnte sogar, dass in einer onload-Funktion, so dass, sobald seine fertigen wirft, wird die Seite umgeleitet

<?php 

    echo $htmlHeader; 
    while($stuff){ 
    echo $stuff; 
    } 
    echo "<script>window.location = 'http://www.yourdomain.com'</script>"; 
?> 
+0

Warum habe ich nicht daran gedacht! Danke für das Denken außerhalb der Box ... – JoshFinnie

+0

Das funktionierte gut für mich - Header wurden bereits aufgrund der vielen los in der CMS-Bereich gesendet, das war perfekt – Simon

+0

Schöne Antwort ..... Es funktionierte für mich .. –

0

vergessen Sie nicht, ein ‚sterben‘ nach Ihrem Anruf setzt die Umleitung vor dem Rest des Codes geschehen zu lassen Auf der Seite ist run warf. a. Wenn Sie Header-Funktionen weiter unten auf der Seite haben, überschreiben diese die weiter oben im Code.

b: Ich nehme an, Sie wollen nicht, dass der Rest des Codes auf der Seite ausgeführt wird und warum Sie diese Umleitung an erster Stelle [vielleicht] setzen.

Beispiel:

<?php 

// do something here 

header("Location: http://example.com/thankyou.php"); 
die(); 

//code down here now wont get run 

?> 
0

Hier ist eine Lösung für das Problem "Header bereits gesendet". Angenommen, Sie validieren und senden ein E-Mail an ein Formular. Stellen Sie sicher, dass der PHP-Code das Erste auf Ihrer Seite ist ... vor den Doctype- und Head-Tags und dem ganzen Jazz. Dann, wenn der POST wieder bei der Seite eintrifft, wird der PHP-Code zuerst kommen und nicht auf das bereits gesendete Header-Problem stoßen.