Accès à une page 1 fois par jour par ip

Codeur61

Codeur61 Le 13 avril 2017 à 22:20 (Édité le 25 janvier 2019 à 17:53)

Salut, je souhaiterais limiter l'accès à une page à 1 fois par  jour par ip mais ne sais pas comment faire...
J'ai déjà l'ip de mes inscrits depuis une variable de serveur je crois ... si je ne me trompe.
Je le stock dans ma bdd de l'espace membre de PrimFx et je souhaiterais l'utiliser pour cela ! 
Problème, je ne sais pas comment faire le code pour limiter l'accès à ma page à 1 fois par jour par Ip.
Merci d'avance pour vos réponses. 
Zbuu

Zbuu Le 13 avril 2017 à 22:51

Salut 

Hum par IP c'est pas vraiment la meilleure chose à faire étant donnée que n'importe quel utilisateurs peut changé son adresse IP via des VPN.  Je rajouterais même que certains utilisateurs ont une adresse ip dynamique alors c'est pas tip top.

Par contre puisque tu dis que tes membres sont inscrit alors suffit de faire ça directement via le "compte de l'utilisateur" 

Quand ton utilisateur arrive sur cette page tu mets à jour un champ avec par exemple la date (a laquelle il accède à cette page) après pour lui interdire l’accès ou non tu fais une condition du style : si la date est égale à celle enregistré alors tu redirige l'utilisateur sinon tu le laisse accéder et tu met le champ à jour. 

Je suis désolé mais les explications c'est vraiment pas mon fort :( 
Codeur61

Codeur61 Le 13 avril 2017 à 23:09

Salut à toi, 

Oui tu as raison ! J'ai pas tout compris, juste une petite partie mais je pense que c'est le principal. 
Je peux te demander de mettre en forme ce que tu dis parce-que le "reste" (dernier paragraphe) j'ai pas tout compris.
Merci 😉
Balatharas

Balatharas Le 13 avril 2017 à 23:13

Non @Zbuu une fois par jour. Donc ce qu'il faudrait plutôt faire c'est ça:
tu fais une condition: si le champ est égal a 1 alors ca signifie que l'user est deja passé avant. Donc on redirige ou autre. Mais si le champ est egal a 0 alors on fait un UPDATE pour le mettre a 1. Sauf qu'il faut que ce soit une fois par jour et pas une fois en tout. Du coup finalement le truc de Zbuu est utile.
Si date de passage est pas egale a date d'aujourd'hui mais que champ egal a 1 alors on change les deux champs, on met le champ a 0 et date de passage a aujourd'hui.
Cette condition (en rouge) tu peux la mettre dans un fichier qui est include dans tout ton site (ton fichier de connexion a la bdd par ex)
Désolé si je me suis emmêlé les pinceaux, je suis sur mobile, je me relirais demain et je corrigerais si besoin.
;)
Codeur61

Codeur61 Le 14 avril 2017 à 00:23 (Édité le 14 avril 2017 à 00:24)

Salut, Je dois stocké tous les cliques dans une bdd si j'ai bien compris ? Comment je peux organiser cela dans ma bdd ? et le code je avoir mon idée du type ... 
<?php
session_start();
$bdd = new PDO('mysql:host=localhost;dbname=espace_membre' , 'root', '');

$clic = 0;

echo 'Vous avez fait .$clic. vous pouvez encore cliquer une fois !';
if($clic > 1)
{
echo 'vous avez effectué un nombre de clic superieur 
ou égale à 1 vous ne pouvez pas re cliquer aujourd\'hui, attendez demain !'
}
Mais je ne sais pas comment faire ma bdd du coup sa coince aussi pour la req ! 
Merci pour vos réponses, j'aimerais être un peu plus éclairé sur le code et la bdd.
Balatharas

Balatharas Le 14 avril 2017 à 00:59

Pour ta req c'est simple tu recherche dans ta bdd/table:membres les données de l'user puis tu regarde si $user['clic'] est = a 1
Codeur61

