8791 sujets

Développement web côté serveur, CMS

Bonjour à tous, tout est dit dans le titre, je dispose d'un petit compteur en php qui fonctionne tout simplement:
Il recupere l'adresse ip de l'utilisateur et la compare dans une bdd si elle ne se trouve pas dans celle ci, elle l'ajoute.
Mon probleme c'est que je n'arrive pas a trouver comment modifier mon script pour que tout les mois ma bdd se remette a zero, j'ai chercher dans mysql mais j'ai pas trouver de "fonction" prevu a cette effet.
Je pense que sa doit pouvoir etre fait avec le timestamp mais j'ai beau chercher je n'arrive a rien ...
Merci d'avance
Bonjour à toutes et à tous,

le principe est assez simple. Pour ce faire, tu dois disposer de ces trois informations :

1) dans la table, le fameux compteur.
2) dans la table, la date contenant l'année et le mois en cours.
3) et en php, la date du jour.

Tu fais le test suivant :

si (la date du jour contient le même mois et la même année que la date dans la table)
alors tu continues d'incrémenter ton compteur
sinon tu remets ton compteur à zéro et dans la date de ta table, tu mets la date du jour.
finsi.

@+
Merci artemus pour ta reponse je vais m'y mettre dessus tt de suite, une fois terminer je repasserai poser le code des fois que sa interesse quelqu'un d'autre.
Voila encore un grand merci a artemus pour m'avoir mis sur la bonne voie. Je vais donner les "details" de l'operation pour les prochains :
J'ai commencer par creer 2 nouvelle colonne, une pour le mois et l'autre pour la date.

La partie insertion qui s'execute lorsque l'utilisateur effectue sa premiere visite:
INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ', ' . date('m') . ', ' . date('Y') . ')')

La partie qui compte les entrées :
SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND mois=' . date('m') . ' AND annee=' . date('Y') . '

En plus cette technique m'evite de supprimer des entrée ce qui permet de toujours avoir les stats des mois et années precedente
Modifié par colegos (06 Aug 2011 - 15:08)
Attention ! Règle n°1 en base de donnée est l'atomicité des données, c'est-à-dire qu'il faut avoir le moins de données possibles.

Or, ici tu enregistres la date, et ... le mois et l'année, sachant que tu as la date.
MySQL offre des fonctions intéressantes sur les dates.

SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND MONTH(created) = MONTH(NOW()) AND YEAR(created) = YEAR(NOW())


Il vaut mieux aussi faire un COUNT() sur ton ID : COUNT(id) plus qu'un COUNT(*).
Si des données peuvent être NULL par défaut, MySQL mettra bien plus de temps.

D'ailleurs, tu peux plutôt définir ton champ qui contient la date en TIMESTAMP et définir sa valeur par défaut comme la date actuelle. (CURR_TIMESTAMP())
Comme ça pour ton Insert, tu as juste à faire un

INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\)


