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:
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.
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:
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.
//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.
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…
Ciao regrunge!
Dovresti risolvere proprio con l’oggetto XMLHTTPrequest
Ecco un link più che interessante: http://antirez.com/articoli/spaghettiajax.html
Thanks!
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
@ 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.