Casse_tête CGI pour débutant

ManusurleNET Messages postés 8 Statut Membre -  
 gdj -
Bonjour,
Voici une petite question concernant un script CGI que je n'arrive pas à résoudre..Je suis très intéressé par la programmation et j'essaie de résoudre quelques problèmes simples pour compléter mes connaissances en CGI qui sont encore fragmentaires...
Sujet: Affichage trié et présenté en tableau d'éléments issus d'un fichier texte.
Eléments utilisés:
1)Le fichier:
Il s'agit d'un fichier au format txt qui contient les lignes à présenter. Ces lignes se présentent comme dans l'exemple suivant:
Branche;;Famille;;CestQui;;CeQuilSaitFaire

1;;1;;tonton Jacques;;c'est l'encyclopédie de la famille
2;;1;;tante rose;;Fait de bonnes crêpes
1;;2;;Tatie Yvette;;Elle en connait un rayon sur les papillons
2;;2;;Robert;;Si vous aimez faire la fête, il s'y connait
3;;1;;Lili;;La plue jolie de mes amies

2) ce que je voudrais faire avec le script:
Le but est de trier les éléments en fonction de la branche et dans chaque branche, de la famille après avoir ouvert et chargé le fichier dans un tableau (je sais, on peut faire plus simple ou différent, mais là c'est pour apprendre à ordonner et à présenter...)
Pour l'exemple...
Branche Famille CestQui CeQuilSaitFaire
1 1 tonton Jacques c'est l'encyclopédie de la famille
1 2 Tatie Yvette Elle en connait un rayon sur les papillons
...

3)ce que je sais aujourd'hui:
Je sais accéder au fichier, l'ouvrir et l'afficher mais...
Je ne sais pas si je le fais dans le bon sens, je ne sais pas une fois en tableau comment ordonner les éléments en fonction des choix branche1-Famille1,Famille2...branche2, Famille1,....Je connais les notions de split et prototype de recherche avec une expression régulière mais je ne sais pas forcement les appliquer de manière judicieuse...

Voilà, si vous avez une idée sur le comment, alors j'aurai pu en apprendre un peu plus...(c'est dur d être seul pour apprendre parfois...sniff)..
Merci d'avance à tous les amoureux des casses-têtes (enfin...pour moi !!)

4 réponses

gdj
 
Tu n'as qu'à lire le livre Html4
Il explique tous les choses de la création des tableaux
0
nan75 Messages postés 20 Statut Membre 2
 
Je pense que tu devrais :
1) ouvrir le fichier
2) le lire ligne par ligne
3) mettre de suite dans un tableau different les données de chaque branche
4) fermer le fichier
5) trier les tableaux (Famille)
6) sortir les données avec des RegExp (ou split mais split est beaucoup plus lent).

Ca donnerait quelque chose comme ça :

open FICHIER,"<fichier.txt";
while (<FICHIER>){
# recupere les branches :
if (/^1;;(.*)$/){ push @branche_01, $1 }
elsif (/^2;;(.*)$/){ push @branche_02, $1 }
elsif (/^3;;(.*)$/){ push @branche_03, $1 }
}
close FICHIER;

# tri :
@branche_1 = sort { $a <=> $b } @branche_1;
@branche_2 = sort { $a <=> $b } @branche_2;
@branche_3 = sort { $a <=> $b } @branche_3;

# affichage :
foreach $ligne(@branche_1){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "1 $1 $2 $3\n";
}
foreach $ligne(@branche_2){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "2 $1 $2 $3\n";
}
foreach $ligne(@branche_3){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "3 $1 $2 $3\n";
}
-1
ManusurleNET Messages postés 8 Statut Membre
 
Bonjour nan75,
Merci de ta réponse que je vais étudier...dès que j'aurai dormi un peu...lol..
C'est vraiment très positif pour moi que tu es bien voulu me mettre sur la voie... Je crois que je tournais un peu en rond, ne sachant si je devais créer d'autres tableaux à partir du premier, et comment...enfin des trucs de débutants, quoi.
Comme je ne suis pas sûr de pouvoir te rendre service à mon tour, j' essaierai de voir dans le forum si je peux apporter mon aide à quelqu'un en échange.

