Comment puis-je compter les visiteurs uniques de mon site?

je suis en train de faire un système de comptage de visiteurs pour les postes utilisateurs afin d'afficher les postes les plus consultés sur la page d'accueil. J'ai un système de comptage de visiteurs maintenant, mais tout cela enregistre une vue à chaque rafraîchissement de page. Je ne peux pas utiliser Google Analytics.

ce dont j'ai besoin c'est d'un compteur de visiteurs qui ne compte que les visiteurs uniques. Dans mon cas, unique signifie qu'une personne ne peut voir un poste que dans une journée? Même une semaine pourrait marcher, je pense. Pouvez-vous écrire ce code php ici? Vous pouvez me donner un lien vers quelques bons tutoriels aussi, si vous aimez aussi.

c'est Ce que le code doit faire (ou équivalent):

  1. une fois la page chargée, vérifiez si le visiteur est nouveau ou ancien(Je n'ai aucune idée de comment le faire .. )
  2. s'il est vieux, ignorez-le
  3. Si il est nouveau, mysql, vue = vue + 1
21
demandé sur halfer 2013-09-14 12:23:17

5 réponses

http://coursesweb.net/php-mysql/register-show-online-users-visitors_t

voici un joli tutoriel, voilà ce dont vous avez besoin.

inscrivez - vous et montrez les utilisateurs et visiteurs en ligne

compter les utilisateurs et visiteurs en ligne en utilisant une table MySQL Dans ce tutoriel, vous pouvez apprendre comment s'inscrire, compter et afficher dans votre page web le nombre d'utilisateurs et de visiteurs en ligne. Le principe est le suivant: chaque utilisateur / visiteur est enregistré dans un fichier texte ou base de données. Chaque fois qu'une page du site est consultée, le script php supprime tous les enregistrements plus anciens qu'un certain temps (par exemple 2 minutes), ajoute l'utilisateur / visiteur actuel et prend le nombre d'enregistrements restants à afficher.

vous pouvez stocker les utilisateurs et visiteurs en ligne dans un fichier sur le serveur, ou dans une table MySQL. Dans ce cas, je pense que l'utilisation d'un fichier texte pour ajouter et lire les enregistrements est plus rapide que leur stockage dans une table MySQL, qui nécessite plus de requêtes.

d'Abord, c'est présenté la méthode avec enregistrement dans un fichier texte sur le serveur, que la méthode avec table MySQL.

pour télécharger les fichiers avec les scripts présentés dans ce tutoriel, cliquez sur -> compter les utilisateurs et visiteurs en ligne.

• les deux scripts peuvent être inclus dans".php les fichiers (avec include()), ou dans ".html " files (with), comme vous pouvez le voir dans les exemples présentés en bas de cette page; mais le serveur doit exécuter PHP. Stockage des utilisateurs et des visiteurs en ligne dans un texte le fichier

pour ajouter des enregistrements dans un fichier sur le serveur avec PHP, vous devez définir les permissions CHMOD 0766 (ou CHMOD 0777) à ce fichier, afin que PHP puisse y écrire des données.

1-Créer un fichier texte sur votre serveur (par exemple, nommé "userson.txt") et lui donner les permissions CHMOD 0777 (dans votre application FTP, faites un clic droit sur ce fichier, choisissez Propriétés, puis sélectionnez Lire, Écrire et exécuter les options). 2-Créer un fichier PHP (nommé " usersontxt.php") ayant le code ci-dessous, puis copiez ce php fichier dans le même répertoire que "userson.txt". Le code pour usersontxt.php

<?php
// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>

3-Si vous souhaitez inclure le script ci-dessus dans un ".php fichier", ajoutez le code suivant à l'endroit où vous souhaitez afficher le nombre d'utilisateurs en ligne visiteurs:

4-pour montrer le nombre de visiteurs /utilisateurs en ligne dans un ".html" fichier, utilisez ce code:

<script type="text/javascript" src="usersontxt.php?uvon=showon"></script>

ce script (et l'autre présenté ci-dessous) fonctionne avec $_SESSION. Au début du fichier PHP dans lequel vous utilisez c', vous devez ajouter: session_start();. Compter les utilisateurs et visiteurs en ligne en utilisant une table MySQL

pour s'inscrire, compter et afficher le nombre de visiteurs et d'utilisateurs en ligne dans une table MySQL, il faut effectuer trois requêtes SQL: Supprimer les enregistrements plus anciens qu'un certain temps. Insérer une ligne avec le nouvel utilisateur /visiteur, ou, si elle est déjà inséré, mettre à Jour l'horodatage dans sa colonne. Sélectionnez les lignes restantes. Voici le code d'un script qui utilise une table MySQL (nommée "userson") pour stocker et afficher les utilisateurs et les visiteurs en ligne.

1-Nous créons D'abord la table "userson", avec 2 colonnes (uvon, dt). Dans la colonne" uvon " est stocké le nom de l'utilisateur (si connecté) ou L'adresse IP du visiteur. Dans la colonne" dt " est stocké un nombre avec le timestamp (Unix time) lorsque la page est consultée. - Ajouter le code suivant dans un fichier php (par exemple, nommé "create_userson.php"): Le code de create_userson.php

<?php
header('Content-type: text/html; charset=utf-8');

// HERE add your data for connecting to MySQ database
$host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

// connect to the MySQL server
$conn = new mysqli($host, $user, $pass, $dbname);

// check connection
if (mysqli_connect_errno()) exit('Connect failed: '. mysqli_connect_error());

// sql query for CREATE "userson" TABLE
$sql = "CREATE TABLE `userson` (
 `uvon` VARCHAR(32) PRIMARY KEY,
 `dt` INT(10) UNSIGNED NOT NULL
 ) CHARACTER SET utf8 COLLATE utf8_general_ci"; 

// Performs the $sql query on the server to create the table
if ($conn->query($sql) === TRUE) echo 'Table "userson" successfully created';
else echo 'Error: '. $conn->error;

$conn->close();
?>

2. - Now we create the script that Inserts, Deletes, and Selects data in the "userson" table (For explanations about the code, see the comments in script).
- Add the code below in another php file (named "usersmysql.php"):
In both file you must add your personal data for connecting to MySQL database, in the variables: $host, $user, $pass, and $dbname .
The code for usersmysql.php

<?php
// Script Online Users and Visitors - coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();         // start Session, if not already started

// HERE add your data for connecting to MySQ database
$host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)
$vst_id = '-vst-';         // an identifier to know that it is a visitor, not logged user
$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the rows with visitors
$dt = time();                                    // current timestamp
$timeon = 120;             // number of secconds to keep a user online
$nrvst = 0;                                     // to store the number of visitors
$nrusr = 0;                                     // to store the number of usersrs
$usron = '';                                    // to store the name of logged users

