Afficher un contenu ou une page qu'une seul fois par personne

Résolu/Fermé
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 - 2 nov. 2013 à 14:59
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 11 nov. 2013 à 00:14
Bonjour,
J'aimerais que l'une de mes page soit visible qu'une seul fois par visiteur.
Je sais que cela est possible par les cookie ou par les Ip, mais je préféré par les cookie ou voir les deux si c'est possible (je suis pas chiant :p).
J'ai fais plusieurs recherche mais j'ai toujours rien qui fonctionne.

Merci de votre aide.
A voir également:

6 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
2 nov. 2013 à 18:29
Salut, j'opte pour NON pour le cookies (seuls) car n'importe quel pinpin qui a un éditeur de cookies ou qui les nettoie pourra la revoir.

Une conjonction cookie/base d'IP/clés est possible: une page A créé une variable cookie
pageAccessKey=[un hash md5, sha1 ou ce que tu veux]
et le serveur stocke la clé dans une BDD, avec
key=[la clé donné au client]
; et la page B récupères cette clé, la cherche dans la BDD et si elle est présente on la supprime de la BDD puis on affiche la page, sinon bah pas de page.
Ca c'est pour des clés "resetables"; la page A gère si elle nous distribue une clé ou pas (par exemple avec un compte et un délai pour en avoir une).

Pour un filtrage IP, ce que je déconseille fortement de réaliser car y'a les IP dynamiques; c'est le même principe que cité plus haut, avec juste la page B et l'IP au lieu de la clé; qui sera stockée et conservée, si l'IP existe, pas de page.
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
2 nov. 2013 à 19:25
Ton idée m'intéresse beaucoup. Mais le problème c'est que je ne c'est pas comment faire cela :/ Si tu veux bien m'aider en privé :)

Merci de ton aide
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
2 nov. 2013 à 20:03
"Si tu veux bien m'aider en privé :) ": on est sur un forum pour en faire profiter tout le monde, donc on va le faire en public ;)
Peux-tu me donner quelques infos de base sur ce que tu as a disposition? Style version de PHP, si tu as une base de données à disposition, si c'est du mysql, postgresql, ou si tu as accès à PDO.
Aussi, la page en question est-elle consultable de n'importe quel public ou y a-t-il un système de compte ou autre?
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
2 nov. 2013 à 20:18
D'accord :)