Codeur61 Le 14 avril 2017 à 01:05

Vraiment désolé de te dire que je ne comprend rien à ton explication. On peut dire que je suis novice dans les requêtes et que j'y comprend pas grand choses malgré mon engouement.
Merci
Zbuu

Zbuu Le 14 avril 2017 à 02:22

@Beignet Dans mon explication, je pensais à créer un champ dans la base de donnée par exemple  last_visit de type date (NULL par défaut) dans la table users et faire cette condition : 
if (!is_null($user['last_visit']) && $user['last_visit'] == date('Y-m-d')) {
   // L'utilisateur est déjà allé sur cette page aujourd'hui alors on le redirige
} else {
   // Sinon l'utilisateur vient pour la première fois sur cette page aujourd'hui  
   // on fait une requête pour update last_visit à NOW()
   // on continue le reste du code
}
C'est bien ce qu'il souhaite faire non ? 
Fishing61

Fishing61 Le 14 avril 2017 à 10:47

Merci pour le bout de code @Zbuu  (je crois que le mien est faux !). Juste 2 petites questions ? J'intègre cela dans ma page de destination ? Et pour ma bdd faut que mette une nouvelle colonne dans ma table membres ?
Comme ceci ? : http://hpics.li/60d155f
Merci pour vos réponses ! 😉
coucougael94

coucougael94 Le 14 avril 2017 à 15:34 (Édité le 14 avril 2017 à 15:37)

Je te conseil d'utiliser les cookies, même si c'est simple de supprimer pour qq1 qui s'y connaît, des journaux en ligne continue d'utiliser ce système, preuve d’efficacité 😉. (je ne sait plus de quel journaux je parle)
J’espère ne pas être hors sujet par rapport au titre, mais ça me semble une bonne alternative 😀
Zbuu

Zbuu Le 14 avril 2017 à 16:37

Si tu veux suivre mon exemple oui tu dois créer un champs dans ta base de donnée.

Tu peux l'intégré dans la page dans laquelle tu souhaites que l'utilisateur puisse y accéder 1 fois par jour. Après ça dépends de ton architecture mais tu peux faire une appel a une fonction, inclure un fichier qui fait la vérification. 

(je ne sait plus de quel journaux je parle) 
J’espère ne pas être hors sujet par rapport au titre, mais ça me semble une bonne alternative 
Non tu n'est pas hors sujet, sa reste une manière de faire 😉 Par chez moi, y a un site qui utilise les cookies pour nous laissé 3 articles par mois sans compte. Mais en supprimant ou en bloquant le cookie on peut y avoir un accès sans limitation et sans compte 😉. 
Balatharas

Balatharas Le 14 avril 2017 à 18:06 (Édité le 14 avril 2017 à 18:08)

Ah ouais d'accord, j'avais pas bien pigé ton exemple. C'est sur que là c'est mieux.
Pour poursuivre voici une "syntaxe":
if(isset($_SESSION['id']) AND !is_null($user['last_visit']) && $user['last_visit'] == date('Y-m-d')) {
   $_SESSION['alert'] = "Vous avez déjà visité cette page aujourd'hui. Revenez demain !";
   header('Location: ./');
} else {
   date_default_timezone_set('Europe/Paris'); // Ici on définie le fuseau horaire pour la date
   setlocale(LC_TIME, 'fr');
   $update = $bdd->prepare('UPDATE membres SET last_visit = ? WHERE id = ?');
   $update->execute([ date('Y-m-d'), $_SESSION['id'] ]);
   echo "Vous venez d'utiliser votre accès d'aujourd'hui. Vous ne pourrez pas revenir ici une fois la page quittée.";
}
if(is_null($user['last_visit'])) {
   $_SESSION['alert'] = "Erreur";
   header('Location: ./');
}
Ensuite dans ta page ou tu clique sur le lien pour accéder à la page limitée à une fois par jour:
<a href="...ton_lien...">Accéder à la page limitée</a>
<?php if(isset($_SESSION['alert'])) { ?>
   <div class="alert">
      <font color="red"><?= $_SESSION['alert'] ?></font>
   </div>
<?php unset($_SESSION['alert']);
} ?>
Normalement ce code devrait parfaitement fonctionner si tu as correctement créé ton champ last_visit 😉
Codeur61

