Scritto da davidonzo il 07/11/2006, in OpenSource
ATTENZIONE!
L'articolo che stai leggendo è stato scritto 2024 giorni orsono.
Le informazioni presenti potrebbero non essere aggiornate!
Ricorderete che qualche articolo fa mostrai una funzione di redirect che permetteva di non preoccuparsi dell'invio di header html, prima dell'evocazione della funzione.L'articolo che stai leggendo è stato scritto 2024 giorni orsono.
Le informazioni presenti potrebbero non essere aggiornate!
Per farlo, nel caso degli headers fossero già stati inviati, si usava il redirect HTML di tipo:
<meta http-equiv="refresh" content="0;url=url">
Se da un lato il tutto funziona senza troppi intoppi, dall'altro c'è da dire che non è bello vedere delle pagine internet con questo tipo di codice. E' proprio sconsigliato dal W3C.
Una funzione di redirect scritta su giusti presupposti di codificazione potrebbe essere questa.
function redirect($url,$tempo = FALSE ){
if($tempo == FALSE ){
header('Location:' . $url);
}else{
header('Refresh:' . $tempo . ';' . $url);
}
}
if($tempo == FALSE ){
header('Location:' . $url);
}else{
header('Refresh:' . $tempo . ';' . $url);
}
}
Così come scritta però rischiamo di far andare in errore l'applicazione se non stiamo attenti all'output che si genera prima dell'avvio della funzione.
Un esempio banale è il seguente:
<?php
echo "Stai per essere reindirizzato";
redirect('pagina.php',5);
?>
echo "Stai per essere reindirizzato";
redirect('pagina.php',5);
?>
Il codice sopra riportato restituirà l'infausto errore "Warning: Cannot modify header information - headers already sent by". La soluzione migliore è quella di scrivere il codice in modo tale che le istruzioni che contengono il comando header() siano inviate prima di ogni altra cosa!
Se però, dobbiamo metter mani su un'applicazione già bella e pronta e non abbiamo molta intenzione di riscriverla da zero stando attenti a queste cose, possiamo utilizzare un trucco: con ob_start() creiamo un buffer di tutto il codice HTML creato dal parsing. Con ob_end_flush() rilasceremo il buffer dove ci converrà.
Il nostro codice sopra riportato potrà essere scritto in questo modo.
<?php
//Avvio il buffering
ob_start();
echo "Stai per essere reindirizzato";
redirect('pagina.php',5);
//Interrompo il buffering e ne rilascio il contenuto
ob_end_flush();
?>
//Avvio il buffering
ob_start();
echo "Stai per essere reindirizzato";
redirect('pagina.php',5);
//Interrompo il buffering e ne rilascio il contenuto
ob_end_flush();
?>
Rilasciando il buffer dopo la funzione di redirect, gli header HTML saranno successivi al richiamo di redirect() che contiene altri header! Ed in questo modo eviterò l'errore.
Badate bene che il consigli riportato sopra è solo una scorciatoia. La funzione di base ha altri utilizzi e non è stata creata per utilizzi del genere.
Il consiglio che posso darvi è: usate ob_start() per lo scopo di cui sopra come soluzione temporanea. Le vostre applicazioni funzioneranno, ma non saranno ancora efficienti al massimo. Però avrete tutto il tempo per ripensare al codice di modo da evitare che istruzioni contrastanti siano richiamate in diverse parti.

