La page en question : http://servicesflorian.zz.mu/1/jeu1.php
Le PHP de mon hébergeur est en 5.3 mais je peux le mettre en 5.2 ou en 5.4 si tu préfère et je possède une BDD mysql.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
2 nov. 2013 à 20:21
Et pour l'accès à la page? Public ou avec compte ou autre? Je pose cette question car l'imlémentation ne sera pas la même selon qui peut accéder à la page, avec des comptes c'est très simple, mais pour une page publique c'est plus complexe.
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
2 nov. 2013 à 20:36
Les membres qui iront sur cette page seront seulement des membres d'un forum créer avec forumactif mais je doute que cela sois plus facile donc partons sur le public.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
2 nov. 2013 à 21:18
Surtout que forumactif c'est juste pour créer des forums, tu n'auras pas accès à leur base de données. Donc du public.
Pour distinguer 2 personnes sur internet de manière sûre, il n'y a que l'IP... Bien que je déconseille ce genre de filtrage, ça ne me dérange pas quand c'est bien fait; et la base du "bien fait" dans ce cas est d'avoir un délai au bout duquel une IP donnée pourra reconsulter la page. Et si une autre personne avec une IP dynamique tombe dessus la même qui a été enregistrée, il y a peu de chance que cette "autre personne" ne puisse pas reconsulter la page.
Assez causé, a nous le code. Tu est hébergé sur Hostinger, ça tombe bien ils ont PhpMyAdmin.
Va dans le panneau de controle de ton compte et créé une base de donnée, avec le nom que tu veux (un nom général hein, une BDD peut contenir plusieus tables de données pour des projets différents; pas d'accents ni n'espaces).
Ensuite va dans PhpMyAdmin. Une fois dessus, clique sur le nom de ta base de données à gauche. Après, dans la catégorie "Créer une nouvelle table sur la base [nom de la base]", donne un nom à la table spécifique à ton projet, par exemple "grattage_ip" avec 3 champs. Clic sur "Exécuter".
Tu arriveras sur une page avec des colonnes, chaque colonne ici que tu renseigneras correspondra a une colonne dans la table de données.
Pour le 1er: Champ: "id", Type: "int", case "auto-increment/A-I" cochée
Pour le 2e: Champ: "ip", Type: "text"
Pour le 3e: Champ: "derniere_connexion", Type: "datetime"
Puis "Sauvegarder"
Voilà la base de données est prête.
Etape suivante: le PHP pour s'y connecter et gérer l'accès à la page (que j'écrirais un peu plus tard).
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
2 nov. 2013 à 21:39
Waouh tout extrêmement bien détaillé :0
Écris quand tu as le temps, je suis pas presser et ton aide est déjà un très bon service. Merci :D
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
3 nov. 2013 à 11:05
Me revoilà pour la 2eme partie, la réalisation avec PHP.
Avant de commencer, il s'avérera pratique d'avoir quelques bases en BDD, voir ici par exemple. Une BDD est très comparable à un tableau d'Excel/OpenOffice Calc, la base étant le fichier à ouvrir, les tables étant les feuilles dans ce fichier, et les lignes&colonnes... bah les lignes et les colonnes.

PHP dispose de tout un ensemble de fonctions pour mysql, mais l'utilisation de ces fonctions ainsi que les autres spécifiques à un système de BDD se voit déconseillé: il y a PDO qui est plus portable et permet un accès à plein de systèmes de BDD avec le même code. En bonus, Hostinger offre un accès PDO. À l'instar de MySQL, PDO offre une approche orientée objet; ce qui n'est pas plus dur que non-objet en fait.

Première étape donc: créer un nouvel objet PDO:
$db = new PDO($dsn, $username, $password);
Tous les paramètres sont des string.
$dsn
spécifie le type de BDD, l'addresse du serveur, le port et la base a séléctionner; dans ton cas se sera
$dsn = 'mysql:host=mysql.hostinger.fr;port=3306;dbname=[le nom de la base]';
(FAQ Hostinger: addresse du serveur, port de connexion).
$username
et
$password
sont les identifiants que tu as utilisé pour te connecter à PhpMyAdmin (si ça te connecte automatiquement à partir du panneau de controle (je sais pas j'utilise pas leurs services), ces identifiants sont probablement ceux de ton compte ou ceux que tu as donné après).
Ça nous donne:
$dsn = 'mysql:host=mysql.hostinger.fr;port=3306;dbname=[le nom de la base]';
$username = 'servicesflorian'; // Je suppose
$password = 'blablabla';
$db = new PDO($dsn, $username, $password);
Mais si la connexion marche pas? Bah PDO va envoyer une erreur, une
Exception
que l'on intercepte en mettant le code en question dans un bloc
try {} catch(Exception $e) {}
:
$dsn = 'mysql:host=mysql.hostinger.fr;port=3306;dbname=[le nom de la base]';
$username = 'servicesflorian'; // Je suppose
$password = 'blablabla';
try {
$db = new PDO($dsn, $username, $password);
} catch(Exception $e) {
exit(Erreur : '.$e->getMessage());
}
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
3 nov. 2013 à 13:43
Ce code est à mettre dans la page concerné ou dans une autre page ?
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
3 nov. 2013 à 15:03
Dans la page concernée.
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
Modifié par florire le 3/11/2013 à 23:17
D'accord, j'ai inséré le code juste après la balise <body> en changeant les infos de ma base de donné.
Par contre sur ma page sa afficher une erreur, j'ai rajouté " ' " devant Erreur et l'erreur ces enlever :). Est ce que c'est juste un oublie ou c'est normal que sa m'afficher une erreur ?

exit('Erreur : '.$e->getMessage());
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
6 nov. 2013 à 13:50
Oui j'avais oublié un
'
; c'est pour ça que PHP se plaignait.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 9/11/2013 à 23:42
3eme partie; allons-y. Une fois la connexion effectuée correctement, il va falloir se servir de la BDD. Déjà déclarons une variable booléenne qui dira si au final le contenu caché doit s'afficher ou non:
$afficher_contenu = false;
.
On va aussi stocker l'IP dans une variable:
$ip = $_SERVER['REMOTE_ADDR'];
Pour la partie verif', on va tout encadrer dans un
try {} catch(Exception $e) {}
pour éviter les erreurs pas gérées; met tout le code ci-dessous dedans.
PDO nous permet de passer des requêtes en 1 étape avec PDO::query() ou en 2 avec PDO::prepare() et PDOStatement::execute(). L'avantage de la 2e technique est qu'elle n'est pas sensible aux injection SQL (attaques) car PDO gère tout ça pour nous (voir ici et ).
Pour se faire on prépare une requête:
$req = $db->prepare('SELECT * from grattage_ip WHERE ip=?');
; ici on séléctionne (
SELECT
) tous les champs (
*
, donc id,ip et derniere_connexion) où (
WHERE
) ip est égal au premier paramètre (
ip=?
).
prepare()
retourne un PDOStatement, c'est une requête pas encore faite qu'on peut améliorer avant de l'exécuter. Justement on l'execute avec
execute
et les paramètres dans un tableau (même s'il n'y en a qu'un):
$req->execute(array($ip));
.
execute
ne renvoie rien directement, le résultat (le car il sera seul: 1 ligne par IP) se récupère sous forme d'un tableau (des contenus des colonnes) avec
$ligne = $req->fetch(PDO::FETCH_ASSOC);
. Si la ligne n'existe pas,
$ligne
vaudra
false
, chose qu'on va vérifier tout de suite:
if ($ligne === false) {
.

Dans ce
if
, il faudra ajouter l'IP a la base; pareil on fait une requête en 2 temps:
$req_ajout = $db->prepare('INSERT INTO grattage_ip(ip,derniere_connexion) VALUES (?,NOW())');

$req_ajout->execute(array($ip));
$afficher_contenu = true;
Ici on insère (
INSERT
) les champs ip et derniere_connexion dans la table grattage_ip (
grattage_ip(ip,derniere_connexion)
) avec les valeurs (
VALUES
) du premier paramètre (
?
) et de la date&heure de maintenant (
NOW()
). Le champ id se remplira tout seul en auto-increment. Et on donne l'accès, car si l'IP était pas dans la BDD, c'est que la personne n'a jamais visité le site.

On ferme le if, et on passe aux IP existantes:
} else {
.
PHP a une classe DateTime bien pratique pour manipuler les dates. Allez on stocke la date actuelle et celle de la BDD:
$maintenant = new DateTime();

$dernier_acces = new DateTime($ligne['derniere_connexion']);
Le constructeur de DateTime prends la date de maintenant si il n'a pas de paramètres, sinon il interprète la date qu'on lui donne. Faisons la différence des 2:
$difference = $dernier_acces->diff($maintenant);
, ça renvoie un DateInterval.
Ensuite, condition if qui vérifie la différence:
if ($diff->s > 10) {
. On met à jour la ligne et donne l'accès:
$req_modif = $db->prepare('UPDATE grattage_ip SET derniere_connexion=? WHERE id=?');

$req_modif->execute(array(date("Y-m-d H:i:s"), $ligne['id']));
$afficher_contenu = true;
Je vais pas refaire un dessin sur la requête SQL, t'as compris. Juste,
date
a un format spécifique, celui que j'ai mis marche avec ma BDD MySQL; mais ça peut différer (les dates renvoyées/utilsées par PDO sont des strings).
On ferme les 2 if:
} }

Ça y est, enfin! On affiche (ou pas) le contenu:
if ($afficher_contenu) {

echo '<b>Contenu secret</b>';
}

from human import idiocy
del idiocy
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
11 nov. 2013 à 00:14
Je tient à préciser que
if ($diff->s > 10)
c'est pas complet: en effet l'accès sera donné si ça fait, par exemple, 1h 5min et 11sec qu'on a visité la page;
if ($diff->y > 1 or $diff->m > 1 or $diff->h > 1 or $diff->m > 1 or $diff->s > 10)
est complet, mais pas clair... la logique elle-même n'est pas compliquée: 1 an, 1 mois, 1 jour, 1 heure et 1 minute sont tous plus longs que 10 secondes... Cette condition logique change selon l'intervalle voulu, ce qui n'arrange pas les choses.
0
florire Messages postés 151 Date d'inscription lundi 15 juillet 2013 Statut Membre Dernière intervention 15 juillet 2022 6
10 nov. 2013 à 23:52
Oh premier coup d'oeil sa à l'air compliqué mais en faite non ta tout détaillé.
Merci pour le temps de travail que ta du fournir pour sa!
J'en aurait l'utilité et j'ai appris quelques truk sur le PDO :)
Merci! :p
0