web-dev-qa-db-fra.com

Comment compter les visiteurs uniques de mon site?

Je crée un système de comptage des visiteurs pour les messages des utilisateurs afin d'afficher les messages les plus consultés sur la page d'accueil. J'ai maintenant un système de comptage des visiteurs mais tout ce qu'il enregistre une vue à chaque rafraîchissement de page. Je ne peux pas utiliser Google Analytics.

J'ai besoin d'un compteur de visiteurs qui ne compte que les visiteurs uniques. Dans mon cas, unique signifie qu'une seule personne ne peut voir un message qu'en une journée? Même une semaine pourrait fonctionner, je pense. Pouvez-vous écrire ce code php ici? Vous pouvez également me donner un lien vers de bons tutoriels si vous le souhaitez.

Voici 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 ne sais pas comment faire ..)
  2. S'il est vieux, ignorez-le
  3. S'il est nouveau, dans mysql, views = views + 1
24
Nirav

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

Voici un joli tutoriel, c'est ce dont vous avez besoin.

Inscrivez-vous et montrez aux utilisateurs et visiteurs en ligne

Compter les utilisateurs et visiteurs en ligne à l'aide d'une table MySQL Dans ce didacticiel, vous apprendrez à enregistrer, à compter et à afficher sur 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 une base de données. Chaque fois qu'une page du site Web est consultée, le script php supprime tous les enregistrements antérieurs à une certaine heure (par exemple 2 minutes), ajoute l'utilisateur/visiteur actuel et prend le nombre d'enregistrements restant à 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 de les stocker dans une table MySQL, ce qui nécessite plus de requêtes.

Il s'agit d'abord de la méthode d'enregistrement dans un fichier texte sur le serveur, puis de 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 les fichiers ". Php" (avec include ()), ou dans les fichiers ". Html" (avec), comme vous peut voir dans les exemples présentés au bas de cette page; mais le serveur doit exécuter PHP. Stockage des utilisateurs et visiteurs en ligne dans un fichier texte

Pour ajouter des enregistrements dans un fichier sur le serveur avec PHP vous devez définir les autorisations CHMOD 0766 (ou CHMOD 0777) sur ce fichier, de sorte que le PHP peut écrire des données en elle.

1-Créez un fichier texte sur votre serveur (par exemple, nommé "userson.txt") et donnez-lui les autorisations 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éez un fichier PHP (nommé "usersontxt.php") ayant le code ci-dessous, puis copiez ce fichier php 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 fichier ".php", ajoutez le code suivant à l'endroit où vous souhaitez afficher le nombre d'utilisateurs et de visiteurs en ligne:

4-Pour afficher le nombre de visiteurs/utilisateurs en ligne dans un fichier ".html", 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 l'utilisez, vous devez ajouter: session_start ();. Count Utilisateurs et visiteurs en ligne utilisant une table MySQL

Pour vous inscrire, compter et afficher le nombre de visiteurs et d'utilisateurs en ligne dans une table MySQL, vous devez effectuer trois requêtes SQL: Supprimer les enregistrements antérieurs à un certain temps. Insérez une ligne avec le nouvel utilisateur/visiteur ou, s'il est déjà inséré, mettez à 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 visiteurs en ligne.

1-Nous créons d'abord la table "userson", avec 2 colonnes (uvon, dt). Dans la colonne "uvon" est enregistré le nom de l'utilisateur (s'il est connecté) ou l'IP du visiteur. Dans la colonne "dt" est stocké un nombre avec l'horodatage (heure Unix) lors de l'accès à la page. - Ajoutez 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 fichiers php sur votre serveur, exécutez le "create_userson.php" sur votre navigateur pour créer la table "userson".
  2. Incluez le fichier "usersmysql.php" dans le fichier php dans lequel vous souhaitez afficher le nombre d'utilisateurs et de visiteurs en ligne.
  1. Ou, si vous souhaitez l'insérer dans un fichier ".html", ajoutez ce code:

Exemples d'utilisation de ces scripts

• Inclure le "usersontxt.php" dans un fichier php:

• Inclusion du "usersmysql.php" dans un fichier html: compteur d'utilisateurs et visiteurs en ligne

Les deux scripts (avec stockage des données dans un fichier texte sur le serveur ou dans une table MySQL) afficheront un résultat comme celui-ci: En ligne: 5

Visiteurs: 3 Utilisateurs: 2 - MarPlo - Marius

18
Mihai

Des vues uniques sont toujours difficiles à casser. La vérification de l'adresse IP peut fonctionner, mais une adresse IP peut être partagée par plusieurs utilisateurs. Un cookie peut être une option viable, mais un cookie peut expirer ou être modifié par le client.

Dans votre cas, cela ne semble pas être un gros problème si le cookie est modifié, donc je recommanderais 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 +1 aux vues. S'il est défini, ne faites pas le +1.

Définissez la date d'expiration des cookies comme vous le souhaitez, semaine ou jour si c'est ce que vous voulez, et elle expirera après cette heure. Après expiration, ce sera à nouveau un utilisateur unique!


Modifier:
J'ai pensé que ce serait 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 n'êtes autorisé à stocker une adresse IP que pour une bonne raison (et je ne sais pas si le suivi des vues est une bonne raison). Donc, si vous avez l'intention de stocker l'adresse IP des visiteurs, je recommanderais de la hacher ou de la crypter avec un algorithme qui ne peut pas être inversé, pour vous assurer que vous ne violez aucune loi (en particulier après la mise en œuvre des lois GDPR).

12
Jite

J'ai modifié le code "Meilleure réponse", mais j'ai trouvé une chose utile qui manquait. Cela permettra également de suivre l'IP d'un utilisateur s'il utilise un proxy ou simplement si le serveur a installé nginx comme inverseur de 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 édité son code.

Trouvez la ligne qui dit ce qui suit:

// 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 remplacez-le par ceci:

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

Cela fonctionnera.

Voici le code complet en cas de problème:

<?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 n'ai pas encore testé cela sur le script Sql.

8
Broccoli

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

créer une table pour les adresses IP et l'horodatage de leurs visites.

vérifier SI l'IP n'existe pas OR time () - saved_timestamp> 60 * 60 * 24 (pour 1 jour), éditez les IP horodatage sur time() (signifie maintenant) et augmentez votre vue.

sinon, ne faites rien.

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

7
Alireza Fallah
$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 du tutoriel officiel de talkerscode si vous avez un problème http://talkerscode.com/webtricks/create-a-simple-pageviews-counter-using-php-and-mysql.php

3
asif