Cumuler plusieurs compteurs

Bonsoir,
j'ai le code suivant pour un compteur de visiteurs+un compteur de connectés en temps réel :
<?php
/*
* Si le fichier où l'on stock,* les données n'existe pas encore* on le crée.*/
$year = date("y");$fichier = '.htcompteur';
$fichier = $fichier . $year;
if( !file_exists($fichier) ) {  
$fp = fopen($fichier, "w");  
fwrite($fp, serialize(array()));  
fclose($fp);
}
/** Définition de variables* nécessaire au compteur :* - deux termes constants,* - l'ip du visiteur,* - la date et l'heure.*/
$argument_visites = 'visites';
$argument_requêtes = 'requêtes';
$ip = $_SERVER['REMOTE_ADDR'];
$time = date('YmdGis');
/** Récupération des données du* compteur précédemment stockées.*/
$lignes = file($fichier) or die('Un problème est survenu, le compteur ne peut pas s\'afficher');
$donnees = unserialize($lignes[0]);
/** Pour chaque clé du tableau de données* qui ne soit pas attribuée aux visites et aux requêtes* si la valeur correspond à une date antérieure* au même jour, on supprime l'ip du visiteur.*/

foreach( $donnees as $cle => $valeur ){
  if( substr($valeur, 0, 8) != substr($time, 0, 8) &&  $cle != $argument_visites &&  $cle != $argument_requêtes ) { 
   unset($donnees[$cle]);  
  }
}
/** On incrémente ( ajoute +1 ) la valeur* du nombre de requêtes.* Si l'ip n'est pas encore enregistrée,* on incrémente la valeur du nombre de visites* et on ajoute l'ip dans le tableau accompagné* de la date et de l'heure de l'exécution.*/

$donnees[$argument_requêtes]++;
if( !$donnees[$ip] ) {  
$donnees[$argument_visites]++;  
$donnees[$ip] = $time;
}

/** On effectue un petit report de variable* pour une utilisation ultérieur plus aisée.*/
$nb_visiteurs = $donnees[$argument_visites];
$nb_aujourdhui = count($donnees)-2;
$nb_requêtes = $donnees[$argument_requêtes];
/** On stock le tableau dans le fichier de données* en écrasant sa valeur précédente.*/
$fp = fopen($fichier,"wb");fwrite($fp, serialize($donnees));fclose($fp);/** On affiche les résultats du compteur.*/if ($nb_visiteurs == '1') {print $nb_visiteurs. " visiteur depuis le 01/01/20";}else {print $nb_visiteurs. " visiteurs depuis le 01/01/20";}print $year." dont ";print $nb_aujourdhui. " aujourd'hui, ";if ($nb_requêtes == '1') {print $nb_requêtes. " page chargée.<br />";}else {print $nb_requêtes. " pages chargées.<br />";}if($bdd = mysqli_connect('localhost', 'xxxx', 'yyyy', 'zzzzz')){}else{echo 'Erreur';}$donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'')->fetch_array();if ($donnees['nbre_entrees'] == 0){$bdd->query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');}else{$bdd->query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');}$timestamp_5min = time() - (60 * 5);$bdd->query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);$donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes')->fetch_array();if ($donnees["nbre_entrees"] == '1') {print $donnees["nbre_entrees"]. " connecté en ce moment !";}else {print $donnees["nbre_entrees"]. " connectés en ce moment !";}?>

[]

EDIT : Ajout des balises de code

Merci d'y penser la prochaine fois (jordane)

comme vous pouvez le voir j'ai donc un fichier par ans pour le compteur de visiteurs.
Comment pourrais-je faire pour cumuler les différents fichiers puis afficher le nombre total de visiteurs depuis la création du site svp ?
Merci.
Excellente soirée.
Amicalement! Corentin.

11 réponses

  1. Contributeur
    bonsoir, ton code est particulièrement illisible.
    tu souhaites "cumuler" les différents fichiers, ou bien les lire un par un et afficher le nombre total de visiteurs?
    tu as un soucis particulier, qu'est-ce qui te bloque?
    es-tu certain de ne pas vouloir utiliser une base de données pour stocher toutes ces information?
    0
    1. Salut,
      euh oui pour la BDD, je préfère continuer avec les fichiers.
      Je veux lire les fichiers un par un puis afficher le nombre total de visiteurs.
      0
      1. Contributeur
        bonjour, tu as un soucis particulier, qu'est-ce qui te bloque?
        tu cherches comment parcourir tous les fichiers, comment en lire un, ...?
        0
    2. Comment récupérer dans chaque ficheirs le nombre de visiteurs y compris cleui de cette année et créer la variable correspondante.
      En gros je sais rien faire sauf l'affichage de la variable.
      0
      1. Contributeur
        c'est toi qui a écrit le code que tu as montré?
        0
    3. Non, on me l'a passé.
      0
      1. Afin que ça soit lisible pour les autres:

        /* Si le fichier où l'on stock, 
        les données n'existe pas encore on le crée.*/
        $year = date("y");
        $fichier = '.htcompteur';
        $fichier = $fichier . $year;
        if( !file_exists($fichier) ) { 
         $fp = fopen($fichier, "w"); 
         fwrite($fp, serialize(array())); 
         fclose($fp);
        }
        /* 
        Définition de variables nécessaire au compteur : 
        - deux termes constants,
        - l'ip du visiteur,
        - la date et l'heure.
        */
        $argument_visites = 'visites';
        $argument_requêtes = 'requêtes';
        $ip = $_SERVER['REMOTE_ADDR'];
        $time = date('YmdGis');
        /*
        Récupération des données du compteur précédemment stockées.
        */
        $lignes = file($fichier) or die('Un problème est survenu, le compteur ne peut pas s\'afficher');
        $donnees = unserialize($lignes[0]);
         /* Pour chaque clé du tableau de données qui ne soit pas attribuée aux visites
          et aux requêtes si la valeur correspond à une date antérieure au même jour, on supprime l'ip du visiteur. */
        foreach( $donnees as $cle => $valeur ){ 
         if( substr($valeur, 0, 8) != substr($time, 0, 8) && $cle != $argument_visites && $cle != $argument_requêtes ) { 
          unset($donnees[$cle]); 
         }
        }
        /** On incrémente ( ajoute +1 ) la valeur* du nombre de requêtes.
        Si l'ip n'est pas encore enregistrée,
        on incrémente la valeur du nombre de visites
        et on ajoute l'ip dans le tableau accompagné
        de la date et de l'heure de l'exécution.
        */
        $donnees[$argument_requêtes]++;
        if( !$donnees[$ip] ) { 
          $donnees[$argument_visites]++; 
          $donnees[$ip] = $time;
        }
        /** On effectue un petit report de variable* pour une utilisation ultérieur plus aisée.*/
        $nb_visiteurs = $donnees[$argument_visites];
        $nb_aujourdhui = count($donnees)-2;
        $nb_requêtes = $donnees[$argument_requêtes];
        /** On stock le tableau dans le fichier de données* en écrasant sa valeur précédente.*/
        $fp = fopen($fichier,"wb");
        fwrite($fp, serialize($donnees));
        fclose($fp);
        /* On affiche les résultats du compteur.*/
        if ($nb_visiteurs == '1') {
         print $nb_visiteurs. " visiteur depuis le 01/01/20";
        } else {
         print $nb_visiteurs. " visiteurs depuis le 01/01/20";
        }
        print $year." dont ";
        print $nb_aujourdhui. " aujourd'hui, ";
        if ($nb_requêtes == '1') {
         print $nb_requêtes. " page chargée.<br />";
        } else {
         print $nb_requêtes. " pages chargées.<br />";
        } 
        if($bdd = mysqli_connect('localhost', 'xxxx', 'yyyyy', 'zzzz')) {
        
        } else { 
         echo 'Erreur';
        }
        $donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'')->fetch_array();
        if ($donnees['nbre_entrees'] == 0) {
         $bdd->query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
        } else {
         $bdd->query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
        } 
        $timestamp_5min = time() - (60 * 5);
        $bdd->query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);
        $donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes')->fetch_array();
        if ($donnees["nbre_entrees"] == '1') {
         print $donnees["nbre_entrees"]. " connecté en ce moment !";
        } else {
         print $donnees["nbre_entrees"]. " connectés en ce moment !";
        }
        0
        1. Déjà ton code peut-être largement optimisé, comme quand tu veux mettre au pluriel ou éviter les if vide et mettre un else pour faire la condition contraire alors qu'un ! suffit.
          Et aussi évite les accents pour les noms de variable car il suffit d'un mauvais encodage pour faire planter le script.

          Sinon il faut que tu englobes ton scripts dans une fonction, utiliser la fonction glob pour récupérer tes fichiers et une boucle foreach pour exécuter le code sur chaque fichier.
          0
      2. Salut,
        wow, ok, mais je ne sais pas du tout faire tout ça !
        COmme je l'ai dis je ne suis pas l'auteur de ce code, je m'y connais vraiment très peu en php et j'ai pas encore eus le temps de l'apprendre.
        Peux-tu me donner un exemple ou m'expliquer comment faire dans mon code stp ?
        Merci.
        0
        1. Ouep enfin il suffit de rechercher un peu sur Internet pour trouver la réponse vu que je t'ai donné les fonctions à utiliser. Il faut t'y mettre au PHP au lieu de demander gratuitement à tout le monde de le faire à ta place, car déjà tu n'apprend rien, ensuite un jour on y implantera une backdoor ou une erreur qui peut tout faire planter et tu comprendras pas pourquoi car tu n'auras pas vérifier le script.
          0
      3. Contributeur
        Je propose d'ajouter ceci avant le commentaire
        /* On affiche les résultats du compteur.*/

        foreach (glob(".htcompteur.*") as $ancienfichier)
        {
            	if ! ( $ancienfichier == $fichier )
        	{
        		$lignes = file($ancienfichier) or die('Un problème est survenu avec '. $ancienfichier);
        		$donnees = unserialize($lignes[0]);
        		$nb_visiteurs = $nb_visiteurs + $donnees[$argument_visites];
        		$nb_requêtes = $nb_requêtes + $donnees[$argument_requêtes];
        	}
        }
        0
        1. @ZeNairolf ouais, mais je te l'ai dis j'ai pas le temps, déjà le collège toute la semaine alors le weekend je prend pas le temps de m'y mettre.
          @yg_be merci mais ça ne fonctionne pas.
          0
          1. Contributeur
            et ceci affiche quoi?
            echo 'avant foreach glob <br>';
            foreach (glob(".htcompteur.*") as $ancienfichier)
            {
                	echo 'ancienfichier: '. $ancienfichier .'<br>';
                    if ! ( $ancienfichier == $fichier )
            	{
            		echo 'traitement ancienfichier: '. $ancienfichier .'<br>';
                            $lignes = file($ancienfichier) or die('Un problème est survenu avec '. $ancienfichier);
            		$donnees = unserialize($lignes[0]);
            		$nb_visiteurs = $nb_visiteurs + $donnees[$argument_visites];
            		$nb_requêtes = $nb_requêtes + $donnees[$argument_requêtes];
            	}
            }
            echo 'après foreach glob <br>';
            0
        2. Rien du tout :(
          0
          1. Contributeur
            Et donc, avant que tu ajoutes mon code, cela affichait les statistiques d'une année, et maintenant, avec mon code ajouté, cela n'affiche plus rien?
            Peux-tu montrer le code complet?
            0
        3. Aucun souci :

          <?php
          // Si le fichier où l'on stock,* les données n'existe pas encore* on le crée.*/
          $year = date("y");
          
          $fichier = '.htcompteur';
          $fichier = $fichier . $year;
          if( !file_exists($fichier) ) {  $fp = fopen($fichier, "w");
            fwrite($fp, serialize(array()));
            fclose($fp);
          
          }
          /** Définition de variables* nécessaire au compteur :* - deux termes constants,* - l'ip du visiteur,* - la date et l'heure.*/
          $argument_visites = 'visites';
          $argument_requêtes = 'requêtes';
          $ip = $_SERVER['REMOTE_ADDR'];
          $time = date('YmdGis');
          /** Récupération des données du* compteur précédemment stockées.*/
          $lignes = file($fichier) or die('Un problème est survenu, le compteur ne peut pas s\'afficher');
          $donnees = unserialize($lignes[0]);
          /** Pour chaque clé du tableau de données* qui ne soit pas attribuée aux visites et aux requêtes* si la valeur correspond à une date antérieure* au même jour, on supprime l'ip du visiteur.*/
          foreach( $donnees as $cle => $valeur ){  
          if( substr($valeur, 0, 8) != substr($time, 0, 8) &&  $cle != $argument_visites &&  $cle != $argument_requêtes ) {
              unset($donnees[$cle]);
            }}/** On incrémente ( ajoute +1 ) la valeur* du nombre de requêtes.* Si l'ip n'est pas encore enregistrée,* on incrémente la valeur du nombre de visites* et on ajoute l'ip dans le tableau accompagné* de la date et de l'heure de l'exécution.*/
          $donnees[$argument_requêtes]++;
          if( !$donnees[$ip] ) {  
            $donnees[$argument_visites]++;
            $donnees[$ip] = $time;
          }
          /** On effectue un petit report de variable* pour une utilisation ultérieur plus aisée.*/
          $nb_visiteurs = $donnees[$argument_visites];
          $nb_aujourdhui = count($donnees)-2;
          $nb_requêtes = $donnees[$argument_requêtes];
          /** On stock le tableau dans le fichier de données* en écrasant sa valeur précédente.*/
          $fp = fopen($fichier,"wb");
          fwrite($fp, serialize($donnees));
          fclose($fp);
          echo 'avant foreach glob <br>';
          foreach (glob(".htcompteur.*") as $ancienfichier){     echo 'ancienfichier: '. $ancienfichier .'<br>';
                  if ! ( $ancienfichier == $fichier ) {  echo 'traitement ancienfichier: '. $ancienfichier .'<br>';
                          $lignes = file($ancienfichier) or die('Un problème est survenu avec '. $ancienfichier);
            $donnees = unserialize($lignes[0]);
            $nb_visiteurs = $nb_visiteurs + $donnees[$argument_visites];
            $nb_requêtes = $nb_requêtes + $donnees[$argument_requêtes];
           }}echo 'après foreach glob <br>';
          /** On affiche les résultats du compteur.*/
          if ($nb_visiteurs == '1') {print $nb_visiteurs. " visiteur depuis le 01/01/20";
          
          }
          else {print $nb_visiteurs. " visiteurs depuis le 01/01/20";
          
          }
          print $year." dont ";
          print $nb_aujourdhui. " aujourd'hui, ";
          if ($nb_requêtes == '1') {print $nb_requêtes. " page chargée.<br />";
          
          }
          else {print $nb_requêtes. " pages chargées.<br />";
          
          }
          ?>
          
                                    try{             
                                    $requete="SELECT * FROM administrateur";
          
                                    $query=sqlsrv_query($conn, $requete);
          
                                    
                                    while($donnees=sqlsrv_fetch_array($query)){ 
                                      
                                      if($donnees['username']===$username && $donnees['Motd_passe']===$Motd_passe){  
                                        
                                          session_start();
          
                                          $_SESSION['id']=$donnees['id'];
          
                                          $_SESSION['admin']=$username;
          
                                         
                                         header("Location: /admin/ordinateur/index.php");
            
                                                              
                                  }
                                  
                                }
                                sqlsrv_free_stmt($query);
          
                                
                              }catch(Exception $e){
                                die('Erreur '.$e->getMessage());
          
                              }
                               
                                }
                            sqlsrv_close($query);
          
          

          EDIT : Ajout des balises de code (encore.....) !

          .
          Amicalement! Corentin.
          0
          1. Modérateur
            Bonjour,

            Je me permet juste quelques remarques :
            1 - Merci de poster ton code AVEC les balises de code (et en faisant de l'indentation...)
            (je viens de le faire pour toi encore une fois....)

            2 - Tu corrigeras le bout de code :
            try{             
                                      $requete="SELECT * FROM administrateur";
                                      $query=sqlsrv_query($conn, $requete);
            
                                   
                                      while($donnees=sqlsrv_fetch_array($query)){                          
                                        if($donnees['username']===$username && $donnees['Motd_passe']===$Motd_passe){                              
                                            session_start();
                                            $_SESSION['id']=$donnees['id'];
                                            $_SESSION['admin']=$username;
                                           header("Location: /admin/ordinateur/index.php");                          
                                    }                        
                                  }
                                  sqlsrv_free_stmt($query);
                                  
                                }catch(Exception $e){
                                  die('Erreur '.$e->getMessage());
                               }                    
                           }
                    sqlsrv_close($query);
            

            Par celui que nous t'avons donné dans ton autre discussion .....

            3 - Comme cela t'a été indiqué ... N'utilise pas de caractères accentués comme "noms de variables"

            4 - Active l'affichage des erreurs PHP. (voir mes messages dans tes questions précédentes...)
            0
          2. Contributeur
            Et si tu retires le code que je t'ai proposé, cela affiche de nouveau les statistiques d'une année?
            0
        4. Oui.
          0
          1. Contributeur
            Et ainsi?
            echo 'avant foreach glob <br />';
            foreach (glob(".htcompteur.*") as $ancienfichier)
            {
                	echo 'ancienfichier: '. $ancienfichier .'<br />';
                    if ! ( $ancienfichier == $fichier )
            	{
            		echo 'traitement ancienfichier: '. $ancienfichier .'<br />';
                            $lignes = file($ancienfichier) or die('Un problème est survenu avec '. $ancienfichier);
            		$donnees = unserialize($lignes[0]);
            		$nb_visiteurs = $nb_visiteurs + $donnees[$argument_visites];
            		$nb_requêtes = $nb_requêtes + $donnees[$argument_requêtes];
            	}
            }
            echo 'après foreach glob <br />';
            0
          2. yg_be, ton code fonctionne presque :
            ligne 5
            if ( $ancienfichier != $fichier )


            Pour résumer :
            <?php
            header('Content-Type: text/html; charset=utf-8');
            
            ini_set('display_errors', 'On');
            error_reporting(E_ALL);
            
            /*
            * Si le fichier où l'on stock,
            * les données n'existe pas encore
            * on le crée.*/
            $year = date("y");
            $fichier = '.htcompteur';
            $fichier = $fichier . $year;
            
            if( !file_exists($fichier) ) {
             $fp = fopen($fichier, "w");
             fwrite($fp, serialize(array()));
             fclose($fp);
            }
            
            /** Définition de variables
             * nécessaire au compteur :
             * - deux termes constants,
             * - l'ip du visiteur,
             * - la date et l'heure.*/
            $argument_visites = 'visites';
            $argument_requetes = 'requêtes';
            $ip = $_SERVER['REMOTE_ADDR'];
            $time = date('YmdGis');
            
            /** Récupération des données du
             * compteur précédemment stockées.*/
            $lignes = file($fichier) or die('Un problème est survenu, le compteur ne peut pas s\'afficher');
            $donnees = unserialize($lignes[0]);
            
            /** Pour chaque clé du tableau de données
             * qui ne soit pas attribuée aux visites et aux requêtes
             * si la valeur correspond à une date antérieure
             * au même jour, on supprime l'ip du visiteur.*/
            foreach( $donnees as $cle => $valeur ){
             if( substr($valeur, 0, 8) != substr($time, 0, 8)
             &&  $cle != $argument_visites &&  $cle != $argument_requetes ) {
              unset($donnees[$cle]);
             }
            }
            
            /** On incrémente ( ajoute +1 ) la valeur
             * du nombre de requêtes.
             * Si l'ip n'est pas encore enregistrée,
             * on incrémente la valeur du nombre de visites
             * et on ajoute l'ip dans le tableau accompagné
             * de la date et de l'heure de l'exécution.*/
            
            $donnees[$argument_requetes]++;
            if( !$donnees[$ip] ) {
             $donnees[$argument_visites]++;
             $donnees[$ip] = $time;
            }
            
            /** On effectue un petit report de variable
             * pour une utilisation ultérieur plus aisée.*/
            $nb_visiteurs = $donnees[$argument_visites];
            $nb_aujourdhui = count($donnees)-2;
            $nb_requetes = $donnees[$argument_requetes];
            
            /** On stock le tableau dans le fichier de données
             * en écrasant sa valeur précédente.*/
            $fp = fopen($fichier,"wb");
            fwrite($fp, serialize($donnees));
            fclose($fp);
            
            /** Lecture des années précédentes **/
            foreach (glob(".htcompteur*") as $ancienfichier)
            {
             if ( $ancienfichier != $fichier ){
              $lignes = file($ancienfichier) or die('Un problème est survenu avec '. $ancienfichier);
              $donnees = unserialize($lignes[0]);
              $nb_visiteurs = $nb_visiteurs + $donnees[$argument_visites];
              $nb_requetes = $nb_requetes + $donnees[$argument_requetes];
             }
            }
            
            /** On affiche les résultats du compteur.*/
            print $nb_visiteurs. " visiteur".($nb_visiteurs>1?'s':'')." depuis le 01/01/20".$year;
            print " dont ".$nb_aujourdhui. " aujourd'hui, ";
            print $nb_requetes. " pages chargée".($nb_requetes>1?'s':'').".<br />";
            
            
            /** Compteur des connectés **/
            $bdd = mysqli_connect('localhost', 'xxxx', 'yyyy', 'zzzzz') or die('Erreur de connexion à la BDD');
            
            $donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'')->fetch_array();
            
            if ($donnees['nbre_entrees'] == 0){
             $bdd->query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
            }else{
             $bdd->query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
            }
            
            $timestamp_5min = time() - (60 * 5);
            $bdd->query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);
            $donnees = $bdd->query('SELECT COUNT(*) AS nbre_entrees FROM connectes')->fetch_array();
            print $donnees["nbre_entrees"]. " connecté".($nb_entrees>1?'s':'')." en ce moment !";
            
            ?>
            


            Les ip n'étant lues que dans le fichier de l'année en cours, ceux qui reviennent sur la page après un changement d'année sont comptés plusieurs fois.

            A mon avis, puisqu'il y a une base de donnée, on pourrait envoyer le contenu des fichiers dedans une fois pour toute et gérer les 2 compteurs en SQL.
            0