Codeur61 Le 14 avril 2017 à 19:28

Salut @Beignet,

Tout d'abord merci pour ton code mais je rencontre une erreur dans ma page lorsque j'ajoute ton code. 

En faite même quand je me connecte pour la première fois sur la page (je précise que je suis connecté à l'espace membre).
Ça me redirige vers la page d'accueil de mon site alors que c'est la première fois que je visite la page web de la journée. 

La date de la visite est quand même ajoutée dans ma bdd sur pma mais sa me redirge vers le Home de mon site. Je comprend pas. 
Je pense que côté BDD tout est bon... 
Merci de m'éclairer sur le sujet. 
Balatharas

Balatharas Le 14 avril 2017 à 20:05

Oui tout est bon, enfait il faut que à l'inscription tu rajoutes une donnée: last_visit.
Comme variable ajoute ceci:
$last_visit = date('d-m-Y',strtotime("-1 day"));
Ca va donner la date d'aujourd'hui, moins un jour donc la date d'hier. Comme ça, quand l'utilisateur s'inscrit, last_visit ne sera pas vide, mais l'utilisateur pourra quand même accéder à la page.
Si tu t'en fiche que les utilisateurs aient un champ vide enlève cette partie:
if(is_null($user['last_visit'])) {
   $_SESSION['alert'] = "Erreur";
   header('Location: ./');
}
;)
Zbuu

Zbuu Le 14 avril 2017 à 20:06

