Newsgroup: it.comp.www.php
Titolo: problema if + unset($_SESSION["nome_var"]) ... [lunghetto]

salve a tutto il NG,
mi accade una cosa che secondo me non ha senso
e non so neanche come spiegarla ...
[sintomo]
viene eseguito un unset($_SESSION["nome_var"]); all'interno di un if
nonostante la condizione non sia verificata, mentre le altre istruzioni non
vengono eseguite ...
ho fatto un'infinita' di prove e non cambia nulla ... l'unica cosa strana e'
che se imposto direttamente la condizione "if(false)" funziona
correttamente, cioe' non esegue unset() ...
onde prevenire risposte del tipo "ma sei sicuro che la condizione di
controllo sia corretta" sottolineo che questa e' corretta ... vedere esempio
[esempio "banalizzante"]
if ($Pagina != 12) {
    echo "Pagina diversa da 12\r\n";
    unset($_SESSION["nome_var"]);
    print_r($_SESSION);
}
//output con $Pagina != 12 ... CORRETTO
Pagina diversa da 12
Array
(
)
//output con $Pagina == 12 ... NON CORRETTO
//non viene visualizzata la stringa "Pagina diversa da 12" ...
//quindi la condizione "funziona"
Array
(
    //qui dovrebbe esserci [nome_var] -> qualcosa
)
in locale (php 4.3.10 + Apache + WinXp) funziona perfettamente
in remoto (php 4.3.10 + Apache + Linux) non funziona
non posto il codice perche' credo non serva ... credo sia piu' una questione
di "teoria" che purtroppo non so neanche come definirla,
quindi non so come ricercare informazioni
spero abbiate capito il problema e che con la vostra esperienza possiate
spiegarmi la situzione o indicarmi il "tipo" di problema, cosi' almeno posso
fare delle ricerche/studi mirate
se servono altre info ditemi pure,
grazie in anticipo
MoiKano
-------------------------------------------------------
l'importante e' essere, non sembrare
moika...@SPAM-libero.it
-------------------------------------------------------


-- 
Per rispondermi togli il cappello

 ==12 viene cmq eseguita una delle "funzioni" all'interno del blocco?
[cut]
e' proprio questo che secondo me non ha senso ...
quello che dovrebbe fare e' di cancellare $_SESSION["nome_var"]
in tutte le pagine TRANNE se $Pagina == 12, invece unset viene eseguito
non tenendo conto della condizione dell'if ...
la stringa "Pagina diversa da 12" l'ho inserita solo per dimostrare che la
condizione viene valutata correttamente
P.S. mi autocorreggo il post di prima ...
la print_r($_SESSION); e' fuori dal controllo if ...
scusate, ma nella fretta l'ho scritto interno
--


 non tenendo conto della condizione dell'if ...
Come viene valorizzata la variabile $Pagina?
La passi alla pagina via GET, nell'URL?
Se è così usa $_GET['Pagina'] e non $Pagina, e prima di usarla
verifica che esista.
Ciao.
-- 
Federico R.

 ha scritto:
[...]
[come e' valorizzata la variabile $Pagina ed esistenza della stessa]
[...]
$Pagina prende il valore $_GET["Pag"] ... la gestione del sistema e' un po'
lunga,
ma sono sicuro che va bene ... difatti la stringa "Pagina diversa da 12" NON
compare
quando $Pagina == 12 (quindi $Pagina esiste ed ha il valore corretto),
mentre l'unset viene eseguito ugualmente
tutta la questione secondo me NON riguarda passaggio parametri, sessioni,
etc,
ma riguarda a come sia possibile che un blocco di istruzione interno ad un
costrutto if
venga eseguito un po' si ed un po' no, senza tener conto del confronto


 del confronto
Le istruzioni contenute in un blocco if o vengono eseguite
oppure no. Il problema è sicuramente da qualche altra parte.
Prova il seguente semplice script:
<?php
session_start();
if (!isset($_SESSION['nome_var']))
{
  $_SESSION['nome_var'] = 1;
}
?>
<p><a href="<?php echo $_SERVER['PHP_SELF']; ?>?pag=1">Clicca
qui e la varibile si cancella.</a></p>
<p><a href="<?php echo $_SERVER['PHP_SELF']; ?>?pag=12">Clicca
qui e la varibile NON si cancella.</a></p>
<?php
if (isset($_GET['pag']) && $_GET['pag'] != 12)
{
  if (isset($_SESSION['nome_var']))
  {
    unset($_SESSION['nome_var']);
  }
}
print_r($_SESSION);
?>
Cliccando su "Clicca qui e la varibile si cancella.", essendo
pag != 12 la variabile di sessione $_SESSION['nome_var'] viene
correttamente cancellata.
Cliccando su "Clicca qui e la varibile NON si cancella.",
essendo pag = 12 la variabile di sessione
$_SESSION['nome_var'] NON viene cancellata.
Questo ti funziona correttamente?
-- 
Federico R.

 oppure no. Il problema č sicuramente da qualche altra parte.
[cut]
anche qui ovviamente non posso che essere d'accordo, pero' non riesco capire
come sia possibile che in tutto il progetto che sto seguendo per ora solo in
due punti uso le sessioni:
[A] dentro il blocco if dove dovrebbe cancellare le variabili SOLO quando
sono in $Pagina != 12 eseguita prima del caricamento della pagina
if ($Pagina != 12)
{
    echo "<br>eseguito solo se Pag != 12<br>ora variabili_sessione č:\r\n";
    unset($_SESSION["nome_var"]);
    print_r($_SESSION);
}
[B] nel file di gestione di quella pagina, dove registro solamente variabili
con $_SESSION["nome_var"] = valore;
da nessuna altra parte uso l'array $_SESSION ...
se commento o posto if(false) nel codice [A] va tutto bene, tranne
ovviamente che non vengono cancellate le variabili ...
deduzione ovvia sarebbe "allora e' errata la condizione del if", pero'
allora come mai echo e print_r funzionano correttamente?
per vedere in pratica andare qui
http://www.moikano.it/Lavoro/Catilinari/index.php?Cat=0&Pag=12
:
-) la dicitura "variabili_sessione all'inizio" seguito dall'array $_SESSION
compare all'inizio di tutte le pagine prima che sia
eseguita qualsiasi operazione su $_SESSION
-) la dicitura "variabili_sessione dopo eseguito cerca" seguito dall'array
$_SESSION evidenzia che e' stata fatta una ricerca
(ovviamente dopo aver premuto cerca) facendo vedere le variabili impostate
-) teoricamente se si ripremesse il bottone "cerca" (o il link cerca, o una
delle pagine del navigatore di risultati, cioe' fino a quando si rimane
nella $Pagina 12) nella prima dicitura dovrebbero comparire le variabili
settate precedentemente ... invece si perde lo stato precedente ...
-) per il test che la condizione e' corretta basta selezionare qualsiasi
altra pagina, cosi' compare dopo la prima dicitura la frase
"eseguito solo se Pag != 12" seguito dall'array $_SESSION
boh, non riesco a vedere alcuna spiegazione ... sicuramente sono io che
sbaglio, ma secondo me se viene eseguito unset si dovrebbero vedere
anche echo e print_r
grazie ancora,


 }
[...]
Se print_r($_SESSION) lo metti dentro il blocco if non verrà
stampato il contenuto dell'array $_SESSION quando $pagina ==
12.
 
Stampa il valore di $Pagina prima di usarlo.
All'inizio della pagina metti error_reporting(E_ALL) (se già
non lo è nel file php.ini).
Se esegui un redirect attraverso la funzione header(), usa
session_write_close() prima di header():
http://it2.php.net/session_write_close
-- 
Federico R.

buonasera al NG,
probabilmente non interessera' alla maggioparte, pero' posto ugualmente
la tanto sudata soluzione/pseudo-spiegazione al mio problema nella speranza
che possa servire a qualcun'altro ...
come sempre capita era una stupidaggine:
non dipendeva dal PHP, ma dall'HTML ... avevo inserito un
<script type="text/javascript" src="Script/Form_Ricerca.js"></script>
che avrei successivamente editato con tutte le validazioni DOM per la form;
non mi ha mai dato problemi, ma questa volta si puo' dire che sia stato
catastrofico; in pratica penso che il server (almeno credo, visto che in
locale mi funzionava) non trovando il file da "importare" (sintomo: la
pagina impiegava 2-5 secondi prima di caricarsi), finito di caricare la
pagina (quindi rilevato l'errore GET per il file) a quanto pare "comunicava"
l'errore all'interprete PHP che annullava tutte le operazioni eseguite su
$_SESSION durante la generazione della pagina ...
ora mi sorgono due domande:
1) che relazione c'e' tra interprete PHP ed errori GET del server riguardo a
risorse che non condizionano e non hanno niente a che fare in nessun modo
con gli scripts PHP?
2) importante: non dovrebbe essere segnalato che un'operazione sulle
sessioni non e' andato a buon fine (possibilmente indicandone la causa)?
tipo se con error_reporting(E_ALL); o se impostato in php.ini
ancora grazie per l'ospitalita', la pazienza e la disponibilita' dimostrata,
buon proseguimento,
--


 causa)?  tipo se con error_reporting(E_ALL); o se impostato in php.ini
IMHO non hai ancora trovato l'errore.
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.