2010-10-23 22 views
15

Actuellement, j'ai un fichier appelé "hits.php" et sur toute page je veux suivre les hits de la page que je viens d'utiliser <?php include("hits.php"); ?>Suivi des visiteurs uniques seulement?

Comment puis-je suivre les visiteurs uniques seulement? Mes hits sont faux car ils peuvent être rafraîchis par la même personne et les hits augmentent.

Voilà ma source:

<?php 
$hits = file_get_contents("./client/hits.txt"); 
$hits = $hits + 1; 

$handle = fopen("./client/hits.txt", "w"); 
fwrite($handle, $hits); 
fclose($handle); 

print $hits; 

?> 

Je ne sais pas vraiment comment je pourrais faire la vérification des cookies ... est-il un moyen de vérifier IP de? Ou que puis-je faire?

Merci StackO.

+2

J'envisagerais fortement d'utiliser autre chose qu'un fichier plat pour garder une trace du nombre de hits d'un script. La raison en est qu'une condition de concurrence peut se produire et que vous ne pouvez pas compter quelques entrées ou (pire encore) ne pas ouvrir le fichier et réinitialiser le compte à 1 (si file_get_contents() renvoie FALSE, FALSE + 1 = 1). –

Répondre

17

La méthode la plus simple serait la vérification des cookies.

Une meilleure solution serait de créer une base de données SQL et d'affecter l'adresse IP en tant que clé primaire. Ensuite, chaque fois qu'un utilisateur visite, vous devez insérer cette adresse IP dans la base de données.

  1. Créez une fonction incluse sur toutes les pages qui vérifie $_SESSION['logged'] que vous pouvez affecter quel 'drapeau' que vous voulez.
  2. Si $_SESSION['logged'] renvoie 'false', insérez leur adresse IP dans la base de données MySQL.
  3. Définissez $_SESSION['logged'] sur 'true' pour ne pas gaspiller de ressources en consignant plusieurs fois l'adresse IP.

Remarque: Lors de la création de la table MySQL, affectez le champ de l'adresse IP en tant que clé.

<?php 
    session_start(); 
    if (!$_SESSION['status']) { 
    $connection = mysql_connect("localhost", "user", "password"); 
    mysql_select_db("ip_log", $connection); 

    $ip = $_SERVER['REMOTE_ADDR']; 
    mysql_query("INSERT INTO `database`.`table` (IP) VALUES ('$ip')"); 

    mysql_close($connection); 
    $_SESSION['status'] = true; 
    } 
?> 
+0

Je ne sais pas comment faire la vérification des cookies. Comment puis-je utiliser des cookies? – Kyle

+0

Lisez ma réponse complètement, vous pouvez également vérifier les adresses IP. En y repensant, permettez-moi d'ajouter quelque chose. –

+0

@Kyle: C'est une question complètement différente, et on peut y répondre en recherchant des [php cookies] (http://www.google.com.au/search?sourceid=chrome&ie=UTF-8&q=php+cookies) . –

2
  1. Au niveau de base, vous pouvez obtenir l'adresse IP du client en utilisant la propriété PHP $_SERVER['REMOTE_ADDR']
  2. Tenir compte un cookie ou à l'aide d'une session, même si cela peut être vaincu par la suppression d'un cookie ou rejet de cookie. Voir les documents PHP setcookie pour plus d'informations.
  3. Il existe d'autres méthodes pour les empreintes digitales du navigateur - vérifier toutes les différentes données que vous pourriez peut utiliser à https://panopticlick.eff.org/index.php
2

Que diriez-vous de Google Analytics si vous ne pouvez pas. vous pourriez faire une base de données ou créer un autre fichier avec les adresses IP, mais cela pourrait être compliqué avec un fichier plat comme ça.

2

Il n'y a pas de solution parfaite, mais les deux premières méthodes (adresse IP et/ou cookies) sont les plus fiables, et une combinaison pourrait être encore meilleure. Plutôt que de réinventer la roue, j'ai utilisé une solution prête à l'emploi. Pour des raisons commerciales, j'ai évité Google Analytics (je ne veux pas que Google connaisse mes statistiques Web - leurs meilleurs intérêts ne m'appartiennent pas). Ils sont probablement bien pour les sites Web non commerciaux, ou si vous n'utilisez pas Google pour la publicité. Il existe également des dizaines d'alternatives. Par exemple j'utilise Getclicky.com

1

J'ai trouvé la solution de très mauvaise qualité et juste une manière rapide et sale de le faire.

Moi aussi je développais quelque chose de similaire et j'ai formulé une méthode rapide qui fonctionne sans redondance.

J'avais besoin d'un compteur pour chaque fois que quelqu'un accédait au profil d'un autre utilisateur.

Pseudo:

  • Créer une table avec le nom du spectateur et le nom de viewee (daily_views de table).
  • Vérifiez s'il existe le nom du spectateur avec le nom du spectateur (sur la même ligne).
  • S'ils n'existent pas, mettez à jour le compteur d'utilisateurs +1 (dans la table des utilisateurs).
  • Sinon, ne faites rien.
  • Réinitialiser les valeurs de table entières NULL toutes les 24/12 heures via un travail cron.

Cela nier la même personne qui accède au même profil de l'utilisateur d'ajouter 1 à la contre le rafraîchissement de la journée (ou 12 heures), tandis que la solution ci-dessus par Glenn Nelson serait en effet ajouter 1 au compteur , mais refuser d'ajouter à chaque compteur de l'utilisateur en même temps.

Non seulement cela, mais si vous deviez la fermeture de session et reconnectez-vous au site Web, puis il serait tout simplement ajouter de nouveau au comptoir où survient quelques trolls des cas et haxorz wannabe exploitera ce (que la session est détruit et a recommencé).

Voici mes exemples de tableaux:

users 
{ 
user_id INT(8) auto increment, user_name varchar(32), user_counter INT(12) 
}; 
daily_views 
{ 
view_id INT(8) auto increment, viewer_name VARCHAR(32), viewee_name VARCHAR(32) 
}; 

Voici un exemple de code que j'ai écrit:

<?php 
session_start(); 
$uname = $_SESSION['username']; 
$vieweepage = $_GET['name']; //gets the name of the persons page/profile via previous page/form 
$connect = mysql_connect("localhost","user","password") or die("Couldn't connect; check your mysql_connect() settings"); 
$database = mysql_select_db("database") or die("Could not locate database!"); 

$query = mysql_query("SELECT user_counter from users"); 
$query = mysql_fetch_row($query); 
$counter = $query[0]; 
$viewcheck = mysql_query("SELECT viewer_name from daily_views WHERE viewee_name='$vieweepage'"); 
$viewrow = mysql_num_rows($viewcheck); 

$newcounter = $counter + 1; 

if($viewrow == 0) 
{ 
$update = mysql_query("UPDATE users SET user_counter='$newcounter' WHERE user_name='$vieweepage'"); 
$insert = mysql_query("INSERT into daily_views (viewer_name, viewee_name) VALUES ('$uname', '$vieweepage')"); 
} 
?> 
+0

C'est super mais assurez-vous d'échapper ces chaînes.Ne faites jamais confiance aux entrées de l'utilisateur! – Kyle

0

actuellement je suis en utilisant remote address et session ID pour visitor.i pense son visiteur valide parce qu'un Un seul utilisateur peut visiter pas de fois en quelques jours et le compteur ne dépend pas de l'actualisation de son seul dépend de la nouvelle session.