En faite même quand je me connecte pour la première fois sur la page (je précise que je suis connecté à l'espace membre). 
Est ce que tu récupère bien les informations de l'utilisateurs via la base de donnée avant la condition ?

Tu peux nous montré le code de ta page ce sera plus facile pour t'aider 

Ah ouais d'accord, j'avais pas bien pigé ton exemple. C'est sur que là c'est mieux. 
Je l'avais dit, les explications ce n'est pas du tout mon truc 😄. Dans ma tête c'est assez clair mais au niveau de l'écrit c'est un gros bordel. C'est dans ces moment la qu'on regrette ne pas avoir été beaucoup à l'école lol 
Balatharas

Balatharas Le 14 avril 2017 à 20:39

Je l'avais dit, les explications ce n'est pas du tout mon truc . Dans ma tête c'est assez clair mais au niveau de l'écrit c'est un gros bordel. C'est dans ces moment la qu'on regrette ne pas avoir été beaucoup à l'école lol 
Je compatis. ... xD
Est ce que tu récupère bien les informations de l'utilisateurs via la base de donnée avant la condition ? 

Tu peux nous montré le code de ta page ce sera plus facile pour t'aider  
Pas la peine, le code est bon c'est juste que la colonne last_visit est vide donc ma condition:
if(is_null($user['last_visit'])) {
   $_SESSION['alert'] = "Erreur";
   header('Location: ./');
}
Le renvoie à son accueil ^^
S'il supprime cette condition tout sera comme il le demande depuis le début (normalement 😋)
Zbuu

Zbuu Le 14 avril 2017 à 20:53

Ah oui effectivement, je n'ai pas regarder la totalité du code 😄 
Codeur61

Codeur61 Le 14 avril 2017 à 21:18 (Édité le 14 avril 2017 à 21:22)

Merci ! Mais ....
Sa ne marche pas. J'ai pourtant inséré le 
$last_visit = date('d-m-Y',strtotime("-1 day"));
dans mon code d'inscription et enlevé sa de pagerecepetion.php ; 
if(is_null($user['last_visit'])) {
   $_SESSION['alert'] = "Erreur";
   header('Location: ./');}
Mais ça ne marche pas. Je peux accéder quand je veux à la page en question.
Je vous mets toutes les pages utilisées ci-dessous.

inscription.php 
<?php
$bdd = new PDO('mysql:host=xxxxx;dbname=xxxxx' , 'xxxxx', 'xxxxxx');
if (isset($_GET ['p']) AND !empty($_GET['p'])){
   $parrain_uniqid = htmlspecialchars($_GET['p']);
   $req_parrain = $bdd->prepare('SELECT id FROM membres WHERE uniqid = ?');
   $req_parrain->execute(array($parrain_uniqid));
   $parrain_exist = $req_parrain->rowCount();
   if($parrain_exist ==1){
      $id_parrain = $req_parrain->fetch();
      $id_parrain = $id_parrain['id'];
      echo $id_parrain;
   }
}
if (isset($_POST['forminscription']))
{
   $pseudo = htmlspecialchars($_POST['pseudo']);
   $mail = htmlspecialchars($_POST['mail']);
   $mail2 = htmlspecialchars($_POST['mail2']);
   $mdp = sha1($_POST['mdp']);
   $mdp2 = sha1($_POST['mdp2']);
   $ip = $_SERVER['REMOTE_ADDR'];
   $last_visit = date('d-m-Y',strtotime("-1 day"));
   if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mail2']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
   {
      
      $pseudolength = strlen($pseudo);
      if ($pseudolength <= 255)
      {
            if($mail == $mail2)
            {
               if(filter_var($mail, FILTER_VALIDATE_EMAIL))
               {   
                  $reqmail = $bdd->prepare("SELECT * FROM membres WHERE mail = ?");
                  $reqmail->execute(array($mail));
                  $mailexist = $reqmail->rowCount();
                  if($mailexist == 0)
                  {   
                     if ($mdp == $mdp2)
                     {
                        $insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse, uniqid, id_parrain, ip_user) VALUES(?, ?, ?, ?, ?, ?)");
                        if(isset($id_parrain) AND !empty($id_parrain)){
                           $insertmbr->execute(array($pseudo, $mail, $mdp, uniqid(), $id_parrain, $ip ));
                        } else {
                           $insertmbr->execute(array($pseudo, $mail, $mdp, uniqid(), 0, $ip ));
                        }
                        $erreur = "Votre compte a été créé avec succés ! <a href=\"connexion.php\">Me connecter</a>";
                     }   
                     else
                     {
                     $erreur ="<u><I>Vos mots de passes ne correspondent pas !</u></I>";
                     }
                  }   
                  else
                  {
                     $erreur = "<u><I>Adresse mail deja utilisé</u></I>";   
                  }
               }      
               else
               {
                  $erreur = "<u><I>Votre adresse mail n'est pas valide !</u></I>";
               }
            }   
            else
            {
               $erreur = "<u><I>Vos adresses mail ne correspondent pas !</u></I>";
            }   
      }
      else   
      {
         $erreur = "<u><I>pseudo déjà utilisé</u></I>";
      }   
   }
    else
   {   
      $erreur = "<I><u>Tous les champs doivent étre complétés !</u></I>";
   }
}   
?>
<?php
 session_start();
?>
<html>
   <head>
      <title>Inscription - GiveCashPTC</title>
      <link rel="stylesheet" type="text/css" href="style2.css" />
      <link rel="stylesheet" href="style3.css"/>
   </head>
   <body>
      <div id="site">
         <div id="banner1">
            <p>GiveCashPTC</p>
         </div>
         <div id="menu">
            <ul>
               <li><a href="index.php">Accueil</a></li>
               <?php
 //Si le membre est connecté on affiche le menu-connection  
 if(isset($_SESSION['id'])){ ?>    
<li><a href="<?php echo 'http://givecashptc.com/profil.php?id='.$_SESSION["id"]; ?>">  
   Mon profil</a></li>
 <li><a href="http://givecashptc.com/deconnexion.php">  
   Deconnexion</a></li>  <?php }   
   //Si le membre n'est pas connecté on affiche le menu-deconnecter   
if(empty($_SESSION['id'])) { ?> 
<li id="log"><a href="http://givecashptc.com/connexion.php">  
   Connexion</a></li> <li>
<li id="log"><a href="http://givecashptc.com/inscription.php">  
   Inscription</a></li> <li>   <?php } ?>
            <li><a href="fonctionnement.php">+ Sur le site</a></li>
            <li><a href="contact.php">Contact</a></li>
            </ul>
         </div>
         <div id="banner2">
         </div>
         <div id="contenuprincipal" align="center">
         <br /><br /><br /><br /><p>ATTENTION NE PAS INCLURE DANS SON PSEUDONYME LE MOT "ADMIN" OU "ADMINISTRATEUR" sous peine de banissement !</p><br /><br /><br /><br /><br /><div align="center">
         <form method="POST" action="">
            <table>
            <tr>
                <td>
                  <label for="pseudo"><I>Pseudo :</I></label>
               </td>
               <td>
                  <input type="text" class="css-input" placeholder="votre pseudo" id="pseudo" name="pseudo" value="<?php if (isset($pseudo)) { echo $pseudo; }?>" />
               </td>
            </tr>
            <tr>
                <td>
                  <label for="mail"><I>Mail (PayPal pour les paiements) :</I></label>
               </td>
               <td>
                  <input type="email" class="css-input" placeholder="votre mail Paypal" id="mail" name="mail" value="<?php if (isset($mail)) { echo $mail; }?>" />
               </td>
            </tr>
            <tr>
               <td>
                  <label for="mail2"><I>Confirmation du mail (idem) :</I></label>
               </td>
               <td>
                  <input type="email" class="css-input" placeholder="Confirmez votre Paypal" id="mail2" name="mail2" value="<?php if (isset($mail)) { echo $mail2; }?>" />
               </td>
            </tr>
            <tr>
                <td>
                  <label for="mdp"><I>Mot de passe :</I></label>
               </td>
               <td>
                  <input type="password" class="css-input" placeholder="votre mot de passe" id="mdp" name="mdp" />
               </td>
            </tr>
            <tr>
                <td>
                  <label for="mdp2"><I>Confirmation du mot de passe :</I></label>
               </td>
               <td>
                  <input type="password" placeholder="Confirmez votre mdp" class="css-input" id="mdp2" name="mdp2" />
               </td>
            </tr>
            <tr>
               <td></td>
               <td>
                  <br />
                  <input type="submit" class="myButton" name="forminscription" value="S'inscrire" />
               </td>
            </tr>
         </table><br><br>
      </form><font color="red" size="4">En cliquant sur "S'inscrire" vous affirmez avoir lue et acceptée TOUTES les conditions générales d'utilisation</font><br><br>
      <?php
      if(isset($erreur)) 
      {
         echo '<font color="red">'.$erreur."</font>";
      }   
      ?>   
         </div> 
ma pageenvoie.php