Encore merci de ton post.
A bientôt, peut-être ?
ManusurleNET
-1
nan75 Messages postés 20 Statut Membre 2
 
Moi aussi je devais être fatigué quand j'ai écrit ça : remplace les @branche_01 @branche_02 et @branche_03 (lors de la lecture du fichier) par @branche_1 @branche_2 et @branche_3 sinon ça ne risque pas de marcher ;)
-1
ManusurleNET
 
Bonjour nan75,
Je me suis penché une partie du weekend sur ton post. Après pas mal de manipulations et de recherches sur mes interrogations, j'ai du me résoudre à laisser de coté pour le moment, car je n'arrive pas à l'affichage recherché.
A priori, la logique de ton code me semble tout à fait correct, mais il doit me manquer quelques infos ou mon raisonnement oublie un élément qui lui fait défaut. Pour le moment, j'obtiens un joli affichage du type: '500 Internal Server Error' sans plus de détails...

Peux-tu me dire si mon code recelle un bug que je ne verrai pas ??

#!c:\perl\bin\perl.exe

print "Content-type: text/html\n\n";
print <<"EOF";
<html> <head> <title> Page affichTotal essai ! </title> </head>
<body>
<h1> affichage des dépêches 'depech.txt'(fichier d'éssai) </h1>

EOF
print "...Transfert dans un tableau secondaire... \n";
open(tartempion,"<depechessai.txt");

while(<tartempion>){
Recuperer les branches..
if(/^1;;(.*)$/){push @branche_1,$1};
elseif(/^2;;(.*)$/){push @branche_2,$1};
elseif(/^3;;(.*)$/){push @branche_3,$1};}}
close(tartempion);

#Tri des tableaux..
@branche_1=sort{$a<=>$b}@branche_1;
@branche_2=sort{$a<=>$b}@branche_2;
@branche_3=sort{$a<=>$b}@branche_3;

#Affichage..
foreach $ligne(@branche_1){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "1 $1 $2 $3 \n";}

foreach $ligne(@branche_2){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "2 $1 $2 $3 \n";}

foreach $ligne(@branche_3){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "3 $1 $2 $3 \n";}

print <<"EOF";

</body>
</html>
EOF
exit;

Je sais que le moindre oubli aboutit à ce message mais j'ai épluché chaque ligne et je ne vois pas...
Merci de ton aide.

ManusurleNET
0
ManusurleNET Messages postés 8 Statut Membre
 
Quelques modifications de codes avec ajout d'un test qui marche en premier..

#!c:\perl\bin\perl.exe

