Ip unique via fichier txt

vita83 Messages postés 20 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 13 mars 2013 - 18 déc. 2009 à 16:50
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011 - 26 déc. 2009 à 09:54
Bonjour je souhaiterais via un fichier texte, verifier qu'une ip ne voie qu'une fois par jour un div.

Je vais tenté d'exposer le pourquoi, je voudrais mettre une pub google sur mon site (oui je sais beurk), mais j'ai lu de ci de la, que si un petit malin cliquer 140 fois sur la pub .. cela pouvais faire sauter le compte associer a cette pub.

Je vous montre ou j'en suis pour le moment, pas loin .. mais pour moi c'es déja un miracle :)
<?
$ip = $_SERVER["REMOTE_ADDR"];
$date = date("d-m-Y");
Print("");
$nom_fichier = "$date.txt"; 
if ($fichier = fopen($nom_fichier, "a+"))  { 
fwrite($fichier, $ip); 
fwrite($fichier, "\r\n");
fclose($fichier); 
} else { 
print("Impossible d'acceder au fichier $nom_fichier"); 
} 
?>

Donc dans ma logique il me fallait verifier chaques jours qu'une ip ne soit pas deja passer par la, et pour une raison qui m'es propre je ne souhaite pas utilisé MySql, d'ou le choix pour le fichier texte.

A partir de la, les ip sont bien stocker dans un fichier texte a la date du jour.
Maintenant j'aimerai savoir comment effectuer une verification sur ce fichier, afin de savoir si oui ou non, une ip es déja passer par la, afin d'inclure ou non cette ip a la suite des autres et surtout d'afficher ou non le div dans la page contenant ce code :)

Je ne demande pas de macher le travail, juste comprendre comment ca dois ce passer, par exemple simplement avec un affichage, l'ip existe/l'ip n'existe pas , j'adapterai moi meme :)

Je ne veut pas non plus d'un script tout fais, je voudrais reellement comprendre.

Merci par avance pour vos pistes

7 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
18 déc. 2009 à 20:37
Salut Vita,

C'est un peu lourd je trouve, le jeu en vaut il vraiment la chandelle ? Je doute.
Il faudrait en savoir plus sur ces limitations, c'est 140 cliques de la même IP tous les jours ? toutes les 10 minutes ?
N'autoriser qu'un seul affichage par jour est quelque peu extrémiste.

Quelques remarques sur ton code :
<?
=>
<?php


$ip = $_SERVER["REMOTE_ADDR"];
$date = date("d-m-Y");
Print("");
$nom_fichier = "$date.txt"; 
if ($fichier = fopen($nom_fichier, "a+"))  { 
  fwrite($fichier, $ip); 
  fwrite($fichier, "\r\n");
  fclose($fichier); 

=> en 1 seule ligne n'est ce pas mieux ?
file_put_contents(date("dmY").'.txt', $_SERVER["REMOTE_ADDR"]."\r\n", FILE_APPEND);


Maintenant que ton fichier est constitué tu n'as plus qu'à :
- retirer l'IP du visiteur
- retirer le contenu de ton fichier (voir file() et file_exists())
- regarder si l'ip est présente (voir in_array())
- oui ?
=> tu n'affiches pas le div
- non ?
=> tu affiches le div
=> tu consignes l'ip avec le code que tu as déjà écrit, l'idéal étant de le
mettre dans une fonction


N'hésite pas à re poster.

Bonne soirée,


Kohntark -
0
vita83 Messages postés 20 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 13 mars 2013
19 déc. 2009 à 13:44
Erf :( pour <?php ca m'était sorti de la tete :p
En ce qui concerne le code sur une ligne seule, bah je vois que la majorités des sites ne sont pas a jour avec php, sur les 3/4 des sites je suis tomber sur ca, et notamment dans le livre "php5 & mysql5" de micro application (983 pages) ou le même procéder que moi est utilisé.
Je vais donc essayer de comprendre un peu mieux cette ligne, bien qu'il me semble déjà l'avoir cerné :), merci a toi pour cela

J'avais plus ou moi trouver un bout de code, qui aurait pu, convenir a une partie de ce que je compte faire :
<? php
$date = date("d-m-Y");
if (!$fp = fopen("$date.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne = fgets($fp,255);
echo $Ligne;
$Fichier .= $Ligne;
}
fclose($fp);
}
?>


Il ne resterai plus qu'a insérer une condition, si l'ip existe alors ..

Hélas, au vu de ton code, et du mien , je présume que ce code ci n'es pas a jour non plus.

Sinon, oui je pense que le jeu en vaut la chandelle, ne serai-ce que pour une auto-satisfaction, et m'aider a comprendre un peu plus php, qui me semble si énorme oO
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
19 déc. 2009 à 15:10
la majorités des sites ne sont pas a jour avec php

Ce n'est pas faux, et c'est très souvent un problème pour les débutants qui recopient, pensant bien faire, du vieux code qui ne fonctionne plus, ou mal, sur les versions actuelles de PHP.
Dans ton cas le code n'est pas faux est reste d'actualité.
C'est plus une question de simplicité et de concision, mais cela reste à l'appréciation de chacun.

file_put_contents(date("dmY").'.txt', $_SERVER["REMOTE_ADDR"]."\r\n", FILE_APPEND);

file_put_contents => (voir la doc) ça te remplace le fopen, le fwrite et le fclose en une seule fonction.
date("dmY").'.txt', $_SERVER["REMOTE_ADDR"]."\r\n" => je ne fais que condenser (concaténer) ce que tu fais en passant par plusieurs variables ($date, $ip, $nom_fichier, ...)

[...]Hélas, au vu de ton code, et du mien , je présume que ce code ci n'es pas a jour non plus.

Tu fais comme tu le sens hein, mais je pense que tu gagnerai en simplicité et en efficacité a utiliser les fonctions que je t'ai indiquées (file, in_array ...).
Je te laisse consulter la doc (php.net) qui s'y rapporte.

Voici tout de même un peu plus de détail :
Afin de correctement scinder les choses tu crées 2 fonctions :
- l'une nommée (par ex) addIP qui contient la ligne de code que je t'ai donnée (où au pire celui de ton premier message) avec en argument l'ip (il faudra donc remplacer $_SERVER["REMOTE_ADDR"] par la valeur de l'argument) :

