di: Claudio Garau 02 Luglio 2010
Uno degli errori più frequenti che si verificano durante la realizzazione di applicazioni scritte in linguaggio PHP, consiste nel tentativo di inviare le header (intestazioni) dopo aver già spedito degli output HTML al browser; in generale un malfunzionamento del genere porta alla visualizzazione di una notifica simile alla seguente:
Warning: Cannot add header information - headers already sent by (output started at index.php:18)
Il messaggio porta con sé alcune informazioni importanti per identificare la tipologia di errore compiuto:
In questa breve trattazione verranno descritti alcuni accorgimenti per evitare che l'invio delle header si traduca in una notifica di errore.
Di seguito verrà proposto un semplice esempio di listato che può dare origine alla notifica oggetto di queste pagine:
<?php
// istruzione per la stampa di una stringa
echo "<h1>Output inviato al Browser<h1>";
// istruzione per il redirect verso un'altra pagina
header("Location: http://www.sitoweb.net");
?>
Il piccolo script appena mostrato svolge alcune semplici funzioni: stampa a video una stringa di testo e rindirizza il browser verso una risorsa diversa dalla pagina corrente.
In questo caso è semplice prevedere che, essendo la stampa di una stringa in tutto e per tutto un output HTML, il redirect determinato dalla funzione header() non avrà luogo in quanto non sarà possibile inviare al browser delle intestazioni successive.
Il rindirizzamento di una risorsa implica necessariamente l'invio di un'intestazione, per questo motivo la funzione header() deve essere utilizzata prima di introdurre markup o contenuti in una pagina; ci si chiederà a questo proposito: in che modo può essere utile inserire dei contenuti in una pagina che prevede un redirect? Si pensi per esempio ad una procedura di login che sortisce esito negativo, in questo caso lo sviluppatore potrebbe avere la necessità di notificare la mancata autenticazione prima di forzare il redirect alla pagina di login:
<?php
echo "Tentativo di autenticazione fallito";
header("Location: login.php");
?>
L'esecuzione del codice proposto non potrebbe che portare alla generazione di una notifica di errore, perciò in questi si preferisce affidare l'onere del redirect ad applicazioni client side concepite per esempio in JavaScript.
Si analizzi ora un altro esempio:
<?php header("Location: index.php"); ?>
Apparentemente si tratta di una semplice istruzione per il redirect verso una pagina definita dallo sviluppatore; come è possibile notare, la funzione header() non è preceduta da alcuna istruzione per la stampa a video o per l'invio di output al browser, eppure, anche in questo caso verrà generata una notifica di errore, infatti, il primo delimitatore del codice PHP è preceduto da uno spazio vuoto (" <?php") che è considerato anch'esso un output dal browser e impedisce il successivo invio di intestazioni.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |