Newsgroup: it.comp.www.php
Titolo: Non eseguire una query sul refresh della pagina

Forse non č una domanda da php, ma onestamente non saprei trovare un 
gruppo piů adatto per quello che sto per chiedervi:
Vorrei fare una sorta di classifica di pagine visitate, ovvero quando 
clicco su un link che mi porta a una pagina, questa esegue una query di 
UPDATE sul db.
Vorrei perň che ciň non accadesse quando l'utente preme F5 o il tasto 
aggiorna, per ovvi motivi statistici (uno potrebbe continuare a premere 
F5...).
Temo che le variabili passate in GET (ad esempio pagina.php&update=1) 
non mi siano d'aiuto, in quanto rimangono anche su refresh.
Inoltre essendo link non riuscirei a passarle in POST (a meno di non 
usare js), ma in ogni caso non risolverei, dato che un utente potrebbe 
fare f5 e poi dire al browser di rimandare i dati in POST...sarebbe solo 
una pressione di un tasto in piů!
Sto chiedendo l'impossibile?
Grazie

 UPDATE sul db.
se vuoi conteggiare solo gli accessi a partire da un click su uno o
più specifici link potresti farti uno scriptino javascript che lancia
uno scriptino php che updata il db e poi redirige sulla pagina
richiesta.

 Grazie
Metti nel db, oltre l'url, l'ip dell'utente e il timestamp della
richiesta. Quando vuoi calcolare le statistiche avrai tutti i dati che
ti servono.

 Sto chiedendo l'impossibile?
2 possibili soluzioni (di cui una già ti han descritto):
1. Punti il link ad una pagina "temporanea", dove non metti niente 
fuorché codice PHP per le statistiche e una redirezione ( usa header() ) 
alla pagina dei risultati.
2. (come ti hanno già spiegato), memorizza anche l'IP dell'utente e il 
timestamp ( usa time() ), a quel punto quando inserisci verifichi se non 
c'è già.
Enrico

 F5...).
puoi farlo controllando il valore di $_SERVER['HTTP_REFERER']

 puoi farlo controllando il valore di $_SERVER['HTTP_REFERER']
Questo sarebbe ottimo, ma 
php.net
 riporta:
The address of the page (if any) which referred the user agent to the 
current page. This is set by the user agent. Not all user agents will 
set this, and some provide the ability to modify HTTP_REFERER as a 
feature. In short, it cannot really be trusted.

 c'è già.
Rispondo qui anche per fmassei che ha proposto la stessa cosa:
non ho capito bene cosa intendete, poichè l'ip dell'utente potrebbe 
essere lo stesso per gruppi di molti utenti (vedi fastweb), e poi che 
tipo di controllo dovrei fare?
Io vorrei solo evitare di mettere su db quegli accessi prodotti dalla 
pressione folle del tasto F5 :)

 ha scritto nel messaggio 
news:Fs5Bl.10966$VA5....@tornado.fastwebnet.it...

Fai una cosa semplice, ad ogni accesso crea una sessione per l'utente e 
aggiorna il database; se la sessione esiste non aggiorna il database.
La durata della sessione è tua discrezione.
Cooper.
 

 Sto chiedendo l'impossibile?
installa google analytics :)
-- 
·


Non credo che il suo problema sia legato alle statistiche.
 



Sul fatto che non possa essere trusted č vero, ad esempio un semplice
spiderino fato con curl puo' impostarne il valore a piacimento, e pure una
chiamata a wget puo' farlo.
Ora, sul fatto che non tutti gli user agent lo settano, direi che č
una cosa della quale non ti devi preoccupare troppo, visto che questi
agent saranno al massimo l' 1% di quelli in circolazione (ad esagerare).
Invece mi chiedo se facendo il refresh il referer venga cambiato o meno
(diciamo che ti ho risposto con troppa fretta), verificalo te.

 Cooper.
O se proprio non puoi con la sessione, usa i cookie insieme all'ip e al 
tempo.
Enrico

 agent saranno al massimo l' 1% di quelli in circolazione (ad esagerare).
Invece io spesso ho trovato Antivirus che zappano via questa cosa. Forse 
la configurazione era estrema, ma IMHO non è affidabile "più di tanto", 
o almeno non preso come valore singolo.
Enrico

 o almeno non preso come valore singolo.
ecco questa proprio non la sapevo, e scusa , come diavolo fa un antivirus
del sistema operativo a dire ai browser di non settare il referer?
(magari funziuona solo per IE, ma la domanda resta valida)
e soprattutto, che cavolo c'entra con i virus il fatto di settarlo o meno?
mistaeri della fede (o di windows)

 referer? (magari funziuona solo per IE, ma la domanda resta valida)
Diversi antivirus si installano come "proxy trasparente" sul PC 
dell'utente. Intercettano tutto il traffico web e lo controllano. A volte, 
appunto, modificano anche gli header delle richieste.
Bye.


Beh, sì. Non c'e' modo di distinguere un refresh fatto da un client
con il tasto F5 da una nuova chiamata genuina, di per sè. Il referer,
come ti hanno già detto, è inutile.
Devi inventarti qualcosa ad esempio con sessioni, cookie, o criteri
applicativi (tipo non conteggiare la richiesta se dallo stesso IP nbe
è stata già fatta una negli ultimi tot secondi). Se stiamo parlando di
un sito con già una sua applicazione, autenticazione degli utenti,
ecc. allora è una passeggiata aggiungere alla sessione un flag che ti
"memorizza" se l'accesso ad una data pagina è già stato conteggiato o
meno; altrimenti devi farci un po' te una pensata sopra...
bye!

 come ti hanno gią detto, č inutile.
Alla fine ho utilizzato una pagina intermedia con la query e un 
redirect: quando voglio conteggiare chiamo quella, altrimenti chiamo la 
pagina diretta

 Grazie
Potresti usare le sessioni.
Ad esempio:
<?php
  session_start();
  ...
  if (!isset($_SESSION['gia_conteggiato'])) {
    // aggiorna contatore
    ...
    $_SESSION['gia_conteggiato'] = TRUE;
  }
?>
Ricordati di mettere session_start() come primissima istruzione (prima 
dell'header) altrimenti non funziona.
Fai sapere.
Ciao.
G.

 Fai sapere.
Si, è un'idea ma alla fine ho usato un redirect con header() :)