Scritto da davidonzo il 24/09/2006, in OpenSource
ATTENZIONE!
L'articolo che stai leggendo è stato scritto 836 giorni orsono.
Le informazioni presenti potrebbero non essere aggiornate!

E' da un po' che non scrivevo nel blog : - ) . Dai che ho pure tante storielle da raccontarvi. Tassisti abusivi con il vezzo di guidare sul marciapiede, fornitori folli con stravaganti idee del descrivere il proprio lavoro. Ma tutto questo lo leggerete prossimamente, perchè ora il blog mi serve da segnalibro ; - ) .

Ho perfezionato una semplice funzioncina di redirect, utilizzabile in qualsiasi applicazione PHP. Il problema principale che si ha in questi casi è stare attenti al che la pagina che reindirizza, non abbia ricevuto altri header. Ovverto altre intestazioni, altro conenuto...
Questo perchè il redirect in PHP è fatto tramite una funzione molto semplice, che permette di inviare un'intestazione particolare, che reindirizza ad altra pagina.

La funzione di redirect in PHP è di base molto semplice. Quando decidiamo di inviare il browser ad altra destinazione eseguiamo il comando:

//Per reindirizzare ad un sito esterno
header( "Location: http://www.sitodiarrivo.it" );

//Per reindirizzare ad una pagina diversa dello stesso sito
//Ed in questo esempio, contenuta nella stessa directory
header( "Location: pagina.php" );


Tutto ciò funzionerà se al momento dell'esecuzione del comando, la pagina non ha ricevuto altri header. In caso contrario ci verrà restituito il noioso errore: "Cannot modify header information - headers already sent by...", seguito dal nome del file e dal numero di riga in cui è stato inviato il precedente input di header.

Per controllare se altri header sono stati inviati, ci viene in soccorso lo stesso PHP, con la funzione headers_sent(). Questa restituisce un booleano con valore TRUE se gli header sono stati inviati, FALSE in caso contrario.

Ma c'è anche un'altra cosa da tenere in considerazione. Con la funzione header( "Location: $url" ) sopra vista, il redirect è immediato. Spesso invece si vuole reindirizzare dopo un tot di secondi, di modo tale che l'utente visualizzi ed abbia il tempo di leggere un avviso di redirezionamento.

Per fare il tutto e scegliere se ridirezionare direttamente o dopo qualche secondo, senza preoccuparsi che altri header siano stati inviati, basta una piccola funzioncina : - )

function redirect($url,$tempo = FALSE ){
 if(!headers_sent() && $tempo == FALSE ){
  header('Location:' . $url);
 }elseif(!headers_sent() && $tempo != FALSE ){
  header('Refresh:' . $tempo . ';' . $url);
 }else{
  if($tempo == FALSE ){
    $tempo = 0;
  }
  echo "<meta http-equiv=\"refresh\" content=\"" . $tempo . ";" . $url . "\">";
  }
}


Commentiamola un po'!

Ho una funzione con due parametri: l'url a cui ridirezionare che è parametro necessario, e il tempo di attesa prima del redirect che può essere anche omesso (ovvero essere FALSE ).

Se non sono stati inviati altri header e se voglio un redirect diretto, allora uso la funzione più semplice ed immediata : - ) : header associata al parametrio "Location".

Se non sono stati inviati altri header e voglio qualche secondo di attesa prima del redirect, allora userò sempre la funzione header, ma associata al parametro "Refresh", a cui posso dare un tempo di attesa prima dell'esecuzione.

Se sono stati mandati altri header, allora userò il redirect in HTML, facendo attenzione ad una cosa. Il comando HTML vuole il parametro tempo definito, per cui se io non l'ho stabilito, questo si setterà automaticamente a 0.

Utilizzare la funzione è molto semplice: basta richiamarla con un:

redirect('indirizzo',secondi);


Laddove vogliamo che avvenga il tutto!

Hai trovato l'articolo interessante?
Sottoscrivi il Feed RSS per essere informato automaticamente degli ultimi aggiornamenti!
 
.Commenti rss
# 1
Sempre più modniubbone? : - D
Di Zizio  (Inviato il 03/10/2006 @ 11:16:06)
# 2
Eh, magari, non c'ho il tempo nemmeno per grattarmi la panza in questo periodo : - (
Di davidonzo  (Inviato il 03/10/2006 @ 20:25:18)
# 3
Grazie per questo articolo... ; - )
Di Apocalyps  (Inviato il 16/03/2007 @ 23:49:15)
# 4
Scusa ma come fai ad inserire una variabile $tempo? Dovresti sapere che non puoi assegnare numeri a variabili, ne tantomeno sostituire la variabile con il numero dei secondi... E cmq questa funzione non l'avevo mai sentita...
Di Expo  (Inviato il 25/06/2007 @ 00:18:27)
# 5
@ Expo: perchè non potrei assegnare una variabile con valore numerico?

Basta scrivere:

$tempo = 15;

Ed il redirect parte dopo 15 secondi.

Fra l'altro se vuoi una funziona un po' più ottimizzata, leggi qui: http://www.davidonzo.com/dblog/articolo.asp?articolo=368
Di davidonzo  (Inviato il 25/06/2007 @ 08:37:07)
# 6
grazie, davvero molto utile!
Di Rob  (Inviato il 07/08/2007 @ 09:57:20)
# 7
Ho inserito il tuo codice in una piccola applicazione, ma in fase di caricamento della pagina mi dà questo errore:

Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /var/www/tasks/task_new.php on line 19

La riga incriminta è l'ultima:

echo "<meta http-equiv="refresh" content="" . $tempo . ";url=" . $url . "">";

manca qualcosa ?

Grazie
Di Roberto  (Inviato il 02/07/2008 @ 19:29:52)
# 8
Ciao Roberto,

Colpa mia. Corretto nel post:

echo "<meta http-equiv=\"refresh\" content=\"" . $tempo . ";" . $url . "\">";

Questo funziona.
Di davidonzo  (Inviato il 03/07/2008 @ 11:16:02)


I commenti possono essere moderati.
Se non lo vedi comparire subito non reinserirlo più volte.
Grazie per la gentile collaborazione.