<?php
function addIP($ip) {
   file_put_contents(date("dmY").'.txt', $ip."\r\n", FILE_APPEND);
}
?>


- l'autre permettant le contrôle de la présence (ou non) de l'ip dans le fichier :
<?php
function checkIP($ip) {
   // retrait du contenu du fichier ds un tableau
   $a = file($date.'.txt');
   // contrôle que l'ip passée en paramètre n'existe pas déjà
   if (!in_array($ip, $a)) {
      addIP($ip); // écrit l'ip dans le fichier
      return false; // l'ip n'est pas présente
   } else return true; // l'ip est présente
}
?>


Tu appelles tout simplement, dans ta page contenant la pub :
<?php
if (!checkIP($_SERVER["REMOTE_ADDR"])) { // l'ip n'est pas présente ds le fichier
   // affichage du div contenant la pub
}
?>


Ce ne sont là que les grandes lignes afin de te montrer le principe (il faut également gérer les erreurs, purger les fichiers obsolètes, etc ...)

Sinon, oui je pense que le jeu en vaut la chandelle, ne serai-ce que pour une auto-satisfaction, et m'aider a comprendre un peu plus php, qui me semble si énorme oO

Tu as bien raison dans le principe, et je ne peux qu'adhérer à ça.
Il n'empêche qu'il est important de réfléchir sur le fond. Interdire plus d'un click par jour est exagéré. Pourquoi ne pas partir plutôt sur 1 click maximum toutes les heures ? Je me trompes peut être mais ça m'étonnerait que google en tienne rigueur.

Cordialement,


Kohntark -
0
vita83 Messages postés 20 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 13 mars 2013
20 déc. 2009 à 13:57
Nan nan :p bien évidemment que j'utilise ton code précédent, ne ligne au lieu de 6 ne peut qu'alléger un peu la page, et la relecture du code, encore fallais t'il le savoir, comme dis précédemment je ne suis pas un pro du Php :(

Sinon pour les fonction, vraiment pas mal, je suppose qu'il faut que le code soi dans la meme page, voir au pire inclus (include ou require), enfin je vais me documenter un peu sur toutes cette séries de commandes.

Une dernière petites question toutefois, quelle documentation, même en anglais s'il le faut me conseillerais tu sachant que j'ai juste quelques notions ?, j'ai un peu peur de partir sur de mauvaises bases, avec des exemples d'il y a 5 ans :(

Pour google, pour être franc je ne connais pas les limites, ma femme me dis que sur un site de jeu rpg online, il y a un système de publicités, sur lequel tu peut cliquer 5 fois par jour, de la a savoir si le système mis en place es ou non google adsence, je ne serai pas dire, mais comme on me la toujours dis mieux vaut prévenir que guérir :p

En tout cas merci pour tout ca :)
0

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

Posez votre question
hornet_bzz Messages postés 17 Date d'inscription samedi 16 décembre 2006 Statut Membre Dernière intervention 26 décembre 2009
26 déc. 2009 à 05:12
Hornet bzz 

Les conseils de Kohntark sont parfaits donc je m'y +1.

J'ajouterai juste que $_SERVER['REMOTE_ADDR'] ne suffit pas dans le cas des proxy, voilàa comment je procède :

$current_ip = (!isset($current_ip))? !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] : $current_ip ;
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 déc. 2009 à 09:37
Salut Hornet_bzz,

Bien vu pour cette précision.
Une question cependant :

$current_ip = (!isset($current_ip))? !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] : $current_ip ;

Quel est l'intérêt du isset ??


Cordialement,


Kohntark -
0
cs_hornetbzz Messages postés 59 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 3 janvier 2011
26 déc. 2009 à 09:54
HORNET

Salut Kohntark,

A vrai dire, aucun intérêt particulier si c'est sorti de son contexte. Mais ça ne mange pas de pain non plus.

Dans son contexte, c'est utilisé dans une page php qui reboucle sur elle-même plusieurs fois, et je n'ai pas besoin de redéfinir à chaque fois l'IP du visiteur.

Voilà pour la petite histoire du contexte
0
Rejoignez-nous