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.
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);
 }
}

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);
?>

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();
?>

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.
Hai trovato l'articolo interessante?
Sottoscrivi il Feed RSS per essere informato automaticamente degli ultimi aggiornamenti!
 
.Commenti rss
# 1
Hello mr. Davidonzo, sono nuovo di qui ma volevo subito fare una domandina complessa...
Esiste un modo per inviare un file xml ad un server esterno e interpretare la risposta senza mostrare gli xml all'utente?
Esemspio: io invio un xml ad un server sicuro della mia banca con i dati di una transazione (carta di credito, prezzo etc.) e questo mi risponde con un xml che io vedo su browser e che mi dice "transazione completa" oppure respinta con una serie di codici della banca che indicano il tipo di errore o di regole usate. Ma un utente non deve vedere questo file, come lo interpreto?
Inoltre in giro ho visto il comando XMLHTTPrequest ma ho visto che è di un complicato... e poi in giro è mal spiegato.
Avresti una soluzione per questo nuovo visitatore del tuo blog?
(puoi prenderla anche come sfida personale... eh eh eh).
Grazie comunque anche solo del tempo concessomi...
Di regrunge  (Inviato il 10/11/2006 @ 15:55:59)
# 2
Ciao regrunge!
Dovresti risolvere proprio con l'oggetto XMLHTTPrequest : - )

Ecco un link più che interessante: http://antirez.com/articoli/spaghettiajax.html
Di davidonzo  (Inviato il 15/11/2006 @ 13:20:19)
# 3
Thanks!
Di regrunge  (Inviato il 18/11/2006 @ 20:13:49)
# 4
buongiorno
dopo l'invio di un form vorrei che si aprisse una determinata pagina di ringraziamento.
Tieni presente che con l'invio del form succede quanto segue:
invio di email con i dati inseriti
invio dei dati a mysql
mi manca la possibilità di fare aprire una pagina di ringraziamento
Di Gigi  (Inviato il 02/11/2009 @ 10:51:27)
# 5
@ Gigi: le soluzioni sono varie. Puoi, dovo le operazioni di cui sopra, ridirezionare ad una pagina di ringraziamento. Oppure puoi ricaricare la stessa pagina, facendo visualizzare invece della form il testo di ringraziamento, quindi se la richiesta è POST e la risposta dallo script è corretta, vai di ringraziamento.

Anche AJAX può aiutarti in tal senso.
Di davidonzo  (Inviato il 02/11/2009 @ 10:56:31)


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