Et ta table n'aura que 3 champs (ID, IP, date).
Modifié par vincentD83 (06 Aug 2011 - 15:31)
Salut vincentd83 et merci pour ta reponse(super interessante d'ailleur) car je ne connaissait pas ces fonctions "NOW" et "created".
Je n'ai pas mis de champ id sur ma table n'ayant pas vu d'interet(sur le moment) et dans le principe d'atomicité des données je ne pourai pas faire un COUNT(ip) a la place ce qui me fait gagner une colonne dans mysql ?
Encore une fois merci a l'avance pour vos reponse !

PS: J'ai deja une colonne timestamp qui me permet d'afficher les personnes qui se sont connecté il y a moins de 5mn (mais je pense pouvoir garder cette fonction et en meme temps m'en servir pour la date)
En fait, created est pour moi le nom du champ qui contient la date Smiley cligne
Un ID sur une table est toujours mieux, l'index permet d'être plus efficace dans les recherches, les requêtes etc ...
Et oui tu peux tout à fait faire un COUNT(ip), c'est juste que, sur MySQL, si des colonnes peuvent être NULL (c'est à dire valeur par défaut à NULL par exemple), le COUNT met plus de temps.
Mais bon ... C'est de l'optimisation non nécessaire.

Mais je maintiens qu'il ne faut qu'une seule colonne pour la date, un Timestamp. Pas besoin du mois et de l'année.
Ensuite, tu as une fonction en MySQL (DATE_DIFF()) qui permet de récupérer les données d'il y a 5 minutes, 15 minutes etc ...

Je t'invite à lire la doc.
vincentD83 a écrit :

Un ID sur une table est toujours mieux, l'index permet d'être plus efficace dans les recherches, les requêtes etc ...


Pas forcément, sur les tables de liaisons c'est même déconseillé pour avoir de bonnes performances.
salut jbgfx et merci de prendre part au sujet mais qu'est qu'une table de liaison ?
vincent : Merci encore une fois de ton aide, je vais creer un champ "id" mais j'aurais cru que sa surchargerai la table plutot que l'optimiser, non ?
Pour ce qui est de la date j'ai bien compris ce que tu voulai me dire : 1 seul champ pour la date !! ^^, et je suis en train de comprendre (grace a toi) comment faire, du coup je vais revoir tout mon code pour l'optimiser.
Merci a vous j'ai reussi a finir mon compteur, j'ai ecouter vincent en ajoutant un champ "id" a ma table et en n'utilisant qu'un champ pour le time(+ un 3eme champ pour l'ip bien sur ^^).
Le voici :

mysql_select_db('bdd');
$sql = mysql_query('SELECT COUNT(id) AS nbr FROM compteur WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$data = mysql_fetch_array($sql);
 
if ($data['nbr'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
	 {mysql_query('INSERT INTO compteur VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');}
else // L'ip se trouve deja dans la table, on met juste a jour le timestamp
	 {mysql_query('UPDATE compteur SET date=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');}
 
$time_5min = time() - 300; // 300 = nbr de secondes ecoulé en 5 minutes
$sql = mysql_query('SELECT COUNT(id) AS nbr FROM compteur WHERE date>\'' . $time_5min . '\'');
$data = mysql_fetch_array($sql);
 //visiteur connecté
if ($data['nbr'] == 1)
{ echo '<strong><nobr>' . $data['nbr'] . '</strong> visiteur connecté</nobr><br />';}
else
{ echo '<strong><nobr>' . $data['nbr'] . '</strong> visiteurs connectés</nobr><br />';}
 //Visiteur aujourd'hui
$today = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$sql = mysql_query('SELECT COUNT(id) AS nbr FROM compteur WHERE date>\'' . $today . '\'');
$data = mysql_fetch_array($sql);
 
if ($data['nbr'] == 1)
{ echo '<strong><nobr>' . $data['nbr'] . '</strong> visite aujourd\'hui</nobr><br />'; }
else
{ echo '<strong><nobr>' . $data['nbr'] . '</strong> visites aujourd\'hui</nobr><br />';}  
//Visiteur Ce mois ci
$mois = mktime(0, 0, 0, date('m'), 0, date('Y'));
$sql = mysql_query('SELECT COUNT(id) AS nbr FROM compteur WHERE date>\'' . $mois . '\'');
$data = mysql_fetch_array($sql);
echo '<strong><nobr>' . $data['nbr'] . '</strong> visites ce mois-ci</nobr>';


Je l'ai tester en local tout fonctionne sauf la variable
$_SERVER['REMOTE_ADDR']
(c'est normal) j'ai donc inserer des ip directement via phpmyadmin mais ya pas de raison pour que sa marche pas sur un vrai serveur.
Merci a tous pour votre aide @+!!
Attention pour l'IP, il vaut mieux que tu utilises une fonction comme ça :


	function getIp()
	{
		if (!empty($_SERVER['HTTP_CLIENT_IP']))
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) )
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		else
			$ip = $_SERVER['REMOTE_ADDR'];

		return $ip;
	}
Jbgfx => Aprés quelque recherche j'ai trouver sur plusieurs site que les variable $_HTTP_CLIENT_IP et HTTP_X_FORWARDED etaient depassées car celle ci peuvent être modifié par le client.
Cordialement
Je t'invite donc à :

1. apprendre à lire
2. apprendre à te documenter plus en profondeur
Modifié par jb_gfx (06 Aug 2011 - 23:47)
Bah je te dis juste ce que j'ai lu sur d'autre forum. Maintenant si tu pense avoir raison donne tes arguments...
edit : J'ai quand même chercher sur le web et plus de la moitié des reponses sont favorable a REMOTE_ADDR et l'autre pour http_client_ip du coup je peut te certifier que je sais lire mais j'ai pas pour autant de reponse...
Re-edit(2h plus tard...) : J'ai trouver sur d'autres forum des personnes expliquant ton script et je l'ai compris mais j'ai aussi trouver d'autre message disant que cela etait futile alros je sai pas quoi penser, remote_adrr sufit-il ?...
Modifié par colegos (07 Aug 2011 - 03:25)