Contatore visite in PHP

Per il sito della mia classe (che sto ora rinnovando aggiungendo un motore PHP) ho sviluppato un contatore utenti in PHP, che mi conti solamente le visite da link esterni.

Il suo funzionamento è molto semplice: si basa su un file counter.txt che contiene il numero di utenti che hanno visitato la pagina. Se la pagina viene aperta da un link esterno, aumenta il contatore di 1, altrimenti, se si è giunti lì da un link all’interno del sito, mostra solamente il valore attuale del contatore. I numeri sono scritti con immagini prese da un contatore di Altervista (quello che ho dovuto sostituire, almeno così non si nota u.u), che potete scaricare da qui in un pacchetto ZIP.

Ecco qua il codice:

<?php
//nome del file con il valore del contatore
$file_name = 'Pages/counter.txt';
//controllo se devo aumentare il contatore
//ossia se provengo da un link esterno e non interno
//per fare ciò controllo se mi è stata passata la variabile increase_counter
//che invio in POST dai form del menu
if (empty($_POST['increase_counter'])) {
        $can_access = false;
        //ciclo finchè non riesco ad avere accesso al file
        //ciò perchè successivamente lo elimino, e in caso di due interrogazioni simultanee della pagina
        //potrebbe darsi che non trovando il file, ne crei uno nuovo e faccia ripartire il contatore da 0
        while (!$can_access) {
                if (file_exists($file_name)) {
                        //una volta avuto accesso al file, ne metto il contenuto in $count e l'aumento di 1
                        $counter_file = fopen($file_name, r);
                        $count = fread($counter_file, filesize($file_name));
                        fclose($counter_file);
                        $can_access = true;
                }
        }
        //elimino il file
        unlink($counter_file);
        //lo ricreo e lo apro in scrittura
        $counter_file = fopen($file_name, w);
        //e lo ci scrivo il nuovo valore aumentato di 1
        fwrite($counter_file, $count);
        fclose($counter_file);
} else {
        $can_access = false;
        //altrimenti, se provengo da un link interno, visualizzo l'attuale valore
        //in counter.txt
        while (!$can_access) {
                if (file_exists($file_name)) {
                        //una volta avuto accesso al file, ne metto il contenuto in $count
                        $counter_file = fopen($file_name, r);
                        $count = fread($counter_file, filesize($file_name));
                        fclose($counter_file);
                        $can_access = true;
                }
        }
}
//ottengo l'array dei caratteri che formano il numero
$count_chars = str_split($count);
//aggiungo degli 0 davanti al numero per portarlo a 7 cifre
for ($n = count($count_chars); $n < 7; $n++) {
        array_unshift($count_chars, "0");
}
//inserisco le immagini corrispondenti per ogni cifra
foreach ($count_chars as $number) {
        echo "<img src=\"/Immagini/Counter/" . $number . ".gif\" />";
}
?>

La variabile increase_counter la passo tramite il menu del sito, composto da form. Il codice di un pulsante, ad esempio, è questo:

<!-- Il form ha come metodo POST: le informazioni dei campi contenuti in esso saranno passate alla pagina
nell'attributo action, ma a differenza di GET, che le passa esplicitamente nella query della pagina, POST le immette in un array nascosto all'utente ma accessibile dal codice PHP presente nella pagina -->
<form action="index.php" method="POST">
        <!-- Pulsante vero e proprio che l'utente vede -->
        <input type="submit" value="Home" />
        <!-- Campo nascosto  increase_counter a cui assegno un valore (qualunque, l'importante che l'abbia -->
        <input type="hidden" name="increase_counter" value="no" />
</form>

Basterà preoccuparsi di passare increase_counter nei link interni al sito.
Si potrebbe anche utilizzare GET e quindi renderne il passaggio esplicito, visto che non sono private e necessariamente da nascondere, e ciò renderebbe più facile inserire i link

  • Qwertj

    XD è pieno il mondo di contatori in PHP, ma preferisco farmele da solo le cose

  • topor

    Non è che poi uno lo legge, gli piace, lo copia, lo brevetta e ci fa i soldi, vero?