Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/12/2006, 19h08   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 17
Points : 1
Points : 1
Par défaut [Cookies] Savoir si une personne a déja cliqué sur tel lien

Bonjour tout le monde,

j'ai commencé réaliser une toplist en php/sql et je me vois à présent dans l'obligation d'utiliser des sessions pour tenter de sécuriser un peu le compte des In / Out des liens. Cependant le hic c'est que je n'y connaissais strictement rien en session, j'ai donc passé énormément de temps à collecter des informations concernant les sessions mais rien n'a résolu mon probleme.

Je voudrais savoir comment faire en sorte que lorsqu'un visiteur arrive sur ma toplist il ne puisse pas cliquer 20 fois de suite sur un lien pour faire monter le compteur des "In" pour faire grimper ce site dans le classement (A chaque click, le champ sql correspondant au in du site est incrémenté). Il faudrait donc qu'au premier click le champ sql soit mis a jour, mais qu'aux prochains aucune mis a jour ne se fasse.
J'ai vu qu'il fallait au début initialisé une session grâce à session_start(); ce qui aura pour effet de créer le cookie PHPsessid mais après je n'ai aucune idée de la marche à suivre, s'il faut ou non utliser sql, ou encore s'il faut interagir avec l'ip du visiteur etc

Si vous pouviez m'éclairer un peu, je vous serais reconnaissant
Merci d'avance.
zoubab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 20h22   #2
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 39
Points : 11
Points : 11
Tu ne peux pas utiliser des Session pour ce que tu veux faire.
En effet, si l'utilisateur quitte et réouvre son navigateur, son identifiant de session sera différent, et il crééra donc une nouvelle session, donc pourra faire monter le site une seconde fois.

Il faut donc que tu récupères l'ip de ton visiteur et que tu la stocke dans une base de donnée, avec le lien sur lequel il a cliqué.

Astuce pour récuperer l'IP même si il y a un proxy :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function get_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'];
    }
    return $ip; 
}
?>
Pour executer des requetes de BDD MySQL, c'est :
Code :
1
2
3
4
5
6
<?php
mysql_connect($host,$user,$pass);
mysql_select_db($database);
mysql_query($query);
mysql_close();
?>
$host, $user, $pass et $database sont les information de connexion à la base de donnée mysql, donnée par l'hebergeur.
$query est la requete mysql que vous souhaitez executer.
jt-tronix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 20h25   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 17
Points : 1
Points : 1
Mais la session est dans un cookie non? Si je met par exemple un temps de d'expiration d'une journée, je reconnaitrais le visiteur pendant une journée grace au cookie?
zoubab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 20h30   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 39
Points : 11
Points : 11
(j'ai édité mon message plus haut avec plus de détails)

Sinon, non, puisque les sessions sont des cookies, mais enregistrer sur le serveur web, alors que les cookies sont stocké sur l'ordinateur du client et dépendent de chaque navigateur.

On peut donc facilement supprimer les cookies de notre PC au travers des options du navigateur.

Quant aux sessions, comme je le disais plus haut, à chaque fois qu'on ferme et qu'on ré ouvre notre navigateur, l'identifiant de session change, et donc le serveur nous reconnaît comme deux personnes distinctes.
jt-tronix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 20h43   #5
Invité de passage
 
Inscription : décembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 17
Points : 1
Points : 1
Merci pour ces éclaircissements
Concernant la récupération du lien sur lequel le visiteur a cliqué, j'ai du mal à cerner comment je peux faire. Je partirais sur l'idée de rajouter un évènement dans la balise <a> sur le click avec ta fonction get_ip() ainsi que l'insertion dans la base sql de l'id du site cliqué avec l'ip, mais dans ce cas la, je dois passer par du javascript si je me souviens bien?
zoubab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 21h01   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 39
Points : 11
Points : 11
Non, pas tout à fait, il vaut mieux utiliser une autre manière, car on ne peut mélanger le javascript avec le php. Le javascript s'exécute sur le navigateur du client et n'est pas activé chez tout le monde, alors que le php s'exécute lorsque le serveur génère la page. Le javascript est donc exécuter sur la page en cour, déjà générée par le serveur, mais ne peut basiquement communiquer avec le serveur.

Pour résoudre ton problème, il ne faut pas utiliser des liens direct vers le site, mais des liens vers une page de ton site avec en paramètre l'id du site sur lequel tu veux pointer. Cette page de ton site va récupérer dans ta base de donnée l'adresse du site correspondant à cet ID, et va incrémenter son nombre de hit de 1, si et seulement si cette utilisateur(enfin son IP) n'a pas déjà fait incrémenter ce site au cour des dernière 24heures. Et finalement une fois ces opérations effectuée, redirigera le visiteur vers le site visé.

Donc dans ta base de donnée tu auras 2 tables comportant ces structures :
La première :
id (auto_incrément), nom du site, description, nb_hit
La deuxième :
id (auto_incrément), id_site, ip, last_vote

La page vers laquelle est dirigé le visiteur en cliquant sur le lien, il clique sur <a href="go.php?id=430">

La page go.php :
$ip=get_ip(); //l'ip du demandeur
$id_site=$_GET['id']; //on récupère l'id du site cliqué, ici : 430

maintenant, on cherche dans la base de donnée, dans la seconde table, lorsque `id_site`='$id_site' et que `ip`='$ip' et que `last_vote`>time()-24*60*60, si la base de donnée ne retourne rien, le visiteur n'a pas cliqué pour ce site, on peut donc faire deux requêtes mysql, la première pour augmenter de 1 le nombre de hit de la première table, et la deuxième, on insert dans la seconde table, une nouvelle ligne contenant l'ip du visiteur, l'id du site (430) et le timestamp du moment où il click. Tant qu'a faire, on supprime de la table 2, grâce à une troisième requête, les ligne datant de plus de 24heures.
jt-tronix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 21h48   #7
Invité de passage
 
Inscription : décembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 17
Points : 1
Points : 1
Merci énormément pour ta réponse, j'ai à présent tout compris !
Tu viens de me donner une bonne lecon de logique car je n'étais vraiment pas partie du même coté que toi et pourtant quand je vois ton raisonnement, tout me parait clair :p
Mon seul et dernier probleme cependant reste purement programmation car je ne sais pas comment interpreter le non renvoie d'information de la requete sql.

Code :
1
2
3
4
5
6
 
	$site = $db->sql_fetchrow($db->sql_query("SELECT site_id, ip, last_visite 
						FROM _visiteur
						WHERE site_id = '$site_id'
						AND ip = '$site[ip]'
						AND last_vote > ".time()-24*60*60));
Si la requête ne me renvoie rien correspond à effectuer une opération de type OR puis les 2 requêtes à exécuter?
C'est ma dernière question je te le promet, et merci encore pour ton aide
zoubab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 22h29   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 39
Points : 11
Points : 11
De rien

Je crois qu'il faut utiliser :
if(empty($site)) //si $site est vide

si ça ne marche pas tu peut utiliser :
if($site['id_site']=='') //c'est celle que j'utilisais avant, je te la donnes, car je sais pas si la première fonctionne lol


A et aussi tu feras gaffe, dans ta requete tu mets $site[ip] au lieu de $ip je crois.
jt-tronix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2006, 19h04   #9
Invité de passage
 
Inscription : décembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 17
Points : 1
Points : 1
Exact c'est bien $ip qu'il faut mettre ^^
Tout marche parfaitement je te remercie énormément pour toute l'aide que tu m'as apporté
Je te souhaite une bonne année en avance aussi tiens
zoubab est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h13.


 
 
 
 
Partenaires

Hébergement Web