Newsgroup: it.comp.www.php
Titolo: $_SESSION sotto IIS

Nella conversione di un programma da WinXP/Apache/Mysql a
Win2k/IIS/MSSQL mi sono imbattuto in un errore che non riesco a
risolvere.
Una pagina web ha due pulsanti : uno esporta i dati visualizzati in un
file excel mentre l'altro visualizza quando e' stato creato il
database. Entrambi aprono una nuova pagina (per mezzo di una
windows.open in js), hanno bisogno di caricare le variabili di
sessione e quindi nelle prime righe sono uguali.
----script che crea file excel
<?php
  session_set_cookie_params(0);
  session_cache_limiter('no-cache'); 
  session_start();
  include("configg.inc.php");
  include("getvars.inc.php");
  etc...
----script che mostra info db
<?php
  session_set_cookie_params(0);
  session_cache_limiter('no-cache');
  session_start();
?>
<html><head><title>Database info</title>
<link rel="stylesheet" TYPE="text/css" HREF="db.css"></head>
<body>
<?php
  include("configg.inc.php");
  include("getvars.inc.php");
  etc...
Entrambi richiamano il configg.inc.php (il file di configurazione) e
poi il getvars.inc.php. Questa e' la routine che carica le variabili
eventualmente passate con i POST e crea le varie variabili in base al
contenuto dell'array $_SESSION
---- getvar.inc.php
<?php
  // Copy variables posted with POST into superglobal $_SESSION
  include("common.inc.php");
  reset ($_POST);
  set_error_handler("eh");
  while (list ($k, $v) = each ($_POST))
    {
    $_SESSION[$k] = $v;
    echo "sono nel while--";
    }
  //echo $pippo;
  $ClCod = $_SESSION['ClCod'];
  $CChar = $_SESSION['CChar'];
  $CouId = $_SESSION['CouId'];
  //echo $pluto;
  $CurId = $_SESSION['CurId'];
  $CurPg = $_SESSION['CurPg'];
Nella common.inc.php vengono create funzioni di utilizzo comune a
tutti gli script che pero' qui non vengono richiamate e quindi si puo'
ignorare. La routine di error handling visualizza solo il messaggio di
errore con il dump delle variabili.
Il problema e' che il programma che dovrebbe creare il file di Excel
trova l'array $_SESSION completamente vuoto mentre l'altro trova tutte
le info. Come mai ?
Ho fatto varie prove, e :
- togliendo il set_error_handler ogni valore che cerco di caricare
dalla $_SESSION provoca un Notice : Undefined index: xxxx
- cosi' com'e' adesso (con error handler, la echo nel while e i //
davanti a echo pippo e pluto) crea errore non appena cerca di leggere
$_SESSION['ClCod']. Nel ciclo while non ci passa mai ma questo e'
giusto in quanto non mando valori nuovi.
- creando l'errore con la echo $pippo vedo che l'array $_SESSION e'
stato creato correttamente
- creando l'errore con la echo $pluto vedo che anche le prime tre
variabili sono state create usando i valori contenuti in $_SESSION
In sostanza, se lo script e' esente da errori non trova la $_SESSION
mentre se c'e' un errore allora la $_SESSION la trova e la usa.
Nel caso possa servire :
- quando forzo l'errore con echo $pippo o $pluto vedo che l'array
[_COOKIE][PHPSESSID] e' definito mentre manca quando l'errore e'
causato dalla mancanza di $_SESSION.
- il due file php.ini (quello sotto xp/apache e sotto 2k/iis) sono
indentici (a parte le ovvie differenze sulle directory)
Ovviamente quanto sopra funziona alla grande in xp/apache. Dove puo'
essere il problema ? Configurazione ? Permessi ? Incompatibilita'
IIS/PHP ? Perche', se l'errore lo forzo io, vedo le variabili mentre
se non ci sono errori non le trova ?
Grz in anticipo
ciao

   set_error_handler("eh");
Invece di usare un error handler perche' non tenti di scrivere del
codice che non sollevi alcun notice?
---
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.

codice che non sollevi alcun notice?
Ed e' quello che faccio. Vuoi vedere l'error handler ? Eccotelo, come
vedi serve solo a visualizzare il messaggio di errore in modo piu'
leggibile.
function eh($type, $message, $file, $line, $context)
  {
  echo "\n<pre><h1>Error!\n</h1>An error occurred while executing this
script.";
  echo "\n<br>Error code     : $type"; 
  echo "\n<br>Error message  : $message"; 
  echo "\n<br>Script name    : $file";
  echo "\n<br>Line number    : $line"; 
  echo "\n<br>Variable state :<br>";
  print_r($context); 
  echo "</pre><hr>";
  die();
  }
Tengo a precisare che sia sul pc di sviluppo sia sul server
accessibile dagli utenti il livello dei messaggi d'errore e' sempre al
massimo. I warning non sono minimamente accettabili e sono considerati
errori.
Chiarito cio', hai idea del perche' tutto funzioni con XP/Apache e non
con 2K/IIS ? E perche' forzando un errore l'array $_SESSION esiste
mentre se tolgo l'errore l'array sparisce ?
Grazie, ciao

 dalla $_SESSION provoca un Notice : Undefined index: xxxx
Il che significa che non stai effettundo il POST sulla pagina che crea
il file excel.
-- 
I am what I am, I do what I can


il file excel.
Verissimo, infatti nel primo messaggio ho scritto ''Nel ciclo while
non ci passa mai ma questo e' giusto in quanto non mando valori
nuovi''
Quando l'utente selezione un valore nuovo viene fatto il POST,
memorizzato nella $_SESSION etc..etc.. Ci sono pero' dei casi dove
c'e' bisogno di ricaricare le variabili pur non avendo fatto nulla
(quindi nessun POST) e uno di questi casi e' quando apro una finestra
esterna. Lei chiaramente conosce cosa deve fare ma puo' capire su
quali dati deve lavorare solo ricaricando le variabili.
Per tua info, sto adesso lavorando sul modulo che porta l'output in
pdf dove la logica iniziale (passaggio delle variabili) e' sempre la
stessa e .. funziona. E' solo nel caso nel programma che crea l'excel
che non funziona. Cosa puo' distruggere in modo cosi' brutale la
$_SESSION ?
Grz, ciao

 $_SESSION ?
Stai forse usando header location da qualche parte?
IMHO dovresti ripartire da zero cercando di simulare il problema con
script molto piu' semplici.


script molto piu' semplici.
Provero', certo che non mi aspettavo un problema cosi' complicato
passando da Apache a IIS.
Grz comunque
ciao

Stai forse usando header location da qualche parte?
Forse ho quasi trovato il perche'. La seconda finestra, quella dove
viene eseguito lo script che crea il file XLS, ha un session_id
diverso da quello della finestra principale e quindi niente variabili.
Questo non succede quando si apre la finestra che crea il PDF.
ciao

 Questo non succede quando si apre la finestra che crea il PDF.
Risolvi il tutto passando il SID in modo esplicito.
-- 
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


Risolvi il tutto passando il SID in modo esplicito.
Trovato anche chi e' il colpevole : il browser. Infatti se uso Firefox
senza toccare nulla funziona alla grande. In effetti sulle due
macchine non c'e' solo una versione diversa di Win ma anche due IE
diversi (quello di XP e' molto piu' aggiornato).
Tutto il problema e' documentato in
http://www.php.net/manual/it/function.session-start.php
 dove, nelle
note degli utenti, dice ''If you open a popup window (please no
commercial ones!) with javascript window.open it might happen IE
blocks the session cookie.''
Grazie dell'assistenza, problema risolto (adesso passiamo alle join in
SQL :-((( )
ciao