Newsgroup: it.comp.www.php
Titolo: 'bloccare' un refresh

ciao, io in una pagina.php ho un link del tipo
secondaPagina.php?do=mod&id=$id
ora, mettiamo che nella secondaPagina.php abbia un codice del tipo
if(isset($_GET["id"])){
$id=$_GET["id"];
 list($n)=mysql_fetch_array(mysql_query("SELECT num FROM tabella WHERE
id='$id'"));
 $n++;
 mysql_query("UPDATE tabella SET num='$n' WHERE id='$id'");
}
quindi, per esempio, cliccando sul link in pagina.php mi và alla
secondaPagina.php e mi incrementa il valore in una tabella mysql....
il problema è che se qualcuno esegue un refresh nella
secondaPagina.php, il codice mi incrementa il valore ogni volta..
c'è un sistema che, senza usare cookie o sessioni, fà in modo che quel
link venga eseguito 1 volta soltanto?

 link venga eseguito 1 volta soltanto?
Eh, allora vediamo....
potresti fare un header Laction ad un'altra pagina dopo aver fatto le tue
operazioni
e se questo non ti basta puoi chiamare la pagina non attraverso un semplice
link ma attraverso una chiamata JavaScript che non inserisce il link nella
history del browser "location.replace()" per i dettagli chiedi a 
news:it.comp.lang.javascript

 che quel link venga eseguito 1 volta soltanto?
Una possibile soluzione (non so se fattibile nel tuo caso)
potrebbe essere quella di arrivare su secondaPagina.php
attraverso una pagina intermedia.
 pagina.php -> pagina_cha_aggiorna.php -> secondaPagina.php
In pagina_che_aggiorna.php inserisci solo il codice per
aggiornare il contatore e poi reindirizzi su secondaPagina.php
tramite la funzione header(). Vedi 
http://www.php.net/header
. In
questo modo, aggiornando la pagina secondaPagina.php non avviene
alcun update.
Ciao.
-- 
Federico

 Federico
si la quella query è solo d'esempio..
il 'trucchetto' della pagina intermedia è esattamente quello che stò
usando in questo momento, ma ho visto raddoppiare quasi il numero di
pagine e (anche se quelle intermedie sono molto leggere) quando devo
andare a modificare le query mi ritrovo a dover modificare, ad
esempio, 4 pagine ben distinte...
e anche se le modifiche al database dopo la prima stesura sono rare,
non posso rischiare di 'dimenticare' qualche pagina
cmq invece che l'header usavo un die("<META HTTP-EQUIV=\"Refresh\"
CONTENT=\"0 url=miaPagina.php\">");... è sbagliato?
invece preferivo comandare le azioni in base ai get..
spesso mi trovo a dover eseguire query di update molto semplici e
inseguire le pagine intermedie non mi piaceva molto come idea (si,
volendo potrei raggruppare più pagine in una, ma otterrei delle pagine
pesanti...)
ora mi guardo a modo la storia del location.replace()
cmq per ora grazie!

ok, il location.replace() è praticamente identico al
die("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0 url=miaPagina.php\">");
e agli autorefresh...
per fare prima, posso impedire all'utente di fare l'autorefresh?
non sò tipo inibirgli la pressione del tasto f5 e del pulsante nel
browser (tipo come quando si inibisce il tasto destro del mouse)

 CONTENT=\"0 url=miaPagina.php\">");... è sbagliato?
No, però è possibile fare in modo che non funzioni. Per esempio
con Firefox e l'estensione Web Developer con un clic posso fare
in modo che i meta redirect non abbiano più effetto.
 
-- 
Federico

 tasto destro del mouse)
Credo di no, ma prova a sentire su it.comp.lang.javascript.
Comunque, anche se fosse possibile non servirebbe a nulla (ti
rimarrebbe il problema di coloro che navigano con Javascript
disattivato) e non sarebbe neanche troppo gentile nei confronti
dell'utente il quale ha tutto il diritto di aggiornare una
pagina quando vuole.
-- 
Federico

 link venga eseguito 1 volta soltanto?
Allora sparo la mia:
secondaPagina controlla una flag, 
se è vero aggiorna il valore in tabella e stampa un meta Refresh dove 
nel content la flag è falsa;
se è falso invece non aggiorna e non stampa il tag <meta>.
In questo modo l'utente da pagina.php preme il link a 
secondapagina.php?flag=true
secondapagina.php vede la flag true, aggiorna la tabella e in pochi 
secondi si piazza a ?flag=false dopodiché rimane quieta.
Niente js, niente doppia pagina.
Chiaro che uno può scrivere a mano nell'url flag=true ma a te 
interessava solo proteggerti da occasionali refresh se non ho capito 
male.
D'altronde pensare di poter far fare solo quello che si vuole all'utente 
è pia illusione.

si bhè in effetti mi conviene usare una pagina di intermezzo..
non mi preoccupo che qualcuno disabiliti il js: non è un sito web
pubblico, ma un'applicazione online dove sarà obbligatorio l'utilizzo
di js...
volevo scartare questa via perchè mi ritrovo già con più di 200 pagine
e 95 tabelle nel database, ed essendo tutta roba fatta da me (niente
cms) dimenticare per la via una query è un incubo

 cms) dimenticare per la via una query è un incubo
Appunto, come ho suggerito io non devi aggiungere una pagina intermedia 
per ogni caso simile ma solo poche righe in testa allo script.