Bonjour je me lance dans la création d'un site internet depuis quelques semaine maintenant.
Je souhaite créer une compteur de visite total avec un philtre par IP afin que chaque IP ne soit compter qu'une fois et je souhaite faire ceci via phpadmin.
Cependant je n'ai que peu de connaissance dans ce domaine, mes essais ce sont transformé en échecs.
Quand tu dis avec phpMyAdmin tu veux dire quoi ? En SQL directement la-bas?
Parce que je trouve que c'est plus simple en php, si tu as bien sur acces a ces donnees en php.
Salut et bien je souhaiterais faire un compteur en sql et php c'est à dire que je ne veux pas d'un fichier compteur.txt qui ne regarde seulement la dernière IP.
Je voudrais que mysql recolte les données et php pour affiché le compteur de visite sur mon site.
Si tu as suivi le code qui dans l'article que ton lien montre alors tu n'auras qu'a faire un SELECT * FROM `stats_visites`puisque cette table contient bien le nombre de visiteurs.
Comment tu as implémenté l'enregistrement d'un nouvel utilisateur(ip) dans ta base de donnees s'il te plait ? Tu n'en dis pas assez.
Cependant je n'ai que peu de connaissance dans ce domaine, mes essais ce sont transformé en échecs.
Si tu as suivi le code qui dans l'article que ton lien montre alors tu n'auras qu'a faire un SELECT * FROM `stats_visites`puisque cette table contient bien le nombre de visiteurs.
Comment tu as implémenté l'enregistrement d'un nouvel utilisateur(ip) dans ta base de donnees s'il te plait ? Tu n'en dis pas assez.
Cependant je n'ai que peu de connaissance dans ce domaine, mes essais ce sont transformé en échecs.
Qu'as tu fait dans tes essais ?
Voici mon code :
<?php
// Fonction qui permet de mettre à jour le compteur de visites
function compter_visite(){
// On va utiliser l'objet $pdo pour se connecter, il est créé en dehors de la fonction
// donc on doit indiquer global $pdo; au début de la fonction
global $pdo;
// On prépare les données à insérer
$ip = $_SERVER['REMOTE_ADDR']; // L'adresse IP du visiteur
$date = date('Y-m-d'); // La date d'aujourd'hui, sous la forme AAAA-MM-JJ
// Mise à jour de la base de données
// 1. On initialise la requête préparée
$query = $pdo->prepare("
INSERT INTO stats_visites (ip , date_visite , pages_vues) VALUES (:ip , :date , 1)
ON DUPLICATE KEY UPDATE pages_vues = pages_vues + 1
");
// 2. On execute la requête préparée avec nos paramètres
$query->execute(array(
':ip' => $ip,
':date' => $date
));
}
?>
<?php
// On indique au navigateur qu'on utilise l'encodage UTF-8
header('Content-type: text/html; charset=utf-8');
// Paramètres de connexion à la base
define('DB_HOST' , 'localhost');
define('DB_NAME' , 'fdgdfgdf');
define('DB_USER' , 'fdgfgfd');
define('DB_PASS' , 'Adsfgdfg!');
// Connexion à la base avec PDO
try{
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(Exception $e) {
echo "Impossible de se connecter à la base de données '".DB_NAME."' sur ".DB_HOST." avec le compte utilisateur '".DB_USER."'";
echo "<br/>Erreur PDO : <i>".$e->getMessage()."</i>";
die();
}
?>
Voici mes tables mysql :
J'ai un "1" qui apparait sur ma page donc je me dit qu'on est plus très loin :')
Montre comment et ou tu affiches cela. Tu fais bien echo $nombre_de_visiteurs; ?
Voici le code :
<?php
// On indique au navigateur qu'on utilise l'encodage UTF-8
header('Content-type: text/html; charset=utf-8');
// Paramètres de connexion à la base
define('DB_HOST' , 'localhost');
define('DB_NAME' , 'assistouest');
define('DB_USER' , 'adrienpiron');
define('DB_PASS' , 'Ap6844100?!');
// Connexion à la base avec PDO
try{
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(Exception $e) {
echo "Impossible de se connecter à la base de données '".DB_NAME."' sur ".DB_HOST." avec le compte utilisateur '".DB_USER."'";
echo "<br/>Erreur PDO : <i>".$e->getMessage()."</i>";
die();
}
?>
<?php
// Fonction qui permet de mettre à jour le compteur de visites
function compter_visite(){
// On va utiliser l'objet $pdo pour se connecter, il est créé en dehors de la fonction
// donc on doit indiquer global $pdo; au début de la fonction
global $pdo;
// On prépare les données à insérer
$ip = $_SERVER['REMOTE_ADDR']; // L'adresse IP du visiteur
$date = date('Y-m-d'); // La date d'aujourd'hui, sous la forme AAAA-MM-JJ
// Mise à jour de la base de données
// 1. On initialise la requête préparée
$query = $pdo->prepare("
INSERT INTO stats_visites (ip , date_visite , pages_vues) VALUES (:ip , :date , 1)
ON DUPLICATE KEY UPDATE pages_vues = pages_vues + 1
");
// 2. On execute la requête préparée avec nos paramètres
$query->execute(array(
':ip' => $ip,
':date' => $date
));
}
$query = $pdo->prepare("SELECT * FROM stat_visites ");
$query->execute();
$result = $query->fetchAll();
$nombre_total_de_visiteurs = count($result);
echo $nombre_total_de_visiteurs;
echo $nombre_de_visiteurs;
?>
Ta table c'est stats_visites mais dans mon exemple j'ai ecris stat_visites tu as vu cela ?
Salut, effectivement il y avait cette erreur qui est maintenant corrigé, merci ! :-)
Cependant la tables ne recupère pas les donnes des visiteurs c'est pour cette raison qu'elle reste bloiqué à 0.
J'ai rentrer manuellement dans phpmyadmin des infos et la tables est maintenant à 1.
Voici les infos de la tables :
et le code php toujours :
<?php
// On indique au navigateur qu'on utilise l'encodage UTF-8
header('Content-type: text/html; charset=utf-8');
// Paramètres de connexion à la base
define('DB_HOST' , 'localhost');
define('DB_NAME' , 'assistouest');
define('DB_USER' , 'adrienpiron');
define('DB_PASS' , 'Ap6844100?!');
// Connexion à la base avec PDO
try{
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(Exception $e) {
echo "Impossible de se connecter à la base de données '".DB_NAME."' sur ".DB_HOST." avec le compte utilisateur '".DB_USER."'";
echo "<br/>Erreur PDO : <i>".$e->getMessage()."</i>";
die();
}
?>
<?php
// Fonction qui permet de mettre à jour le compteur de visites
function compter_visite(){
// On va utiliser l'objet $pdo pour se connecter, il est créé en dehors de la fonction
// donc on doit indiquer global $pdo; au début de la fonction
global $pdo;
// On prépare les données à insérer
$ip = $_SERVER['REMOTE_ADDR']; // L'adresse IP du visiteur
$date = date('Y-m-d'); // La date d'aujourd'hui, sous la forme AAAA-MM-JJ
// Mise à jour de la base de données
// 1. On initialise la requête préparée
$query = $pdo->prepare("
INSERT INTO stats_visites (ip , date_visite , pages_vues) VALUES (:ip , :date , 1)
ON DUPLICATE KEY UPDATE pages_vues = pages_vues + 1
");
// 2. On execute la requête préparée avec nos paramètres
$query->execute(array(
':ip' => $ip,
':date' => $date
));
echo $pages_vues;
}
$query = $pdo->prepare("SELECT * FROM stats_visites ");
$query->execute();
$result = $query->fetchAll();
$pages_vues = count($result);
echo $pages_vues;
?>
A quel moment ta fonction compter_visite() est appelee? Parce que c'est la qu'il y'a le code pour ajouter de nouvelles adresses.
Enleve la fonction et tu gardes le code ou alors appelles la fonction avant la ligne 46 du code ci-dessus. C'est normal que le compteur reste a 0 puisqu'il y'a rien dans la table en fait.
Edit:
C'est quoi l'objectif de ta fonction compter_visite(), parcequ'elle ne compte rien.
Pour ajouter un nouvel ip a la base de donnees faudrait verifier si cet ip n'est pas deja present dans cette base, si oui faudra faire un update des pages vues(++).
Et ton echo $page_vues a la ligne 43 te signalera une erreur quand tu vas appeler ta fonction puisque $page_vues n'a pas ete initialisee dans cette fonction.
A quel moment ta fonction compter_visite() est appelee? Parce que c'est la qu'il y'a le code pour ajouter de nouvelles adresses.
Enleve la fonction et tu gardes le code ou alors appelles la fonction avant la ligne 46 du code ci-dessus. C'est normal que le compteur reste a 0 puisqu'il y'a rien dans la table en fait.
Edit:
C'est quoi l'objectif de ta fonction compter_visite(), parcequ'elle ne compte rien.
Pour ajouter un nouvel ip a la base de donnees faudrait verifier si cet ip n'est pas deja present dans cette base, si oui faudra faire un update des pages vues(++).
Et ton echo $page_vues a la ligne 43 te signalera une erreur quand tu vas appeler ta fonction puisque $page_vues n'a pas ete initialisee dans cette fonction.
- Edité par Asmitta il y a 31 minutes
Le code fonctionne et je n'avais pas fait appelle a la fonction pour compter les visites forcement cela ne pouvait pas s'incrementé.
Je t'invite à voir ce que ca donne "site en cours de structuration" lien: assistouest
N'hesite pas à me dire dire tu vois des choses à améliorer.
merci beaucoup pour ton aide je ne serai jamais parvenue à faire cela sans toi ! :-D
N'hesite pas à me dire dire tu vois des choses à améliorer.
Si tu me permets, ligne 13 : la déclaration du jeu de caractères ne doit plus se faire ainsi depuis PHP 5.3.8, j'espère pour toi que tu es bien sur une version plus récente.
Ligne 26 : cette manière de faire n'est vraiment pas conseillée. Il serait bien plus sage de passer $pdo en paramètre de la fonction et de supprimer cette ligne.
Toujours pour cette fonction, il serait aussi plus pratique de la faire retourner le nombre de visites plutôt que d'y afficher le nombre directement, si vraiment. Parce qu'en l'état, $pages_vues n'existe pas avant la ligne 43, donc à chaque appel à cette fonction, je soupçonne qu'il y ait un message d'erreur comme quoi justement cette variable n'est pas définie.
Lignes 46 à 51, c'est beaucoup trop lourd pour ce que cela fait. Utilise une requête qui elle contient count() et affiche le nombre retourné. Là, plus tu auras de visites, plus tu auras des performances lamentables, parce que tu fais compter à PHP plutôt qu'à MySQL/MariaDB. Concrètement, tu adaptes la requête, remplaces fetchAll() par fetchColumn() et supprimes la ligne 50 — $result dans ce cas contient directement ce que contenait $pages_vues.
N'hesite pas à me dire dire tu vois des choses à améliorer.
Si tu me permets, ligne 13 : la déclaration du jeu de caractères ne doit plus se faire ainsi depuis PHP 5.3.8, j'espère pour toi que tu es bien sur une version plus récente.
Ligne 26 : cette manière de faire n'est vraiment pas conseillée. Il serait bien plus sage de passer $pdo en paramètre de la fonction et de supprimer cette ligne.
Toujours pour cette fonction, il serait aussi plus pratique de la faire retourner le nombre de visites plutôt que d'y afficher le nombre directement, si vraiment. Parce qu'en l'état, $pages_vues n'existe pas avant la ligne 43, donc à chaque appel à cette fonction, je soupçonne qu'il y ait un message d'erreur comme quoi justement cette variable n'est pas définie.
Lignes 46 à 51, c'est beaucoup trop lourd pour ce que cela fait. Utilise une requête qui elle contient count() et affiche le nombre retourné. Là, plus tu auras de visites, plus tu auras des performances lamentables, parce que tu fais compter à PHP plutôt qu'à MySQL/MariaDB. Concrètement, tu adaptes la requête, remplaces fetchAll() par fetchColumn() et supprimes la ligne 50 — $result dans ce cas contient directement ce que contenait $pages_vues.
Salut et merci pour ses conseils, alors je suis sur la version 7.4 de php.
Je ne sais pas comment passer $pdo en paramètre de la fonction.
Et j'ai essayer de remplacer fetchAll() par fetchColumn() mais sans succès !
Pour ce qui est du paramètre de la fonction, j'espère que c'est une question de vocabulaire. Pour prendre un exemple, quand tu fais ksort($quelqueChose), tu passes en paramètre $quelqueChose à la fonction ksort().
Tu peux aussi faire en sorte que les fonctions que tu définis dans ton code, comme là à la ligne 23 où tu définis compter_visite(), utilisent des paramètres que tu leur passes quand tu appelles cette fonction. Il faut juste mettre entre les parenthèses $pdo toujours sur la ligne 23.
Si jamais, tu n'as pas besoin de citer le message auquel tu réponds si c'est le précédent, je doute que tu répètes chaque fois ce que ton interlocuteur te dit dans une conversation orale
<?php
// On indique au navigateur qu'on utilise l'encodage UTF-8
header('Content-type: text/html; charset=utf-8');
// Paramètres de connexion à la base
define('DB_HOST' , 'localhost');
define('DB_NAME' , 'assistouest');
define('DB_USER' , 'adrienpiron');
define('DB_PASS' , 'Ap6844100?!');
// Connexion à la base avec PDO
try{
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch(Exception $e) {
echo "Impossible de se connecter à la base de données '".DB_NAME."' sur ".DB_HOST." avec le compte utilisateur '".DB_USER."'";
echo "<br/>Erreur PDO : <i>".$e->getMessage()."</i>";
die();
}
?>
<?php
// Fonction qui permet de mettre à jour le compteur de visites
function compter_visite(){
// On va utiliser l'objet $pdo pour se connecter, il est créé en dehors de la fonction
// donc on doit indiquer global $pdo; au début de la fonction
global $pdo;
// On prépare les données à insérer
$ip = $_SERVER['REMOTE_ADDR']; // L'adresse IP du visiteur
$date = date('Ymd H: i: s'); // La date d'aujourd'hui, sous la forme AAAA-MM-JJ
// Mise à jour de la base de données
// 1. On initialise la requête préparée
$query = $pdo->prepare("
INSERT INTO stats_visites (ip , date_visite , pages_vues) VALUES (:ip , :date , 1)
ON DUPLICATE KEY UPDATE pages_vues = pages_vues + 1
");
// 2. On execute la requête préparée avec nos paramètres
$query->execute(array(
':ip' => $ip,
':date' => $date
));
}
// Comptabilisation de la visite
compter_visite();
$query = $pdo->prepare("SELECT * FROM stats_visites");
$query->execute();
$result = $query->fetchAll();
$pages_vues = count($result);
echo $pages_vues;
?>
Avec des erreurs signalées comme suit :
Notice: Constant DB_NAME already defined in C:\wamp64\www\compteur.php on line 8
Notice: Constant DB_USER already defined in C:\wamp64\www\compteur.php on line 9
Notice: Constant DB_PASS already defined in C:\wamp64\www\compteur.php on line 10
Warning: PDOStatement::execute(): SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '20220519 18: 48: 57' for column 'date_visite' at row 1 in C:\wamp64\www\compteur.php on line 43
Les trois premières pourraient bien venir de ce que tu inclus le code ci-dessus depuis un autre qui définit lui aussi les constantes mentionnées.
Le dernier message vient du fait que le format de date n'est effectivement pas le bon. Il ne faut pas d'espaces après les deux-points :, par contre il en faut un entre les année, mois, jour et heure.
Si la base de données est au même fuseau horaire que PHP, alors on peut remplacer le marqueur pour la date par now() dans la requête et supprimer la valeur lors de l'exécution, comme le mentionnait @monkey3d
A ce que j'avais relevé précédemment, j'ajoute que les lignes 2 et 3 ne sont plus du tout nécessaires dans du code d'aujourd'hui.
La manière de gérer l'erreur de connexion reviendrait exactement au même si on enlevait les lignes 14 et 17 à 23.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
yasakani no magatama