Accès à une page 1 fois par jour par ip
- Accueil
- Forum
- Programmation
- PHP
- Accès à une page 1 fois par jour par ip
Codeur61 Le 13 avril 2017 à 22:20 (Édité le 25 janvier 2019 à 17:53)
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 Le 13 avril 2017 à 22:51 (Édité le 1 janvier 1970 à 01:00)
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 Le 13 avril 2017 à 23:09 (Édité le 1 janvier 1970 à 01:00)
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 Le 13 avril 2017 à 23:13 (Édité le 1 janvier 1970 à 01:00)
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 Le 14 avril 2017 à 00:23 (Édité le 14 avril 2017 à 00:24)
<?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 Le 14 avril 2017 à 00:59 (Édité le 1 janvier 1970 à 01:00)
Codeur61 Le 14 avril 2017 à 01:05 (Édité le 1 janvier 1970 à 01:00)
Merci
Zbuu Le 14 avril 2017 à 02:22 (Édité le 1 janvier 1970 à 01:00)
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 Le 14 avril 2017 à 10:47 (Édité le 1 janvier 1970 à 01:00)
Comme ceci ? : http://hpics.li/60d155f
Merci pour vos réponses ! 😉
coucougael94 Le 14 avril 2017 à 15:34 (Édité le 14 avril 2017 à 15:37)
J’espère ne pas être hors sujet par rapport au titre, mais ça me semble une bonne alternative 😀
Zbuu Le 14 avril 2017 à 16:37 (Édité le 1 janvier 1970 à 01:00)
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)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 😉.
J’espère ne pas être hors sujet par rapport au titre, mais ça me semble une bonne alternative
Balatharas Le 14 avril 2017 à 18:06 (Édité le 14 avril 2017 à 18:08)
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 Le 14 avril 2017 à 19:28 (Édité le 1 janvier 1970 à 01:00)
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 Le 14 avril 2017 à 20:05 (Édité le 1 janvier 1970 à 01:00)
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 Le 14 avril 2017 à 20:06 (Édité le 1 janvier 1970 à 01:00)
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 Le 14 avril 2017 à 20:39 (Édité le 1 janvier 1970 à 01:00)
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 lolJe compatis. ... xD
Est ce que tu récupère bien les informations de l'utilisateurs via la base de donnée avant la condition ?Pas la peine, le code est bon c'est juste que la colonne last_visit est vide donc ma condition:
Tu peux nous montré le code de ta page ce sera plus facile pour t'aider
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 Le 14 avril 2017 à 20:53 (Édité le 1 janvier 1970 à 01:00)
Codeur61 Le 14 avril 2017 à 21:18 (Édité le 14 avril 2017 à 21:22)
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 Le 14 avril 2017 à 21:34 (Édité le 1 janvier 1970 à 01:00)
Codeur61 Le 14 avril 2017 à 21:37 (Édité le 1 janvier 1970 à 01:00)
A la fin de pagerecepetion.php ?
Un truc comme ça ?
<?
}
?>
Balatharas Le 14 avril 2017 à 21:41 (Édité le 1 janvier 1970 à 01:00)
Codeur61 Le 14 avril 2017 à 22:10 (Édité le 1 janvier 1970 à 01:00)
Mais on est bien d'accord qu'il faut enlevé sa
if(is_null($user['last_visit'])) {
$_SESSION['alert'] = "Erreur";
header('Location: ./');}
?? Balatharas Le 14 avril 2017 à 22:52 (Édité le 1 janvier 1970 à 01:00)
Au lieu de dore ça marche pas doit bien y avoir une erreur ?
Codeur61 Le 14 avril 2017 à 23:51 (Édité le 1 janvier 1970 à 01:00)
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 ?