[PHP] Récupérer certaines données d'un log

Salut à tous.

Attention, je préviens d’entrée : je suis un gros n00b en programmation. Je connais juste un poil le HTML et basta. Mais là je commence un peu à m’attaquer au PHP, complètement à l’arrache, et je bloque sur un truc que je veux faire. Je m’explique :

Je fais un sondage avec 2 choix : oui ou non. Dans un log, en fichier texte, à chaque fois que quelqu’un vote, j’enregistre une ligne du style “Adresse IP - Date et Heure - Réponse au sondage”. De cette façon, la personne ne peut voter qu’une fois (à moins qu’il renouvelle son IP mais bon passons).
Ca, c’est bon.

La prochaine fois qu’il retourne sur la page où il a déjà voté, je voudrais, qu’à la place du sondage comme il l’avait vu la première fois, il y ait un encadré précisant “Vous avez voté XXX”, XXX étant Oui ou Non suivant ce que la personne a voté.

Ca ne durerait qu’un jour (en gros le lendemain je passe à un autre sondage et je file les résultats de celui de la veille), donc il ne devrait pas y avoir de renouvellement automatique de l’adresse IP entre temps.

En gros, il faudrait que mon code aille voir dans le log, compare les adresses IP stockées avec celle du monsieur qui visite la page, et, s’il trouve la sienne (donc si celui-ci a déjà voté), m’affiche sa réponse. S’il ne la trouve pas, il affiche tranquillement le formulaire de sondage, bien entendu.

  1. C’est la bonne méthode ou vous voyez un moyen bien plus simple ?

  2. Comment réaliser la partie en gras ?

Je précise que le code que j’utilise permettant le sondage, avec récupération d’IP pour éviter les votes multiples d’une même personne, et le stockage dans un log, ça vient de . Je serais bien entendu incapable de faire ça moi-même (pour l’instant en tout cas ^ ^).

Merci d’avance !

EDIT: je suis un peu fatigué, j’ai besoin de quelqu’un pour s’occuper de moi à temps plein et je n’ai pas vu la fin du post.

En gros tu cherches:

  • fopen() -> regardes comment on lit les lignes d’un fichier puis comment on l’ouvre et écrit dedans
  • foreach -> tu parcours tes lignes, conditionnal statement if (current_ip (tu cheches les var $_SERVERgnagna) == ip de la ligne) alors affichage page x ou y

etc. etc.
Mais c’est foireux comme manière de procéder et de mettre en place, tu vas avoir des accès concurrents dans ton fichier et plein d’autres prob.
Le mieux je crois pour toi c’est de trouver du déjà fait prêt à l’emploi online comme:
http://www.surveymonkey.com/Home_Pricing.aspx

Youpi, une réponse.

Alors, tout d’abord, merci bien.

Ensuite : j’ai déjà regardé les solutions “clef en main”, et ça correspond pas du tout à ce que je veux faire, c’est beaucoup trop rigide, c’est vraiment centré sur la récolte des données, alors que moi j’aimerais un truc justement super malléable, où je peux aller choper n’importe quelle info en détail et l’afficher après. Enfin bref.

Merci pour ton explication, je pense que c’est par là que je vais me diriger, en effet, mais en fait mon plus gros souci, c’est ça :

Par exemple, précisément, j’ai des lignes comme ça dans mon log :
"89.25.196.125 - ATours-252-1-58-175.w90-19.abo.wanadoo.fr - 2007-07-05 (17:51) - 1183650672 - operating_system - 1 - Mac "
“90.19.138.112 - ATours-252-1-58-175.w90-19.abo.wanadoo.fr - 2007-07-05 (17:51) - 1183656378 - operating_system - 0 - Windows”

Comment je fais pour afficher “Vous avez voté Mac” au mec qui a l’IP 89.25.196.125 et “Vous avez voté Windows” à celui qui à l’IP 90.19.138.112 la prochaine fois qu’ils viennent visiter mon site ?

Je comprends comment rechercher la bonne IP, la comparer avec l’IP actuelle du mec qui surf sur mon site et afficher un truc à ce moment là si les 2 coïncident. Mais j’arrive pas à lui faire afficher précisément “Mac” ou “Windows”. Comment lui dire que, de cette ligne, c’est juste ce mot que je veux afficher ? C’est ça ma grosse question en fait.