print "Content-type: text/html\n\n";
print <<"EOF";
<html> <head> <title> Page affichTotal essai ! </title> </head>
<body>
<h1> affichage des dépêches 'depech.txt'(fichier d'éssai) </h1>
EOF

print "...Lecture brute du fichier... \n";
open(tartempion,"<depechessai.txt");
$i=0;
while($lg=<tartempion>){
chomp($lg);
sort($lg);
print "<li> ligne $i: $lg </li> \n";}
$i++;
close(tartempion);


print "...Transfert dans un tableau secondaire..\n";
open(tartempion,"<depechessai.txt");
while($lg=<tartempion>){
#Recuperer les branches..
if($lg=(/^1;;(.*)$/)){push @branche_1,$1};
elsif($lg=(/^2;;(.*)$/)){push @branche_2,$2};
elsif($lg=(/^3;;(.*)$/)){push @branche_3,$3};}
close(tartempion);

#Tri des tableaux..
@branche_1=sort{$a<=>$b}@branche_1;
@branche_2=sort{$a<=>$b}@branche_2;
@branche_3=sort{$a<=>$b}@branche_3;

#Affichage..
foreach $ligne(@branche_1){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "1 $1 $2 $3 \n";}

#foreach $ligne(@branche_2){
#$ligne=~/(\d+);;(.+?);;(.+)/;
#print "2 $1 $2 $3 \n";}

#foreach $ligne(@branche_3){
#$ligne=~/(\d+);;(.+?);;(.+)/;
#print "3 $1 $2 $3 \n";}

print <<"EOF";
</body>
</html>
EOF
exit;
-1
nan75 Messages postés 20 Statut Membre 2 > ManusurleNET Messages postés 8 Statut Membre
 
Dans ton avant-dernier exemple, ta boucle "while(<tartempion>){" contenait pas mal d'erreurs.
Il suffit de la changer par :
###############
while(<tartempion>){
# Recuperer les branches..
if(/^1;;(.*)$/){push @branche_1,$1}
elsif(/^2;;(.*)$/){push @branche_2,$1}
elsif(/^3;;(.*)$/){push @branche_3,$1}
}
###############
Tout les reste était OK.
Si tu veux une sortie HTML, remplace les "\n" avec des "<br>" dans les instructions "print" et si tu veux deboguer avec ton navigateur, tu peux rajouter en 2e ligne de ton script "use CGI::Carp qw/fatalsToBrowser/;" :

#!c:\perl\bin\perl.exe
use CGI::Carp qw/fatalsToBrowser/;
-1
ManusurleNET Messages postés 8 Statut Membre > nan75 Messages postés 20 Statut Membre
 
Bonjour nan75
Ton aide m'a vraiment été précieuse..Merci (ca marche super!!). J'avais mis plein d'erreurs partout (à force de déplacer les crochets et de changer un peu tout pour voir ce que ca donne...)
Conclusion: Perl est pointilleux sur l'écriture et l'exploitation des fichiers log est pas toujours intuitive...Mais en reprenant le code avec logique ..et patience on finit par tomber sur le bon truc..!!
Je crois qu'il va falloir m'exercer encore pour que mon raisonnement se fasse à ce langage, mais c'est vraiment super de voir ses efforts récompensés par un bel affichage...

ManusurleNET
-1
ManusurleNET Messages postés 8 Statut Membre > nan75 Messages postés 20 Statut Membre
 
Bonsoir nan75,
Si tu as 2,3 secondes, voici quelques questions...
Programmes-tu en Perl/CGI ou est-ce l'un des langages que tu connais ??
Penses-tu que les fichiers d'aide sont une bonne manière d'approfondir ses connaissances d'un langage ?
Si tu avais à conseiller un ou des bouquins sur la question, quels seraient-ils??

Comme tu le vois, mille questions qui sont le signe de mon intérêt pour la poursuite de l'apprentissage de la programmation...et de mes interrogations quant à la suite à donner pour completer un début très motivant..

Merci pour tes réponses..
ManusurleNET
-1
nan75 Messages postés 20 Statut Membre 2
 
Pour ce qui est des livres, il doit y en avoir des centaines. Le plus connu étant le "Perl Cookbook" (https://docstore.mik.ua/orelly/perl/cookbook/index.htm Mais ça ne remplace pas la pratique !

###################
#Recuperer les branches..
if(/^1;;(.*)$/){push @branche_1,$1;}
###################
a quoi correspond la variable $1 du bout ? Je l'ai fait varier pour voir...a $0, on a l'adresse du doc..a$2, pas d'affichage..
Je pencherai pour ...$1 reçois le contenu du tableau @branche_1..??


$1 reçoit la valeur du regexp qui est entre parenthèse "(.*)".

###################
#Affichage..
foreach $ligne(@branche_1){
$ligne=~/(\d+);;(.+?);;(.+)/;
print "1- $1 $2 $3 <br>";}
###################
Les variables du print sont les cases du tableau @branche_1 ? D'après l'affichage, oui.


Tout comme le précédent, $1 reçoit la valeur dans la 1ere parenthèse, mais en plus, $2 reçoit celle de la 2e et $3 celle de la 3e.

Je me demandais dans quelle mesure il faudrait modifier le code quand on veut afficher un nombre de branches inconnu

Dans ce cas, pas la peine de vouloir réinventer la roue : tu trouveras des modules qui font ça très bien (https://www.cpan.org/ L'exemple ici était simple. Mais même si tu ne connais pas le nombre maxi de branches, il faudra quand même établir une limite car si tu as un formulaire sur un site il faut faire attention aux abus des utilisateurs. Ca peut être dangereux.
-1
ManusurleNET Messages postés 8 Statut Membre
 
Bonjour nan75,
Tout d'abord, merci pour tes réponses...Pour ce qui est de l'apprentissage d'un langage, je suis tout à fait d'accord avec toi, rien ne remplace la pratique..La seule limite que l'on peut rencontrer, c'est quand comme moi on est seul devant son clavier...on a pas toujours tout de suite la réponse aux questions posées par la programmation en cours. Mais heureusement, Internet existe..!! J'ai pris quelques formations (cnam) mais il fallait corriger les cours pour que les exemples marchent sur ma bécane....et j'avais pas forcement les réponses à mes questions...sniff..
bon...mais je dois être vicieux parce que j'adore tripatouiller le code..c'est absolument motivant..!!

Question du jour: Dans notre exemple, nous avons vu que l'utilisation des Expressions Régulières est très puissante et permet un filtrage efficace. Je me demandais s'il est possible d'utiliser des variables dans les ExprReg (ce qui les rendraient encore plus souples) et si oui de quelle manière..(parenthèses, crochets, écriture spécifique..)??

Pour ce qui est des formulaires et de leur utilisation, faut-il prévoir un 'cadrage' de ce qu'il est possible de faire pour éviter les abus ?? (par exemple, prévoir une utilisation frauduleuse des infos transmises par le formulaire et leur éventuelle détournement et/ou réutilisations à des fins non autorisées et adapter le code en conséquence?

Mon idée pour les branches était celle-ci: la personne qui remplit les infos que nous avions dans le fichier texte ne peut qu'indiquer la branche concernée par ses infos (sous forme numérique dans notre cas) + la partie 'CestQui' et 'CeQuilSaitFaire' avec des champs texte. La partie 'Famille' serait calculée par le script à partir de l'existant dans le fichier (par exemple, si dans la branche 2 il y a déjà 3 personnes le script affecte '4' à la prochaine création dans la branche 2, ce qui suppose qu'il connaisse ce qu'il y a déjà dans la branche).
Donc pour être clair, si on a 4 branches et qu'un utilisateur lambda créé la branche 50, j'aurai voulu pouvoir aussi l'afficher dans mon tableau. En fait je veux afficher tout le contenu du fichier contigu ou non.
Voilà pour mes interrogations du jour..

Mreci pour ta réponse.
ManusurleNET
-1
nan75 Messages postés 20 Statut Membre 2 > ManusurleNET Messages postés 8 Statut Membre
 
Pour les RegExp tu peux utiliser des variables, mais aussi une combinaison chaine de caractères + variables, par exemple /$variable/ ou /texte $variable texte/. Si la variable contient des carctères réservés à Perl (+ . * $ @ ...), ils seront interprétés comme tels, sinon si tu veux qu'ils ne soient interprétés que comme chaines de caractères il faut rajouter \Q..\E.
Exemple:
$variable='a.b';
1) /$variable/ => recherchera une chaine contenant "a" + n'importe quel caractère + "b"

2) /\Q$variable\E/ => recherchera bien la chaine "a.b" (comme "a\.b")

Quant à la sécurité c'est à toi de prévoir depuis le formulaire tout d'abord et surtout après dans ton script lors du traitement des données. Si les utilisateurs ne peuvent entrer qu'un nombre entre 0 et 10 tu dois t'assurer qu'ils ne peuvent rien entrer d'autres. Idem pour les caractères alphabétiques, la longueur des données etc. Tu dois tout tester quand tes scripts sont terminés.
-1