• User

    PHP view page count + cookie

    Ciao a tutti!
    Il motivo per cui scrivo è di capire se, informaticamente parlando, la soluzione trovata è valida o meno.. mi affido al vostro giudizio 🙂 🙂

    IL PROBLEMA
    Ho realizzato uno script all'interno di un sito internet che ha dei post - un blog - che immagazzina all'interno del database il numero di visualizzazioni di ogni post. In sostanza, ogni volta che viene visualizzata la pagina c'è uno script che aumenta di 1 il numero di visualizzazioni ad essa collegate. Il problema è che, così facendo, se premo 5 volte F5 faccio aumentare - giustamente - di 5 il numero di visualizzazioni.
    Il numero che ne risulterebbe sarebbe inutile dunque.. Quello che sarebbe utile è sapere il numero di "letture del post" non di "download della pagina". (poi si può anche vedere con analytics, lo so, ma voglio anche dirlo sul sito accanto ad ogni titolo del post).

    LA SOLUZIONE ADOTTATA
    Per risolvere questo problema ho fatto si che ogni volta che visualizzo un post venga settato un cookie chiamato con il nome dell'articolo il cui valore è l'IP (criptato con sha1) dell'utente visualizzatore.
    Una volta fatto ciò, prima di aumentare di uno il numero di visualizzazioni eseguo uno controllo di presenza o meno di un cookie che si chiami come l'articolo visualizzato e che abbia l'IP attuale come valore.. se non esiste, aumento di uno le view, altrimenti le lascio così. Ho poi impostato la scadenza ad 1h.

    IL CODICE ADOPERATO
    Qui il codice che ho adoperato:
    [PHP]
    // la variabile $ip è riempita precedentemente!
    // la variabile $w è riempita con il $_GET['w'] e contiene il titolo del post (in versione url naturalmente)
    if(!isset($_COOKIE[$w]) || ($_COOKIE[$w] != sha1($ip)) ) {
    $query = "UPDATE post SET post_view=(post_view+1) WHERE post.post_slug = '".$w."'" or die("Errore nella query delle view: <br>" . mysqli_error($link));
    //execute the query.
    $result = $link->query($query) or die("Errore nell'esecuzione della query delle view: <br>" . mysqli_error($link)); ;
    // imposto il cookie per ricordare che questo utente ha visualizzato l'articolo (evita di contare come view i refresh della pagina)
    $cookie_name = $w;
    $cookie_value = sha1($ip);
    setcookie($cookie_name, $cookie_value, time() + (3600 * 1), "/"); // 3600 = 1 ora
    }
    [/PHP]

    Che ne pensate? È uno spreco di risorse? È sbagliato far salvare così tanti cookie sul PC degli utenti?


  • Moderatore

    Ciao frabanca,
    la tua è una delle soluzioni praticabili, ma tutto dipende dal livello di dettaglio che vuoi raggiungere e applicare.
    Se infatti l'utente apre l'articolo ma non lo legge, tu lo conterai lo stesso.

    Ovviamente nessuno script potrà mai darti la certezza della lettura, ma ad esempio, potresti far eseguire il tuo script solo se viene scrollata almeno metà pagina (che con buona probabilità significa che l'utente sta leggendo l'artiolo) o solo dopo un certo tempo di permanenza sulla stessa (ad esempio dopo almeno un minuto se sai di avere articoli abbastanza lunghi).

    La memorizzazione dell'IP nel cookie inoltre è quasi superflua. Ti serve solo ad assicurarti di non contare due volte utenti che usano due browser diversi per leggere lo stesso articolo, altrimenti basta semplicemente un cookie, senza scriverci info dell'utente all'interno (basterebbe anche un "ok").

    Infine io alzerei la durata ad almeno un giorno. Molte persone hanno l'abitudine di conservare gli articoli in alcuni software per poi rileggerli con calma dopo qualche ora. In questo caso conteresti l'utente due volte sbagliando.

    Non so quanto sono stato chiaro, ma sono a disposizione per studiare insieme altre varianti o soluzioni.


  • User

    Ciao Shad!
    Grazie della risposta per iniziare 🙂 🙂

    Hummm, in effetti quello che scrivi è molto sensato. Gli articoli di questo blog dovrebbero essere abbastanza corposi (si parla di almeno una paginetta di word), quindi il consiglio sul fatto che l'utente abbia scrollato la pagina fino a metà (o comunque un pochino) è un buon consiglio! Credo che, se terrò questo sistema, lo utilizzerò di certo! Per l'IP stessa cosa.. in effetti un semplice "OK" creerebbe un cookie dal peso ridottissimo (25-30) mentre con uno sha1() si va a creare un cookie leggermente più pesante ( Il doppio! --> 60-70).
    La durata inserita era "di debug", la avrei alzata anche io almeno a 12 (o di più) ore. Dopotutto se un utente legge l'articolo due volte nell'arco di 13 ore (ovvero una volta e poi la seconda più di 12 ore dopo) è anche corretto contarlo come due visualizzazioni. Penso che il senso di un counter sia quello di far capire agli utilizzatori quanto è "popolare" un determinato articolo e se lo voglio rileggere a distanza di 12 ore.. è positivo. (esempio: lo voglio far rileggere al mio collega dal mio pc).

    Tornando al sistema discusso..
    Quindi secondo te potrebbe essere una soluzione effettivamente utilizzabile? Perché io me lo sono inventato di sana pianta un po' di fretta per risolvere il problema, poi mi è venuto in mente che nel mondo GT questo è il pane quotidiano, e quindi eccoci qui 😄
    Onestamente non mi era mai capitato di doverne realizzare uno.. avevo solo letto che esistevano dei servizi di counter esterni.. ma spesso sono o a pagamento oppure fonte di spam e problemi vari. Senza contare che non sono gestibili al 100% (come, invece, un sistema autonomo come quello discusso qui)


  • Moderatore

    Certo che il sistema è sensato. Sto dando poi per scontato che quando un accesso supera i controlli, incrementi un contatore sul database.
    Si potrebbero usare sistemi diversi ma anche io avrei utilizzato il tuo. Quindi per me va bene così. 😉


  • User

    Certo, se un utente supera i controlli (ovvero se non viene trovato un cookie che mi informa sulla lettura già avvenuta) incremento automaticamente il contatore sul DB.
    La mia preoccupazione era data dal fatto che in questo modo se un utente legge ( e speriamo! 😄 ) 10 articoli si trova 10 cookie sul computer. (11, contando quello per l'accettazione dei cookie). Se poi ci mettiamo google analytics, l'accesso via cookie, alcune preferenze di visualizzazione arrivo a 5+10= 15 cookie ad utente.
    Mi chiedevo se non fossero considerati "troppi". Purtroppo non ho molta esperienza con il loro utilizzo 🙂
    Però sono contento che il sistema vada già bene cosi!
    Grazie!


  • Moderatore

    A parte il fatto che 15 cookie non sarebbero un problema, ma nessuno ti vieta di farne uno solo al cui interno inserisci gli id degli articoli letti. Minimo peso, massima resa 😉


  • User

    Oh... giusto 😄 Sarebbe la cosa migliore! :figo2:
    Hemmm come ti dicevo prima non sono un mago con i cookie, come potrei farne uno solo con tutti questi dati? (e poi leggerlo?)
    Un ulteriore problema è che il parametro get che mi imposta l'articolo è il suo slug (la versione url del titolo), non l'ID. Quindi per recuperarlo dovrei lanciare una apposita query. Non vorrei che questo rallentasse. Che ne pensi?


  • Moderatore

    Non credo che avrai problemi di rallentamento.
    Riguardo il farne uno solo, basta che dividi gli id (o gli url) con uno spazio e poi splitti su di esso quando lo leggi.


  • User

    Ok, perfetto. Farò senza dubbio così. Grazie mille Shad!! :smile5: