Newsgroup: it.comp.www.php
Titolo: funzione isset

la funzione isset('variabile') controlla se la variabile č valorizzata
 
come potrei fare in modo che una variabile prima valorizzata non sia piů
valorizzata? cioč avrei bisogno che il test isset('variabile') sia negativo
 
ciao e grazie
Alex
 
-- 
 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

 
http://interno.comze.com
 
 


 
unset?
 

 
http://interno.comze.com
 
 

 cioè avrei bisogno che il test isset('variabile') sia negativo
 
! isset('variabile')

 variabile non è valorizzata.
 
Il problema e` che non e` cosi`, perche` se la variabile contiene '0', 0, 
'' o 0.0, empty ritorna true, che significa "la variabile e` vuota".
 
Mentre !isset() sulla stessa variabile ritornerebbe false ("la variabile 
esiste")
 
Bye.
 

 la variabile non è valorizzata.
 
No,empty() ritorna TRUE se il contenuto della variabile è _valutabile_ come vuoto, quindi FALSE, 0, stringa vuota ( '' ), ritornano TRUE sia con empty() che con isset().
 
La differenza è fondamentale e, se la variabile non è settata, mi stupisce che empty() non dia errore (ora non ho tempo di provare)

per prima cosa grazie a tutti per la disponibilità!
 
nel file 'fermN.php' ho un FORM per l'inserimento di dati:
 
echo"<FORM action='fermN.php' method='post'>";
''
''
echo "<TR><TD><input type='submit' name ='conf' value='OK'></TD></TR>";
 
 
cliccando sul pulsante OK, il form chiama lo stesso file fermN.php dove
per prima cosa con l'istruzione:
 
               if (isset($_POST['conf']))
 
cioè viene testato il valore di 'conf', se il test da true, viene eseguita
una insert per inserire nel DB i dati prelevati dal FORM.
 
Il PROBLEMA è che se ricarico la pagina con il tasto BACK del browser,
essendo ancora isset($_POST['conf']) = TRUE, mi viene ricaricato lo stesso
record nel DB, per cui una volta scritto il record dovrei fare in modo che
il test su isset($_POST['conf']) mi dia FALSE
 
ciao



Non puoi, i valori passati in POST fanno parte degli header di 
richiesta, su quelli non hai controllo prima che ti arrivino.
Devi gestirti la creazione di duplicati
 
if(isset($_POST['conf']) ){
  $nonHoAncoraInseritoQuestoRecord = controllaSeVaInserito();
  if($nonHoAncoraInseritoQuestoRecord){
   inserisciRecord();
  } else {
   avvertiCheIlRecordEsisteENonFacciamoDuplicati();
  }
}
 
-- 
I cosi mi fattano

Come dice Marco lato php è impossibile - in teoria - in pratica, ci sono mille modi:
 
1. nel form inserisci un campo hidden con il timestamp, e nella pagina che processa il form controlli che lo stesso form non sia inviato due volte con lo stesso timestamp (se hai tenti utenti aggiungi al controllo ip, ua, etc..)
2. crei una sessione, e la usi come 'controllore': ci butti dentro una variabile e quando invii il form controlli, se esiste ed è a 1 allora il form è già stato inviato, altrimenti no (logicamente quando invii il form la devi settare a 1)
3. Te ne freghi del form, quello che ti interessa sono i dati: all'invio, controlli che i dati che ti arrivano non siano già presenti nel db
 
.. tutto dipende dalla tua fantasia e dal contesto (sicurezza) che devi ragiungere.
 
Un esempio pratico lo trovi qui: 
http://phpsense.com/2006/prevent-duplicate-form-submission/
 

Ecco... quindi una volta che il dato è inserito in SESSIONE o nel DB io 
farei un bel unset($_POST); così anche se ritorni indietro $_POST non è 
valorizzato!


 valorizzato!
 
WTF?

Pagina 1: FORM ---> passa la variabile... ok?
 
Pagina 2: if(isset($_POST['dato']) {$_SESSIONE = $_POST['dato']; 
unset($_POST['dato']); header('location:pagina3');}
else header('location:pagina1');
 
Pagina 3: esito operazione.
 
Se torni indietro POST è vuoto.
So bene che il POST è popolato dal browser... va bene così?


no, perchè quando torni indietro il browser ripopola $_POST con i valori del form (e mi sembra che chieda anche la conferma del reinvio del form)
 
Svuotare le variabili $_POST o $_GET può servire all'interno dello script se si vuole processare tali informazioni, ed evitare che altri script vadino a recuperare quelle originali invece di quelle processate.. ma aggiornare la pagina o tornare indietro le ripopola esattamente come erano in origine... ricorda che php è lato server, ogni script nasce e muore prima dell'esecuzione della pagina.


Maddeché ....
Non hai bene idea di cosa stai parlando credo
Il POST è testo che viene trasmesso negli Header della richiesta
Se io voglio postare "qualcosa: qualcuno" ad una pagina posso farlo 
tranquillamente tutte le volte che voglio
 
Dai una letta qui
http://en.wikipedia.org/wiki/POST_%28HTTP%29
 


 }
 
PERFETTO! 
 
infatti poi ho fatto in questo modo, controllo i campi significativi per
capire se sto duplicando, e risolvo in questo modo
 
ciao e grazie a tutti


Se torni dietro vai a pagina 2... il post viene instradato nella pagina1!!!



Occhio se hai intenzione di aprire quella pagina verso internet: la 
validazione è una delle cose più rognose che ci siano ed è necessaria
Se è una cosa solo per usi "interni" puoi stare più rilassato
Ciao
M


secondo me ci stiamo perdendo in un'incomprensione ;)
 
Dunque, se ho capito quello che vuoi dire:
 
Pagina 1 => contiene il form html che come action ha pagina 2
Pagina 2 => riceve il form, lo processa ed effettua un redirect a pagina 3
Pagina 3 => non fa niente
 
Con questo iter, sei nelle mani del browser: se è aggiornato, una volta che l'utente invia il form e si ritrova alla fine su pagina 3, quando preme "indietro" nel browser viene rimandato a pagina 1, 'skippando' pagina 2.
 
Altrimenti, se per qualsiasi motivo viene rimandato a pagina 2, dovrebbe anche reinviare il form.
 
Tuttavia, fare unset($_POST) non serve assolutamente a niente, perchè:
 
1. Pagina 2 riceve il form ogni volta e, senza un controllo (tipo il timestamp o uniqueid) non si accorge che è un duplicato
2. Se lo fai su pagina 3 è inutile, il post non gli arriva comunque
3. Se da pagina 3 torni a pagina 2, sei nelle mani del browser: o ti mostra la copia cache, altrimenti (e te ne accorgi se fai F5 per forzare l'aggiornamento) reinvia il post (chiedendoti conferma, se è un browser decente)