Edit : J’ajoute que je ne peux pas lui indiquer ni à partir de quel caractère commencer à lire la ligne ni le nombre de caractères à afficher, car tout est de taille variable (le texte qu’il y a avant et après la réponse à afficher, et la réponse elle-même)

Ouais, Je penses que ca va etre plus simple de mettre un mysql a la con et de faire une entrée a chaque fois, ca sera 50 fois plus simple pour tout faire (ajout/suppression, stats) bref, c’est fait pour ca hein.

A la va-vite, je dirais que ça devrait aller:

$string = "127.0.0.1 - ATours-252-1-58-175.w90-19.abo.wanadoo.fr - 2007-07-05 (17:51) - 1183650672 - operating_system - 1 - Mac "; $string = "127.0.0.1 - ATours-252-1-58-175.w90-19.abo.wanadoo.fr - 2007-07-05 (17:51) - 1183656378 - operating_system - 0 - Windows";
on check l’ip (c’est barbare, je connais pas le format sous lequel elles te sont données. Disons que j’espère qu’elles sont toujours en début de ligne et suivie d’un espace et d’un tiret) (riez pas les autres)

if ($_SERVER['REMOTE_ADDR'] = substr($string, 0, strpos($string, '-') - 2)) { if (preg_match('/\bMac(\s)?$/', $string)) { echo 'vous avez voté mac'; }
tu remplaces c/c et remplaces Mac par autre chose si tu veux, ça check si ta ligne finit par le mot Mac suivi d’un espace blanc ou d’une fin de ligne

if (preg_match('/\bWindows(\s)?$/', $string)) { echo 'vous avez voté win'; } }

Voilà.

edit: vraiment besoin de prendre un truc moi.
Si tu ne sais pas quels os tu as mis dans ton formulaire (si tu n’as pas le contrôle):

if (preg_match('/\b([A-Za-z0-9])+(\s)?$/', $string, $extrait)) { echo 'OS choisi:' . $extrait[0]; }
Ça devrait te sortir le dernier mot de ta ligne.

desole de m’inscruster mais moi, j’aime pas utiliser les regexp (parce que c’est illisible une fois qu’elle est faite) et j’aurais utilise “explode”:

a priori, quelle est la meilleure methode?

Dans ce que je connais des differentes fonctions, explode serait a priori plus gourmand en memoire mais preg_match est lui aussi susceptible de renvoyer un tableau de matchs.
D’un autre cote, je trouve que l’utilisation d’explode est nettement plus lisible que preg_match

Niveau perfs, ca donnerait quoi a priori?

LoneWolf
Incrustation sauvage

Je suis d’accord. Voilà mon point de vue:
Si on connait la structure des données il est beaucoup plus intéressant d’utiliser strpos, substr et tout ce qui est fonctions de manipulations de caractères.
Parce que :

  1. c’est plus clair
  2. ça bouffe clairement moins de ressources que les regex qui doivent être parsées et analysées, les fonctions de manip. de car. de php sont bien mieux optimisées (ai-je lu dans la doc il y a longtemps, elles sont aussi basées sur des regex mais à un niveau plus bas)
    Cela dit ici ça renvoie pas la même chose, et sur une regex on peut être plus granulaire sur la chaine récupérée et ce directement dans la regex.

Ici j’ai zappé l’explode parce que je ne sais pas dire ce qui se passe s’il manque une ‹ variable/info › dans une ligne, est-ce qu’on a quelque chose comme ‹ $var1 - $var2 - - $var3 › ou ‹ $var1 - $var2 - undefined - $var3 › ? Je ne sais pas après à quel index du tableau l’élément récupéré est assigné… ah ben j’ai réfléchi trop vite, c’est forcément le premier et le dernier dans ce cas-ci.

En fait je crois que c’est pathologique, j’aime pas les tableaux :confused:

Donc en beaucoup plus simple ça donne ça:

$string = explode (' - ', $string); if ($_SERVER['REMOTE_ADDR'] = reset($string)) { echo 'OS choisi:' . end($string); }

