IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Cookies] Savoir si une personne a déja cliqué sur tel lien


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 9
    Points
    9
    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.

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    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?

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    (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.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    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?

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 39
    Points : 19
    Points
    19
    Par défaut
    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.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    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

Discussions similaires

  1. Afficher une div en ayant cliqué sur un lien externe
    Par kabool dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/03/2009, 12h13
  2. [JQuery] Du texte dans une div lors du clique sur un lien
    Par Nimothenicefish dans le forum jQuery
    Réponses: 5
    Dernier message: 28/11/2008, 15h33
  3. Réponses: 2
    Dernier message: 22/06/2007, 20h06
  4. Réponses: 2
    Dernier message: 11/05/2007, 10h37
  5. [Forum] Envoyer une variable quand on clique sur un lien
    Par Eisy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 34
    Dernier message: 17/03/2006, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo