2010-08-24 5 views
61

Nach dem Aufruf der Redirect-Funktion Header, sollte ich Ausgang aufrufen oder nicht?php - Soll ich exit() nach dem Aufruf von Location: header aufrufen?

<?php // fileA 
$urlFailToGoTo = '/formerror.php'; 

if (sth) 
{ 
    header(sprintf("Location: %s", $urlFailToGoTo)); 
    exit(); //should I call exit() here? or return? 
} 

?> 

Danke

+1

mögliches Duplikat von [Warum muss ich nach der Umleitung über den Header ('Location ..') in PHP 'exit' aufrufen?] (http://stackoverflow.com/questions/2747791/why-i-have-to-call- exit-nach-redirection-through-headerlocation-in-php) –

Antwort

63

Sie sollten auf jeden Fall. Andernfalls wird die Skriptausführung nicht beendet. Das Umleiten eines anderen Headers allein reicht nicht aus.

+0

Hallo Oliver, Beendet der Exit die Ausführung des Skripts in formeror.php? Ich denke, meine Frage ist, wenn ich nach 'Kopfzeile' 'exit' aufrufen. Welches Skript ist betroffen und wird nicht mehr ausgeführt? Vielen Dank – q0987

+1

Exit unterbricht immer das aktuelle Skript (in Ihrem Fall "DateiA"). Die Seite, auf die Sie umleiten ("/formerror.php"), ist überhaupt nicht betroffen. Eine Umleitung weist Ihren Browser an, eine neue HTTP-Anfrage an den Ort zu senden, den Sie in "Ort" angegeben haben. Es ist im Prinzip das gleiche wie manuell auf einen Link zu "Formeror.php" klicken. – rgroli

+0

Vielen Dank :) – q0987

17

Es ist im Allgemeinen gute Praxis exit; (Anmerkung - es ist ein Schlüsselwort ist, so dass Sie die () nicht brauchen) nach einem Location: Header senden, da Browser soll in den neuen umleiten Seite und somit ist eine weitere Ausführung des aktuellen Skripts in der Regel unerwünscht.

7

Wenn Sie keinen Code (PHP oder HTML) unter Header haben, müssen Sie nicht.

+0

Hallo aromawebdesign.com, Ich habe Code in Formerror.php. Ist das ein Problem? Vielen Dank – q0987

+0

Wenn Sie eine beliebige Art von Code haben, nachdem Sie Header aufrufen, sollten Sie sterben(); oder exit(); – Hydrino

22

Sie sollten, genau wie @rgroli erklärt. Wenn Sie möchten, mit Klammern nicht die Mühe machen, können Sie auch header()INexit() anrufen:

if(sth) exit(header("Location: http://example.com")); 

Location-Header in HTTP/1.1 erfordert immer absolute Pfad see the note here.

Hinweis: Dies ist kein Hack, da die exit code wird nur verwendet, wenn der Parameter integer ist, während header() Leere erzeugt (es beendet mit Code = 0, normale Ausfahrt). Betrachten Sie es als exit_header() Funktion wie es nach Location Header sein sollte.

+1

Ich glaube du meintest * 'header' ** IN **' exit() '*? ;) – yckart

+0

Bedeutet das nicht, dass du die Ausgabe von 'header' als Exitcode von' exit' übergibst? Wäre das nicht etwas unerwünscht? – ADTC

+0

@ADTC 'header()' in PHP gibt void zurück und exit code wird nur verwendet, wenn der Parameter integer ist. In diesem Fall wird die Code-Generierung still gehalten (impliziter Code = 0, normaler Ausgang). –

5

Ausgang ist schlechte Codierung.

Wenn Sie jemals ein großes Projekt entwickeln und PHP Unit Testfälle erstellen wollen, wird exit Sie vermasseln.

Beenden beendet das Skript und Ihren laufenden Test! es gibt keine Möglichkeit, den Test und sagen wiederherzustellen, wenn es oder nicht ausgefallen ist ...

Ihr Code die Art und Weise organisieren, dass es keine Ausgabe und das Skript endet natürlich, wenn Sie eine Umleitung verwenden ...

+1

Ich denke, das ist ein Fehler der Testsoftware, wenn es das Skript, das es testet, nicht sandboxieren kann. Es ist wie ein Computer, der heruntergefahren wird, weil ein Shell-Skript mit dem Befehl 'exit' beendet wurde. – ADTC

+0

nein, es ist einfach falsch, irgendetwas zwischen irgendetwas zu beenden. es gibt einen Stapel aus einem Grund hinter dem Programmieren. alles begann mit einem Funktionsaufruf und alles soll mit einem Funktionsaufruf enden. – Umingo

+2

Ich habe keine Ahnung, was Sie sagen ': /' – ADTC

Verwandte Themen