Compteur de visite

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 13:09

Je cherche un script qui permette d'afficher le nombre de visite sur un site par semaine pour chaque visiteur.
D'avance merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 sept. 2007, 14:15

Modération :
PHPFrance n'est pas un site de distribution de scripts gratuits,
ni de débuggage de scripts téléchargés et utilisés sans compréhension.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 17:05

Bon alors je reformule ma requete (désolé)
j'aimerai pourvoir affichier pour chaque membre un journal de connexion.
nombre de connexion par jour
nombre de connexion par semaine
nombre de connexion par mois

A chaque fois qu'un membre se connecte je récupère son ip :
$ip= getenv(REMOTE_ADDR);
la date de connexion :

Code : Tout sélectionner

$maintenant = time();
et son pseudo :
$pseudo = trim($pseudo);
mais n'étant pas spécialiste je sais pas trop comment m'y prendre :
l'idée est si le même membre se connecte à nouveau et si la différence entre sa dernière connexion et celle actuelle est plus grande que 10 minutes (par exemple) alors on incrémente $connexion de + 1.
et pour les connexion semaine ou mensuels... je sais pas trop.
Pouvez vous me donner une piste ?
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 sept. 2007, 17:16

Il te faut donc un endroit pour stocker les informations de connexion de tes visiteurs, une table dans une base de données par exemple.

Lors de la connexion d'un membre, tu vas chercher dans la table la date de sa dernière connexion.
Tu fait la différence entre le timestamp de maintenant et le timestamp de sa dernière connexion. Si la différence est supérieur à une limite que tu t'es fixé (par exemple 10mn => 10*60s => 600s), tu incrémentes le nombre de visite.
Dans tout les cas, tu mémorises le timestamp actuel dans la table pour qu'à la prochaine visite, tu compares réellement par rapport à sa dernière visite et pas sa dernière connexion ;)

Glossaire :
Timestamp : le timestamp est la durée en seconde écoulée depuis le 01/01/1970 et un instant précis.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 17:19

donc mon idée était correctes
Mais pour les connexion à la semaine et mensuel ? comment faire

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 sept. 2007, 17:31

Dans ce cas, tu peux avoir une table "Connexion" dans laquelle tu ajoutes un enregistrement dès que tu détectes que ton membre viens de se connecter, avec la date de la connexion.

Pour détecter la durée de non connexion, il te suffit de comparer le timestamp actuel avec le timestamp de la dernière connexion du membre.

Et pour les stats, comme tu auras le détail de chaque connexion, tu pourras générer des stats par jour, mois, semaine, ... à ta guise ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 17:42

Dans ce cas, tu peux avoir une table "Connexion" dans laquelle tu ajoutes un enregistrement dès que tu détectes que ton membre viens de se connecter, avec la date de la connexion.
je me suis mis de suite au travail :
voilà ou j'en suis (pas spécialiste je te le rappelle)
// Connexion à la base de données
	$base = @mysql_connect($base_serveur, $base_utilisateur, $base_mdp)  or die('Erreur de connexion :' . mysql_error());
	@mysql_select_db($base_table, $base) or die('Erreur de sélection :' . mysql_error());

// les paramètres
$time = time();
$ip=getenv(REMOTE_ADDR);
$pseudo = trim($pseudo);

// j'effectue une requete pour vérifier si le pseudo est dans la table 
$requete = "SELECT * FROM $base_table WHERE pseudo = '$pseudo'";
	$resultat = mysql_query($requete);
	$num = mysql_num_rows($resultat);