// connect to the MySQL server
$conn = new mysqli($host, $user, $pass, $dbname);

// Define and execute the Delete, Insert/Update, and Select queries
$sqldel = "DELETE FROM `userson` WHERE `dt`<". ($dt - $timeon);
$sqliu = "INSERT INTO `userson` (`uvon`, `dt`) VALUES ('$uvon', $dt) ON DUPLICATE KEY UPDATE `dt`=$dt";
$sqlsel = "SELECT * FROM `userson`";

// Execute each query
if(!$conn->query($sqldel)) echo 'Error: '. $conn->error;
if(!$conn->query($sqliu)) echo 'Error: '. $conn->error;
$result = $conn->query($sqlsel);

// if the $result contains at least one row
if ($result->num_rows > 0) {
  // traverse the sets of results and set the number of online visitors and users ($nrvst, $nrusr)
  while($row = $result->fetch_assoc()) {
    if(preg_match($rgxvst, $row['uvon'])) $nrvst++;       // increment the visitors
    else {
      $nrusr++;                   // increment the users
      $usron .= '<br/> - <i>'.$row['uvon']. '</i>';          // stores the user's name
    }
  }
}

$conn->close();                  // close the MySQL connection

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. ($nrusr+$nrvst). '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>
  1. Après avoir créé ces deux php les fichiers sur votre serveur, lancez le " create_userson.php" sur votre navigateur pour créer la table" userson".
  2. inclure le " usersmysql.php" fichier dans le fichier php dans lequel vous souhaitez afficher le nombre d'utilisateurs en ligne et les visiteurs.
  1. Ou, si vous voulez l'insérer dans un ".html", ajouter ce code:

