• User

    Warning: Cannot modify header information

    Ciao a tutti, sono niubbi. Ho un problema che non so risolvere e ho notato un paio di post che ne parlano ma non ho capito come procedere, vorrei chiedere aiuto a voi:

    Uso per il Guestbook lo script "Advanced Guestbook".
    Tutto funziona ad eccezzione del file comment.php (che mi permette di aggiungere un commento ad una firma lasciata da un utente).

    Se lascio il file comment.php inalterato allora il problema non si pone, ma se lo modifico per integrarlo al layout del sito allora compare questo errore:

    Warning: Cannot modify header information - headers already sent by (output started at D:\Web\xampp\htdocs\uniposca4.it\guestbook\comment.php:8) in D:\Web\xampp\htdocs\uniposca4.it\guestbook\lib\comment.class.php on line 219

    Leggendo e cercando con Google ho capito che quando questo problema si presenta spesso è solo perchè prima del carattere <?php ci sono degli spazi o altri caratteri.

    In effetti io ho modificato il file per integrarlo nel sito e ho la necessità di spostare il codice del file in mezzo al documento, non posso lasciarlo all'inizio altrimenti non viene visualizzato dove vorrei.

    La cosa che mi lascia perplesso è che in un secondo sito in cui uso lo stesso script il problema non c'è. Eppure anche nel secondo sito il file è stato modificato e il codice dello script non si trova ad inizio file ma nel mezzo.

    Quindi nel mio sito ho l'errore, nell'altro invece no.
    Non so dove sbattere la testa, spero qualcuno mi possa dare una mano, ecco il codice del file comment.php che mi dà l'errore:

    [php]
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
    <meta name="generator" content="Adobe GoLive 6">
    <title>Guestbook » uniposca.it</title>
    <link rel="stylesheet" href="../styles/uniposca.css" type="text/css" >
    <script type="text/javascript" src="../script/global.js?v=364"></script>
    <script type="text/javascript" src="../script/menu.js?v=364"></script>
    </head>
    <body>

    <!-- codice HTMl del sito -->

    <!-- script guestbook -->
    <?php
    $include_path = dirname(FILE);
    require_once $include_path."/admin/config.inc.php";
    require_once $include_path."/lib/$DB_CLASS";
    require_once $include_path."/lib/image.class.php";
    require_once $include_path."/lib/template.class.php";
    require_once $include_path."/lib/vars.class.php";
    require_once $include_path."/lib/comment.class.php";
    require_once $include_path."/lib/phrase.class.php";

    $gb_com = new gb_comment($include_path);
    $gb_com->id = (isset($_GET["gb_id"])) ? $_GET["gb_id"] : '';
    $gb_com->id = (isset($_POST["gb_id"])) ? $_POST["gb_id"] : $gb_com->id;
    $gb_com->id = intval($gb_com->id);
    $gb_com->comment = (isset($_POST["comment"])) ? $_POST["comment"] : '';
    $gb_com->user = (isset($_POST["gb_user"])) ? $_POST["gb_user"] : '';
    $gb_com->pass_comment = (isset($_POST["pass_comment"])) ? $_POST["pass_comment"] : '';
    $gb_com->gb_captcha = (isset($_POST["gb_captcha"])) ? $_POST["gb_captcha"] : '';
    $gb_com->token = (isset($_POST["gb_token"])) ? $_POST["gb_token"] : '';
    $gb_action = (isset($_POST["gb_comment"])) ? $_POST["gb_comment"] : '';
    $gb_com->comment_action($gb_action);

    ?>
    <!-- /script guestbook -->

    <!-- altro codice HTMl del sito -->
    </body>
    </html>
    [/php]


  • User Attivo

    Ciao Sark e benvenuto sul forum GT,
    in php ci sono delle funzioni che ti consentono di manipolare l'header html, una sorta di codice nascosto che sta in testa ad ogni pagina html. Quando scrivi una pagina html/php questo header viene formato ed inviato prima del primissimo carattere di outoput (sia esso uno spazio o il tag <head> o quello che vuoi) pertanto se successivamente tenti di modificarlo, ottieni il messaggio d'errore che hai indicato.

    Nel tuo caso, tutto quello che c'è prima della stringa <?php è output e costituisce il tuo problema.

    Da quanto hai postato non è possibile capire dove venga modificato l'header né perché (è in tutti quegli include...) pertanto ti posso dare due tipi di soluzioni, la prima più pulita ed istruttiva e la seconda più sporca e veloce...

    1. Salva tutto l'htm che precede <?php in una variabile tipo $testo, quindi vai a cercare il primo output (un echo o un print) del codice php e subito prima metti echo $testo.

    2. Nella riga seguente <?php metti
      error_reporting (E_ERROR);

    che è un comando per dire a php di mostrare solo gli errori e non gli warning: quindi in questo caso il messaggio non lo vedresti più ma il problema rimarrebbe lì (la modifica degli header non funziona e non sai quando potrebbe intervenire...)

    Facci sapere come risolvi e quale strada scegli di percorrere! 😄
    :ciauz:


  • User

    Ciao Ceccus, grazie delle info. Dunque:

    Ho provato per prima cosa la soluzione 2) perchè mi sembrava la più rapida e indolore. In effetti adesso l'errore non lo da piu però lo script non completa la sua funzione.
    Cioè: il file comment.php permette di scrivere un commento, quando tale commento è stato scritto e si è premuto il tasto submit, lo script dovrebbe inserire il commento nel database e richiamare quindi il file index.php (cioè il file che mostra tutte le firme e i commenti.)
    Se applico la soluzione del punto 2) non mi da nessun errore però lo script non mi rimanda al file index.php e rimane invece in una pagina bianca.
    Il commento viene inserito, quindi il database viene aggiornato correttamente ma non avviene il redirect.

    Il punto 1) non l'ho provato perchè non ho capito come fare. Sono troppo niubbi e se puoi dovresti spiegarmelo in modo ancora piu facile.

    Rimane il mistero del fatto che lo stesso scritp, modificato piu o meno nello stesso modo, non mi da nessun problema sul sito della mia ragazza.

    ciao grazie.


  • User

    ci ho messo un po di tempo ma alla fine ho trovato una soluzione nel blog di un amico (bigthink).

    allora ho messo:

    
    <?php ob_start(); ?>
    
    

    in cima al file, come prima riga. poi ho messo:

     ob_end_flush(); 
    

    come ultima istruzione del codice dello script. per capirci se il codice originale era composto da 10 righe, ho messo questa come undicesima e prima del TAG di chiusura php ?>

    Adesso non mi da piu il problema in questione e lo script funziona in modo ottimale.
    Grazie dell'aiuto, ciao