Newsgroup: it.comp.www.php
Titolo: Chiarimento su problema header()

Ciao a tutti.
Ho rilevato un problema in una piccola applicazione che non riesco a
comprendere, spero in un aiuto.
 Dunque, le poche pagine di questa applicazione condividono una
intestazione che comprende un logo, alcuni dati utente (recuperati da
database) ed il menu di navigazione.
 Per semplificarmi la vita ho predisposto un file header.php che
contiene l'html di tale intestazione; tale file lo includo in ogni
pagina.
 La prima istruzione di questo file è una session_start(), senza
alcuno spazio o quant'altro possa disturbare, ed in effetti, in locale
tutto il meccanismo funziona più che perfettamente.
 Una volta portato sul server remoto ottengo continuamente il classico
messaggio 'headers already sent (output started) etc...'.
 Ho provato a togliere l'html dell'intestazione dal file incluso, ed a
riportarla nelle singole pagine, e tutto funziona anche in remoto.
 L'unica differenza rilevante che ho scovato nel tentativo di capire
(attraverso il phpinfo) è il safe_mode attivato in remoto e
disattivato in locale.
Spero di avere spiegato il problema al meglio.
Vi ringrazio in anticipo.
Ciao
Raffaele

 disattivato in locale.
Controlla bene il codice. Il messaggio di errore dovrebbe dirti
esattamente dove e' stato iniziato l'output.
Se in locale hai l'output buffer attivo il problema non verra'
visualizzato. Controlla anche error_reporting e display_errors.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

visualizzato. Controlla anche error_reporting e display_errors
E' vero, in locale ero inconsapevolmente 'protetto'.

 il php; ma com'è possibile?
Ma l'include lo metti prima o dopo di session_register();?
uno script a questa maniera:
<?php
session_register();
include 'nomefile.html';
?>
è corretto, invertito no. Niente spazi o ritorni a capo prima di <?php,
devono essere i primi caratteri del file.

 Ma l'include lo metti prima o dopo di session_register();?
Intendi session_start()?


 
Maledizione ero rimasto mentalmente al posto precedente...
Certo, session_start();, chiedo venia...
-- 
Stéphane Bisinger
Webmas... well...

 parsare il php; ma com'è possibile?
Posta il codice.


Posta il codice.
Ecco il codice completo del file incluso:
<?PHP
session_start();
if (!isset($_REQUEST['id']) || empty($_REQUEST['id']) ) {
   echo "<h5>Manca il SID</h5>";
   exit;
} elseif ($_REQUEST['id']!=session_id()) {
   echo "<h5>SID!=id sessione corrente</h5>";
   exit;
} elseif  ( !isset($_SESSION['admin_refer_id']) ||
!isset($_SESSION['admin_loc_id']) ||
!isset($_SESSION['admin_loc_nome']) ||
!isset($_SESSION['admin_refer_nome']) ) {
   echo "<h5>Mancano dei parametri</h5>";
   exit;
} else {
   $id=$_REQUEST['id'];
   $admin_refer_id=$_SESSION['admin_refer_id'];
   $admin_refer_nome=ucwords($_SESSION['admin_refer_nome']);
   $admin_loc_id=$_SESSION['admin_loc_id'];
   $admin_loc_nome=ucwords($_SESSION['admin_loc_nome']);
}
$pag=(isset($_REQUEST['pag'])) ? $_REQUEST['pag'] : 'home' ;
$titolo=$titles[$pag]['titolo'];
?>
......HTML.......

 Ecco il codice completo del file incluso:
Quale e' il codice del file che include?


Quale e' il codice del file che include?
Ecco il codice del file che include (che poi richiama se stesso alla
fine)
<?PHP
include "header.php";
include "config_gestori.inc.php";
include '../../funzioni/functions.php';
....................................... // e se le operazioni
precedenti hanno buon fine:
header("Location: $_SERVER[PHP_SELF]?id=$id&amp;pag=images");
exit;
?>
.....HTML ......

 
include 'header.php'; contiene HTML vero?
Poi come fa mandare header("Location...");?
Č lě il problema!


 ?>
Inserisci ob_start(); prima del primo include e ob_end_clean(); prima
di header.


È lì il problema!
Cerco di spiegare meglio:
1) Al primo ingresso, il file che include presenta un form.
2) se l'utente fa partire il form, la pagina si ricarica e, intuendo
che è settata una variabile POST, attiva le operazioni necessarie.
3) Qui sta l'inghippo: per evitare eventuali reload della pagina (con
conseguente ripetizione delle medesime operazioni ad libitum), il php,
se le operazioni si concludono con successo, effettua il benedetto
-header- verso se stesso, passando il SID tralaltro.
4) La pagina che include si ricarica, includendo il file header.php che
semplicemente, come ho detto, autentica l'utente e stampa a video le
intestazioni (si contiene dell'html per rispondere finalmente).
Quando faccio partire il form, la pagina si ricarica e compie le
operazioni senza problemi, ma quando parte lo header, si impalla e non
capisco perché.

 capisco perché.
Perche' stai usando la funzione header dopo aver gia' inviato
dell'output, esattamente come dice il PHP.


dell'output, esattamente come dice il PHP.
Forse mi confondo con le sessioni allora, che di norma non vogliono
alcun carattere prima della chiamata, ma accettano pur sempre del
codice php 'innocuo'.
Il mio codice non produce output a video, né stampa messaggi di errore
aut successo.
Insomma se utilizzo header fuor della prima riga, mi par di capire
(parola grossa: capire...), devo sempre utilizzare l'ob?
In ogni caso un grazie a tutti e due per le delucidazioni.
Ciao
Raffaele

 codice php 'innocuo'.
header() funziona come session_start(), non vuole output prima di essere
chiamata, come è scritto sul manuale del php. Ci sono anche altre
situazioni simili e queste riguardano sessioni, cookies e header puri.
In parole povere queste funzioni aggiungono informazioni
all'intestazione della pagina che vengono elaborate dal browser, ma se
tu hai già mandato i contenuti, ovviamente non può mandare altre
intestazioni. ob_start() e ob_end_clean() aggirano l'ostacolo, ti
rimando al solito alla documentazione di PHP per i dettagli.


 (parola grossa: capire...), devo sempre utilizzare l'ob?
No, e' sufficiente non inviare output prima di usare le funzioni che
usano gli header (escludendo l'uso dell'output buffer).
-- 
I am what I am, I do what I can
