2010-08-24 10 views
61

Dopo aver chiamato l'intestazione della funzione di reindirizzamento, devo chiamare l'uscita o no?php - Devo chiamare exit() dopo aver chiamato Location: header?

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

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

?> 

si

+1

possibile duplicato di [Perché devo chiamare 'esci' dopo il reindirizzamento attraverso l'intestazione ('Posizione ...') in PHP?] (http://stackoverflow.com/questions/2747791/why-i-have-to-call- exit-after-redirection-through-headerlocation-in-php) –

risposta

63

Si dovrebbe assolutamente. Altrimenti l'esecuzione dello script non viene interrotta. Impostare un altro header da solo non è sufficiente per reindirizzare.

+0

Ciao Oliver, L'uscita termina l'esecuzione di script in formerror.php? Penso che la mia domanda sia quando chiamo "exit" dopo "header". quale script è interessato e non verrà più eseguito? Grazie – q0987

+1

exit interrompe sempre lo script corrente (nel tuo caso "fileA"). La pagina che stai reindirizzando a ("/formerror.php") non è influenzata affatto. Un reindirizzamento indica al browser di avviare una nuova richiesta HTTP nella posizione specificata in "Posizione". È praticamente lo stesso come fare clic manualmente su un collegamento a "formerror.php". – rgroli

+0

Grazie mille :) – q0987

17

Thank E 'generalmente buona norma exit; (nota - è una parola chiave, quindi non è necessario il ()) dopo l'invio di un colpo di testa Location:, dal momento che i browser dovrebbero reindirizzare al nuovo pagina e quindi un'ulteriore esecuzione dello script corrente è solitamente indesiderata.

7

Se non si dispone di alcun codice (PHP o HTML) sotto l'intestazione, non è necessario.

+0

Ciao aromawebdesign.com, Ho codice in formerror.php. È un problema? Grazie – q0987

+0

se si dispone di un qualsiasi tipo di codice dopo aver chiamato l'intestazione, è necessario chiamare die(); o exit(); – Hydrino

22

Si dovrebbe, proprio come @rgroli spiega. Se non si vuole perdere tempo con le staffe, si può anche chiamare header()INexit():

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

Location intestazione in HTTP/1.1 richiede sempre percorso assoluto see the note here.

Nota: Questo non è un hack, poiché il exit code viene utilizzato solo se il parametro è intero, mentre header() produce vuoto (esce con il codice = 0, l'uscita normale). Guardalo come exit_header() come dovrebbe essere dopo l'intestazione Location.

+1

Penso che intendessi * header '** IN **' exit() '*? ;) – yckart

+0

Questo non significa che stai passando l'output di 'header' come codice di uscita di' exit'? Non sarebbe un po 'indesiderabile? – ADTC

+0

@ADTC 'header()' in PHP restituisce void e exit code viene utilizzato solo se il parametro è intero. In questo caso interrompe semplicemente la generazione del codice in silenzio (che implica il codice di uscita = 0, uscita normale). –

5

l'uscita è una codifica errata.

se si sviluppa un progetto di grandi dimensioni e si desidera creare PHP Unit Testcases, l'uscita ti rovinerà.

exit termina lo script e il test di esecuzione! non v'è alcun modo per recuperare il test e dire se è riuscito o no ...

organizzare il codice della strada, che non v'è alcuna uscita e lo script finisce naturalmente se si utilizza un redirect ...

+1

Penso che sia un fallimento del software di test se non è in grado di eseguire la sandbox dello script che sta testando. È come un computer che si spegne perché uno script di shell termina con il comando 'exit'. – ADTC

+0

no, è solo sbagliato terminare qualsiasi cosa tra qualsiasi cosa. c'è una pila per un motivo dietro alla programmazione. tutto è iniziato con una chiamata di funzione e tutto si concluderà con una chiamata di funzione. – Umingo

+2

Non ho idea di cosa stai dicendo ': /' – ADTC

Problemi correlati