exemples utilisant ces scripts

* y compris le " usersontxt.php dans un fichier php:

Contrer les utilisateurs en ligne et Visiteur

les deux scripts (avec stockage de données dans un fichier texte sur le serveur, ou dans une table MySQL) afficheront un résultat comme ceci: En ligne: 5

Visiteurs: 3 Utilisateurs: 2 - MarPlo - Marius

17
répondu Mihai 2014-04-26 09:04:15

vues Uniques est toujours un écrou dur à fendre. Vérifier L'adresse IP peut fonctionner, mais une adresse IP peut être partagée par Plus d'un utilisateur. Un cookie peut être une option viable, mais un cookie peut expirer ou être modifiés par le client.

Dans votre cas, il ne semble pas être un gros problème si le cookie est modifié tho, donc je vous conseille d'utiliser un cookie dans un cas comme celui-ci. Lorsque la page est chargée, Vérifiez s'il y a un cookie, s'il n'y en a pas, créez-en un et ajoutez un +1 aux vues. Si c'est réglé, ne faites pas le +1.

Réglez la date d'expiration des cookies à ce que vous voulez qu'il soit, semaine ou jour si c'est ce que vous voulez, et il expirera après ce temps. Après expiration, il sera à nouveau un utilisateur unique!


Edit:

Pensé qu'il pourrait être une bonne idée d'ajouter cet avis ici...

Depuis fin 2016, une adresse IP (statique ou dynamique) est considérée comme une donnée personnelle dans l'UE.

Cela signifie que vous êtes seulement autorisé à stocker une adresse IP avec une bonne raison (et je ne suis pas sûr si le suivi des vues est une bonne raison). Donc, si vous avez l'intention de stocker l'adresse IP des visiteurs, je recommande le hachage ou le chiffrement avec un algorithme qui ne peut pas être inversé, pour s'assurer que vous ne violez aucune loi (surtout après que les lois GDPR ont été mises en œuvre).

10
répondu Jite 2017-11-30 08:52:42

j'ai modifié le code "meilleure réponse", mais j'ai trouvé une chose utile qui manquait. Ceci va aussi suivre l'ip d'un utilisateur s'il utilise un Proxy ou simplement si le serveur a installé nginx comme un réviseur proxy.

j'ai ajouté ce code à son script en haut de la fonction:

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

Après que j'ai révisé son code.

Trouver la ligne qui dit la chose suivante:

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

et le remplacer par ceci:

$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $adresseip. $vst_id;

ça va marcher.

voici le code complet si quelque chose arrive:

<?php

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result

Je ne l'ai pas encore testé sur le script Sql.

8
répondu Broccoli 2015-10-23 18:18:14

pour découvrir que l'utilisateur est nouveau ou ancien , obtenez l'IP de l'utilisateur .

créer une table pour IPs et leur horodatage de visite .

vérifier SI la propriété intellectuelle n'existe pas OR time () - saved_timestamp > 60*60*24 (pour 1 jour) ,éditez l'horodatage de L'IP vers time() (signifie maintenant) et augmentez votre vue un .

autre chose , ne rien faire .

CORDIALEMENT: l'adresse IP de l'utilisateur est stockée dans $_SERVER['REMOTE_ADDR'] variable

7
répondu Alireza Fallah 2014-01-02 09:26:07
$user_ip=$_SERVER['REMOTE_ADDR'];

$check_ip = mysql_query("select userip from pageview where page='yourpage'  and userip='$user_ip'");
if(mysql_num_rows($check_ip)>=1)
{

}
else
{
  $insertview = mysql_query("insert into pageview values('','yourpage','$user_ip')");

  $updateview = mysql_query("update totalview set totalvisit = totalvisit+1 where page='yourpage' ");
}

code de talkerscode tutoriel officiel si vous avez un problème http://talkerscode.com/webtricks/create-a-simple-pageviews-counter-using-php-and-mysql.php

3
répondu asif 2016-03-08 15:17:05