<?
session_start();
$bdd = new PDO('mysql:host=xxxx;dbname=xxxx' , 'xxxxx', 'xxxxxx');
?>
<a href="http://givecashptc.com/pagerecepetion.php">Accéder à la page limitée</a>
<?php if(isset($_SESSION['alert'])) { ?>
   <div class="alert">
      <font color="red"><?= $_SESSION['alert'] ?></font>
   </div>
<?php unset($_SESSION['alert']);
} ?>
Et ma pagerecepetion.php (oui j'ai fait une erreur d'écriture lors de la save :P)
<?php
session_start();
$bdd = new PDO('mysql:host=xxxx;dbname=xxxx' , 'xxxx', 'xxxxxx');
if(isset($_SESSION['id']) AND !is_null($user['last_visit']) && $user['last_visit'] == date('Y-m-d')) {
   $_SESSION['alert'] = "Vous avez déjà visité cette page aujourd'hui. Revenez demain !";
   header('Location: ./');
} else {
   date_default_timezone_set('Europe/Paris'); // Ici on définie le fuseau horaire pour la date
   setlocale(LC_TIME, 'fr');
   $update = $bdd->prepare('UPDATE membres SET last_visit = ? WHERE id = ?');
   $update->execute([ date('Y-m-d'), $_SESSION['id'] ]);
   echo "Vous venez d'utiliser votre accès d'aujourd'hui. Vous ne pourrez pas revenir ici une fois la page quittée.";
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Pub ip</title>
</head>
<body>
<font size="5"><p>Vous êtes arrivés sur la page des publicités. Vous ne pouvez la visiter qu'une seule fois par jour. </p></font>
</body>
</html>
Et enfin la structure de ma table " membres " complète ainsi que la structure de ma colonne " last_visit " contenue dans ma table " membres ".

table membres entière.

Lien : http://hpics.li/bd4ab59

colonne " last_visit" contenue dans " membres ". 
Lien : http://hpics.li/ea13eea

Merci pour vos réponses !
Balatharas

Balatharas Le 14 avril 2017 à 21:34

Ferme l'accolade du else a la fin de ton fichier
Codeur61

Codeur61 Le 14 avril 2017 à 21:37

Comme ça ? :
A la fin de pagerecepetion.php ? 
Un truc comme ça ? 
<?
}
?>
Balatharas

Balatharas Le 14 avril 2017 à 21:41

Ouais en gros déplace l'accolade de la ligne 19 vers la fin du fichier
Codeur61

Codeur61 Le 14 avril 2017 à 22:10

Rien à faire ça ne marche pas. 
Mais on est bien d'accord qu'il faut enlevé sa 
if(is_null($user['last_visit'])) {
   $_SESSION['alert'] = "Erreur";
   header('Location: ./');}
??
Balatharas

Balatharas Le 14 avril 2017 à 22:52

Si ton champ last_visit contient une date, alors cette condition, écrite ou non ne changera rien.
Au lieu de dore ça marche pas doit bien y avoir une erreur ?
Codeur61

Codeur61 Le 14 avril 2017 à 23:51

Y'a aucune erreur signalé par wamp il comptabilise la date et la mets sur pma mais je peux toujours visiter la page même après une visite.
Zbuu

Zbuu Le 15 avril 2017 à 01:47 (Édité le 15 avril 2017 à 01:50)

Est ce que tu récupère bien les informations de l'utilisateurs via la base de donnée avant la condition ?
J'avais anticipé dans un de mes précédent post avant de voir ton code ;)

Dans la condition tu demandes à ce que $user['last_visit'] corresponde à la date du jour ok mais si tu ne récupère pas les informations dans la base de donnée avant c'est normal que ça fonctionne pas ;D

Essaye comme ça :
$q = $bdd->prepare("SELECT * FROM users WHERE id = ?");
$q->execute([$_SESSION['id']]);
$user = $q->fetch();
$q->closeCursor();
date_default_timezone_set('Europe/Paris');
setlocale(LC_TIME, 'fr');
if (isset($_SESSION['id']) && !is_null($user['last_visit']) && $user['last_visit'] == date('Y-m-d')) {
   $_SESSION['alert'] = "Vous avez déjà visité cette page aujourd'hui. Revenez demain !";
   header('Location: ./');
} else {
   $q = $bdd->prepare("UPDATE membres SET last_visit = ? WHERE id = ?");
   $q->execute([date('Y-m-d'), $_SESSION['id']]);
   echo "Vous venez d'utiliser votre accès d'aujourd'hui. Vous ne pourrez pas revenir ici une fois la page quittée.";
}
Attention il y a peut être des erreurs, je suis sur mon téléphone et j'ai du tout tapé car impossible de faire un copier coller 😭

D'ailleurs, c'est mon téléphone qui bug ou une erreur de ta part tes 4 premier code ne contiennent qu'une seul ligne ?