// si le pseudo n'est pas encore dans la table alors on insère celui_ci
if($num == 0) {  
   $query = mysql_query("INSERT INTO $base_table VALUES ('$time','$ip','$pseudo')" }
else{

}
Après le else je dois donc récupérer avec le timestamp de sa dernière connexion et le comparer avec le timestamp actuel si l'écart depasse un certain temps alors j'incrémente la valeur de la connexion et je dois aussi mettre à jour la valeur du timestamp.
Je suis sur la bonne piste ? (merci bcp pour ton aide)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 sept. 2007, 17:45

Oui, tu es sur la bonne piste.

Le seul choix que j'aurais fait différemment, c'est de stocker des dates et non pas un timestamp en base de données et, soit de laisser PHP transformer cette date en timestamp, soit d'utiliser directement la fonction TIMESTAMP() de MySQL pour récupérer le timestamp.

Ça sera beaucoup plus pratique pour construire les requêtes de stats avec des dates qu'avec des entiers
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 17:48

tu veux dire comme cela ?
$jour = date('j');
$mois = date('n');
$annee = date('Y');
$aujourdhui = mktime(0, 0, 0, $mois, $jour, $annee);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 sept. 2007, 18:00

non, pour le timestamp actuel, tu fait $maintenant = time();

mais lorsque tu ajoutes un enregistrement dans la table connexion, tu fait un truc du genre

Code : Tout sélectionner

INSERT INTO connexion (ip, date, pseudo) VALUES ('adresseIP', NOW(), 'pseudo')
Et lorsque tu veux récupérer la dernière connexion d'un membre, tu fait un truc du genre :

Code : Tout sélectionner

SELECT MAX(TIMESTAMP(date)) from connexion where ip='ip'
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 37 Messages

23 sept. 2007, 18:04

j'ai quelque chose de plus élaboré :
<?
// structure de la table myELECTRONSconnexion  //prem_visite BIGINT not null,
//la_date BIGINT not null,
//total INT not null,
//ip VARCHAR (50) not null,
//hostname VARCHAR (100) not null
// pseudo VARCHAR (50) not null                                  
/***********************************
* Récupération de la configuration *
***********************************/  // Chemin absolu vers le fichier config.inc.php
$chemin = __FILE__;
$chemin = str_replace('compteur.php', '', $chemin);  // On vérifie que le fichier config.inc.php existe bien
if (!file_exists($chemin . 'config.inc.php')) {
    echo 'Le fichier config.inc.php manque à l\'appel !';
} else {
    require_once($chemin . 'config.inc.php');      // Connexion à la base de données
    $base = @mysql_connect($base_serveur, $base_utilisateur, $base_mdp)  or die('Erreur de connexion :' . mysql_error());
    @mysql_select_db($base_nom, $base) or die('Erreur de sélection :' . mysql_error());  /***************************
    * Vérifications préalables *
    ***************************/      
    $requete = "SELECT * FROM $base_table WHERE ip = 'reference'";  // dans la table il y a une ligne qui contient les informations suivantes :
//(prem_visite, la_date, total, ip, hostname) VALUES ('$aujourdhui', '$aujourdhui', '$total_initial', 'reference', 'internet')";//
    
$resultat = mysql_query($requete);
    $data = mysql_fetch_assoc($resultat);            // On récupère la date du dernier jour stocké dans la base
    $date_stockee = $data['la_date'];      // Si on a changé de jour, on remet le nombre de visites quotidiennes à 0 pour chaque membres
    if ( ($aujourdhui != $date_stockee) ) {
        // Le nombre de visites de chaque visiteur de la base est remis à 0
        $requete = "UPDATE $base_table SET total = '0' WHERE ip != 'reference'";
        $resultat = mysql_query($requete);
        // La date stockée est mise à jour à la date d'aujourd'hui
        $requete = "UPDATE $base_table SET la_date = '$aujourdhui' WHERE ip = 'reference'";
        $resultat = mysql_query($requete);
    }  
/***********************
    * Traitement des dates *
    ***********************/      // On stocke dans $maintenant la date courante
    $jour = date('j');
    $mois = date('n');
    $annee = date('Y');
    $aujourdhui = mktime(0, 0, 0, $mois, $jour, $annee);    // date d'aujourd'hui à minuit au format timestamp
    $maintenant = time(); // date de l'instant présent au format timestamp  
/***********************
    * Traitement du pseudo *
    ***********************/      $pseudo = trim($pseudo); // pseudo du membre  /*************************
    * Traitement des visites *
    *************************/      // Récupération de l'adresse IP du visiteur dans $ip
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip  = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }      // Et du host correspondant à cette IP
    $hostname = gethostbyaddr($ip);  
/*************************
// j'effectue une requete pour vérifier si le pseudo est déjà dans la table    $requete = "SELECT FROM $base_table WHERE pseudo = '$pseudo'";       $resultat = mysql_query($requete);      $num = mysql_num_rows($resultat);  
// si le pseudo n'est pas encore dans la table alors on insère celui_ci  if($num == 0) {       $requete = "INSERT INTO $base_table (prem_visite, la_date, total, ip, hostname) VALUES ('$maintenant', '$maintenant', 1, '$ip', '$hostname')";
                $resultat = mysql_query($requete);
                
        }  else {  // On récupère toutes les données qui lui correspondent
            $requete = "SELECT * FROM $base_table WHERE pseudo = '$pseudo'";
            $resultat = mysql_query($requete);
            $data = mysql_fetch_assoc($resultat);              // On récupère la date de ses première et dernière visites
            $prem_visite = $data['prem_visite'];
            $der_visite = $data['la_date'];              // Si la période est dépassée
            if ( ($maintenant - $prem_visite) > (60*60) ) {
                // On compte le visiteur comme nouveau, même si c'est dans la même journée
                $nb_visites = $data['total'] + 1;
                $requete = "UPDATE $base_table SET prem_visite = '$maintenant' , la_date = '$maintenant', total = $nb_visites WHERE pseudo = '$pseudo'";
                $resultat = mysql_query($requete);
            }
            // Sinon on est dans la même période d'unicité
            else {
                // On met uniquement à jour l'heure de son dernier passage
                $requete = "UPDATE $base_table SET la_date = '$maintenant' WHERE pseudo = '$pseudo'";
                $resultat = mysql_query($requete);
            }
        }
    }
Donc si on n'a pas change de jour j'incrémente le nb de visite de chaque visiteur si celui ci se connecte toutes les heures. Une fois le jour changé le nbre de viste pour chaque visiteur devient 0.
Donc je peux récupérer facilement le nombre de visite pas jour. Comment récupérer le nbre de visite pas semaine et par moi ?
Merci.