Juste en passant, lonewolf et nolan, ça ne marche pas si dans la réponse, il y a la suite ’ - '. Etant donné que ce n’est pas censé arriver dans les 6 premiers tokens, en utilisant le 3e paramètre de explode, on évite ce souci, genre :

PS: Vous êtes sûrs qu’on est dans la bonne section du forum ?

6 plutôt, non?

C’est peut être idiot, mais en utilisant un cookie, c’est pas jouable ?

J’ai encore des petits souvenirs de php et c’est ce que j’aurais fait.

EDIT: En utilisant le cookie uniquement pour gérer l’affichage entre l’option “déjà répondu au sondage” et “pas répondu au sondage”. EN cas de présence du cookie, on affiche les résulats, sinon, on affiche les options pour y répondre. Avec toujours les lignes de codes qui vérifient ensuite si on a pas déjà répondu au sondage.

J’allais répondre qu’il faut utiliser les cookies…

ça marche sauf si le gars efface tout ses cookies, il peut le modifier aussi…

J’aurais également tout mis en base de donnée personnellement, étant donné que l’auteur à précisé, je cite

« alors que moi j’aimerais un truc justement super malléable »

Je vois pas plus malléable qu’une db

Du xml? ou un flan peut être…
Sinon c’était juste pour mettre +1 à la fonction explode.
Après tu t’amuses avec de la gestion de tableau et ça reste toujours plus lisible que les regexp.

argh… hérésie.

on ne le dira jamais assez, mais le xml n’a absolument aucune vocation à servir pour stocker quoi que ce soit!
son utilité, c’est la transmission des données. c’est tout.

Vous oubliez un truc c’est que le monsieur n’a pas forcément le choix et doit faire du flat files parce qu’il a choppé un script qui fait ce qu’il veut jusqu’à présent sauf le check du user, ou qu’il a pas accès à une db ou que sais-je encore, ou qu’il a déjà récupéré ses infos de sondage et qu’elles sont en l’état donc c’est trop tard pour recommencer tout ; on n’en sait rien. Forcément si on écrit un système de sondage from scratch on peut faire à peu près ce qu’on veut et on lui dirait de le faire en .net ou en perl mais c’est pas les données du problème.

Pour la vérification y a les cookies et les ip mais ça n’empêche un même problème pour les deux options: qu’est-ce qu’on fait quand deux personnes veulent/doivent remplir le sondage à partir d’une même machine, d’un même browser ? Je m’avance un peu mais suivant le public ciblé pour le sondage on doit prendre en compte ça. La meilleure option à mon sens c’est pas de vérification. Si l’utilisateur s’amuse à VOULOIR faire le sondage deux fois c’est pas un cookie qui l’en empêchera (intention de vouloir nuire hein… l’homme est méchant de base : p ) ni une ip à terme. On laisse la responsabilité sur l’utilisateur et basta, on a pas tant de contrôle que ça au final. A la limite tu fais un système de login, hm? Mais on s’éloigne du problème posé.

@Rabban
Je vois pas trop le problème de stocker des données dans du xml. Il y a des choses pour lesquelles c’est très bien adapté: CML, MathML, thinkingrock machin, des fichiers de configuration, etc.

Généralement on utilise des cookies, par contre ca pose problème si on l’efface ou si deux personne utilise la même machine (lycée, bar)
Sinon tu peut enregistrée les entrées dans une BDD au moment du vote. Tu peut classer en fonction des utilisateurs si ils sont identifiées ou par IP si il ne le sont pas.
Par IP pose le problème de réseaux dérrière une simple IP.

Famille, Lycée, société, bar …

Personnellement, je n’ai trouvé aucune méthode convenable.
Que ce soit par cookies (on efface et on recommence), ip (on bloque les utilisateurs d’un même réseau), login (on crée un nouveau compte avec une nouvelle adresse e-mail), voir les 3 à la fois. T’as toujours possibilité de passer outre.
Donc faut faire avec … ou alors me donner la solution.

Je ne fais pas avancé le schmilblick avec ça … ça restera ma modeste contribution.
(Faut dire que tout a déjà été plus haut, alors à quoi bon répéter)