Avatar billede gnort Nybegynder
24. april 2001 - 19:25 Der er 34 kommentarer og
1 løsning

Formularsvar omsat til HTML

Hej,
Jeg har lånt/skrevet et lille program der præsenterer bruger for en form som brugeren så kan udfylde og trykke Ok hvorefter scriptet viser de data brugeren tastede ind/valgte. Problemet er at næste gang en anden bruger formen vil denne ikke kunne se de data en anden tidligere har tastet ind. Jeg ved at jeg skal oprette en seperat HTML fil hvor dataene kan gemmes i og at denne skal indeholde en <---kommentar----> man skal så referere til siden og kommentaren i Perlscriptet.
Her er koden til scriptet i dets nuværende form:
#!/usr/bin/perl
print \"Content-type:text/html\\n\\n\";

read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\",hex($1))/eg;
    $FORM{$name} = $value;
}

%valg = ( 0 => \"\",
                1 => \"Ja\",
                2 => \"Nej\" );
               
print <<EndHTML;
<html><head><title>Resultat</title></head>
<body>
<h2>Resultat</h2>

Her er dit input:<p>
Navn: $FORM{\'navn\'}<p>
Valg: $valg{$FORM{\'valg\'}}<p>
EndHTML

print <<EndFoot;
<p>
Din kommentar:<br>
$FORM{\'kommentar\'}<p>
</body></html>
EndFoot

Avatar billede erikjacobsen Ekspert
24. april 2001 - 19:55 #1
Hvad med en database?
Avatar billede thomasledet Nybegynder
24. april 2001 - 20:54 #2
Find et gæstebogsscript et sted på nettet... det gør jo netop, som du øsnker... husk at flock\'e!
Avatar billede gnort Nybegynder
24. april 2001 - 21:11 #3
Jeg ville gerne prøve at undgå at bruge en database. Jeg har kigget på adskillige gæstebogsscript på nettet, men har ikke kunne finde ud at omkonfigurere dem sådan at jeg kunne have dropdown menuer i formularen.
Avatar billede thomasledet Nybegynder
24. april 2001 - 21:43 #4
Det skulle nu ellers ikke være så svært.... i value-tag\'ne skal du bare skrive hele værdien... altså det samme som det brugeren ser...
Avatar billede sbm Nybegynder
02. maj 2001 - 23:37 #5
De værdier du modtager i formen skriver du ned i en tekstfil.

Hver gang der kommer en ny, appender du det nye indlæg til filen.

Husk at erstatte newlines med <br>

Husk evt. også at erstatte de andre særtegn der repræsenteres specielt i html:
æ = &aelig;
ø = &oslash;
å = &aring;
> = &gt;
< = &lt;

osv osv osv...

Når du vil se hele gæstebogen, starter dit program med at lave de indledende html-tags:
<html><head>
<title>Oversigt</title>
</head><body>

Og så læser den tekstfilen ind og skriver den til STDOUT

Luk filen, og skriv den afsluttende html-kode.

</body></html>

Thats it. :-)
Avatar billede sbm Nybegynder
02. maj 2001 - 23:41 #6
Ahhh... Jeg læste lige dit spørgsmål en gang til, og jeg har muligvis misforstået hvad det var du ønskede...

Du vil have at formen skal vise hvad den forrige bruger valgte...?

Du kan vel bare gemme input fra den sidste bruger i en tekstfil, og indlæse den igen når du igen skal præsentere formen for en bruger...
Avatar billede gnort Nybegynder
03. maj 2001 - 07:59 #7
Hej sbm,
Du har forstået mit spørgsmål delvis rigtigt. Jeg vil skrive til HTML filen direkte uden først at gemme dataene i en tekstfil.
Avatar billede sbm Nybegynder
03. maj 2001 - 16:19 #8
Ok.

1) Du modtager en GET/POST hvor alle data er udfyldt. Du håndterer alle parametrene i dit perl-program som du har vist herover.
2) Du læser hele din eksisterende html-fil ind i et array. (Den vil automatisk dele op ved newline -> \\n)
3) Du skriver hele array\'et ned i html-filen påny (Eller evt. en ANDEN html-fil, for senere at erstatte den gamle fil med den nye.)
4) For hver linie tester du om linien indholder en eller anden bestemt kommentar-tag som f.eks. den <!--kommentar--> tag du selv foreslog. Når du når til den linie, indsætter du istedet de nye data som du lige har modtaget i din GET/POST.
5) Når du har lavet et nyt indlæg ud fra disse data, skriver du en ny <!--kommentar--> tag i din html-fil.
6) Skriv resten af dit array ned i html-filen.

Nu skulle du gerne have en ny html-fil som både indeholder de gamle indlæg, og det nye indlæg.

Du må sige til hvis jeg (igen) misforstod spørgsmålet. :-)
Avatar billede gnort Nybegynder
03. maj 2001 - 20:36 #9
Hej sbm,
Jeg vil nu forsøge at lave de ændringer du foreslår til scriptet. Jeg vender tilbage til dig og fortæller hvordan ændringerne gik. Mange tak for hjælpen og du er meget tæt på at få pointene.
Avatar billede gnort Nybegynder
03. maj 2001 - 21:32 #10
Hej sbm,
Jeg har nu foretaget nogle ændringer på scriptet. Det er ikke helt det du foreslog men er jeg på rette vej?
#!/usr/bin/perl
$gbog=gastebog2.html
print \"Content-type:text/html\\n\\n\";

read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\",hex($1))/eg;
    $FORM{$name} = $value;
}


%valg = ( 0 => \"\",
                1 => \"Ja\",
                2 => \"Nej\" );

open (GL_BOG, \"$gbog\") ;
    @indhold = <GL_BOG>;
    close(GL_BOG);               
open (NY_BOG, \">$gbog\");

foreach $linje (@indhold) {
    if ($linje =~ /<!--Kommentar-->/)
print <<EndHTML;
<html><head><title>Resultat</title></head>
<body>
NY_BOG <!--Kommemtar-->
NY_BOG <h2>Resultat</h2>

NY_BOG Her er dit input:<p>
NY_BOG Navn: $FORM{\'navn\'}<p>
NY_BOG Valg: $valg{$FORM{\'valg\'}}<p>
EndHTML

print <<EndFoot;
<p>
Din kommentar:<br>
$FORM{\'kommentar\'}<p>
</body></html>
EndFoot

Jeg er en idiot til Perl og der er helt sikkert fyldt med fejl, det er okay at grine :-)
Hvilke ændringer forslår du jeg laver?
Avatar billede sbm Nybegynder
04. maj 2001 - 14:01 #11
Det ser fint nok ud ned til foreach $linje (@indhold) {

Her ville jeg nok lave

if ($linje =~ /<!--Kommentar-->/) {
    .... skriv den fornødne html-kode med det nye indlæg ...
} # end if
print NY_BOG $linie;

Hvordan skal siden opbygges? Skal de ældste eller nyeste være dem der står øverst? Hvis de nyeste skal tilføjes til sidst, gør du som jeg skrev herover, men hvis de nyeste indlæg skal indsættes i toppen, skal du først lave IF delen EFTER at du har skrevet $linje ud til NY_BOG

Du bør for en god ordens skyld også lukke NY_BOG efter brug.
Avatar billede gnort Nybegynder
04. maj 2001 - 20:30 #12
Hej sbm,
Du har været en meget stor hjælp. Desværre tror jeg at jeg på nuværende tidspunkt er en smule forvirret. Jeg tror at denne thread kan blive meget lang hvis vi skal forsætte på denne måde. Ville du være ked af at give mig din e-mail? Såfremt du giver mig den kan vi forsætte vores konversation der. Jeg ved ikke om det er for at hjælpe mig at du ikke retter hele koden for mig, men i håb om at lære mig noget. Jeg forhøjer lige pointene og endnu engang mange tak for hjælpen. 
Avatar billede sbm Nybegynder
04. maj 2001 - 22:42 #13
Det burde ikke være nødvendigt.

Smid lige den html-kode du gerne vil have lavet for ET indlæg i din html-side. Så skal jeg nok smide den nødvendige html- og perl-kode her som du kan cut\'n\'paste... :-)
Avatar billede sbm Nybegynder
04. maj 2001 - 22:53 #14
Jeg kan også bare lave et bud på det. Så kan du selv rette til efter behag:

Perl koden kunne se således ud:
---------------------------------------------

#!/usr/bin/perl
$gbog=gastebog2.html
print \"Content-type:text/html\\n\\n\";

read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\",hex($1))/eg;
    $FORM{$name} = $value;
}

%valg = ( 0 => \"\",1 => \"Ja\",2 => \"Nej\" );

open (GL_BOG, \"$gbog\") ;
    @indhold = <GL_BOG>;
    close(GL_BOG);               
open (NY_BOG, \">$gbog\");
foreach $linje (@indhold) {
    # print NY_BOG $linie; # Hvis du vil bytte om på rækkefølgen, så kommentér linien længere nede ud, og brug denne istedet.
    if ($linje =~ /<!--Kommentar-->/) {
        print NY_BOG \"<tr>\\n\";
        print NY_BOG \"<td>Navn: $FORM{\'navn\'}</td>\\n\";
        print NY_BOG \"<td>Valg: $valg{$FORM{\'valg\'}}</td>\\n\";
        print NY_BOG \"<td>Din kommentar: $form{\'kommentar\'}</td>\\n\";
        print NY_BOG \"</tr>\\n\";
    } # end if
    print NY_BOG $linie; # Hvis du vil bytte om på rækkefølgen, så kommentér denne linie ud, og brug den længere oppe.
}

----------------------------------------

Html-koden kunne se således ud:
-----------------------------------------

<html><head>
<title>Samlet resultat</title>
</head>
<body>
<table>
<!--kommentar-->
</table>
</body>
</html>
-----------------------------------

Du skal naturligvis ikke medregne ----- linerne. ;-)

Det er lavet direkte i tekst-boksen her, så jeg har ikke prøvet at køre det. Jeg håber ikke der er nogen fejl i koden. :-)
Avatar billede sbm Nybegynder
04. maj 2001 - 22:54 #15
Med Html-koden mener jeg naturligvis indholdet i den originale html-fil.
Avatar billede sbm Nybegynder
04. maj 2001 - 22:58 #16
Damn. Jeg glemte selv at lukke filen efter brug. :-(

Tilføj
          close(NY_BOG);
på linien efter print NY_BOG \"</tr>\\n\";
Avatar billede sbm Nybegynder
05. maj 2001 - 09:18 #17
For en ordens skyld burde jeg også selv følge op på mit eget forslag om at erstatte alle danske bogstaver og specialtegn med html-kode, så de bliver repræsenteret korrekt.

Tilføj denne funktion til aller sidst i dit perl-program:

sub DkTilHtml {
  $_[0] =~ s/æ/\\&aelig\\;/g;
  $_[0] =~ s/ø/\\&oslash\\;/g;
  $_[0] =~ s/å/\\&aring\\;/g;
  $_[0] =~ s/Æ/\\&AElig\\;/g;
  $_[0] =~ s/Ø/\\&Oslash\\;/g;
  $_[0] =~ s/Å/\\&Aring\\;/g;
  $_[0] =~ s/\\&/\\&amp\\;/g;
  $_[0] =~ s/\\</\\&lt\\;/g;
  $_[0] =~ s/\\>/\\&gt\\;/g;
}

Funktionen kaldes så inden du skriver de nye linjer ned i din html-fil. Du kan eksempel vis gør det lige efter du har hentet parametrene ud.

$FORM{\'navn\'} = &DkTilHtml($FORM{\'navn\'});
$FORM{\'kommentar\'} = &DkTilHtml($form{\'kommentar\'});

Og en sidste fodnote... Jeg så lige at jeg fejlagtigt har skrevet $form i mit eksempel, hvor jeg burde have skrevet $FORM

Så skulle den vist være ved at være der...?
Avatar billede gnort Nybegynder
05. maj 2001 - 20:21 #18
Hej sbm,
Jeg har prøvet det du foreslog men det virkede desværre ikke. Måske har jeg gjort noget forkert.

Her er koden til formular siden:

<html><head><title>Test</title></head>
<body>
<h2>Test</h2>
<form action=\"test.cgi\" method=\"POST\">

Navn: <input type=\"text\" name=\"navn\" size=30><p>

Overnatning? <select name=\"valg\">
<option value=0 selected>Valg...
<option value=1>Ja
<option value=2>Nej
</select><p>

Kommentarer?<br>
<textarea name=\"kommentar\" rows=5 cols=70 wrap=\"VIRTUAL\">
</textarea>
<p>

<input type=\"submit\" name=\"OK\">
</form>
</body></html>

Her er HTML koden til siden der skal gemme dataene:

<html><head>
<title>Samlet resultat</title>
</head>
<body>
<table>
<!--kommentar-->
</table>
</body>
</html>

Til sidst er scriptet jeg anvender:
#!/usr/bin/perl
$gbog=gastebog2.html
print \"Content-type:text/html\\n\\n\";

read(STDIN, $buffer, $ENV{\'CONTENT_LENGTH\'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\",hex($1))/eg;
    $FORM{$name} = $value;
}

%valg = ( 0 => \"\",1 => \"Ja\",2 => \"Nej\" );

open (GL_BOG, \"$gbog\") ;
    @indhold = <GL_BOG>;
    close(GL_BOG);               
open (NY_BOG, \">$gbog\");
foreach $linje (@indhold) {
    if ($linje =~ /<!--Kommentar-->/) {
        print NY_BOG \"<tr>\\n\";
        print NY_BOG \"<td>Navn: $FORM{\'navn\'}</td>\\n\";
        print NY_BOG \"<td>Valg: $valg{$FORM{\'valg\'}}</td>\\n\";
        print NY_BOG \"<td>Din kommentar: $FORM{\'kommentar\'}</td>\\n\";
        print NY_BOG \"</tr>\\n\";
        close(NY_BOG);
    }
    print NY_BOG $linie; }

Kan du se hvor fejlen er? Unskyld den lidt rodede opsætning, men linierne er sat rigtig op når jeg kører programmet.
Avatar billede sbm Nybegynder
05. maj 2001 - 21:49 #19
Det ville være rart om du beskrev hvilken besked du får når du forsøger at kalde dit cgi-program.

Hvilket operativ-system ligger din web-server på?

Hvis det er Unix eller Linux, er der så eksekverings-rettigheder på cgi-programmet?

Er den html-fil du skriver i navngivet gastebog2.html som du angiver i dit perl-program? Bemærk at Unix og Linux er case-sensitive, så du må ikke bruge store bogstaver i filnavnet, når du ikke gør det i perl-programmet.

Er der skriverettigheder til den gastebog2.html?

Du angiver action=\"test.cgi\" i din html-formular... Ligger dit test.cgi nu også i den samme mappe som html-filen?
Avatar billede gnort Nybegynder
06. maj 2001 - 22:03 #20
Jeg har ikke adgang til server logen  så jeg kan ikke fortælle dig hvad fejlmeddelelsen var. Jeg kan dog fortælle dig at filerne ligger i samme mappe og at de har den rigtige chmod. Filernes navne er også stavet rigtigt.
Avatar billede sbm Nybegynder
06. maj 2001 - 22:35 #21
FOR POKKER DA OGSÅ!

Det er jo bare en syntaks-fejl. Du mangler et semikolon efter din linie nr. 2

$gbog=gastebog2.html
    skal være
$gbog=gastebog2.html;

Avatar billede gnort Nybegynder
07. maj 2001 - 11:54 #22
Hej sbm,
Nu virker det næsten. Jeg kan udfylde formularen og trykke på knappen. Det næste der sker er at den sender mig til en blank html side. webadressen er stien til cgi-scriptet.
Avatar billede sbm Nybegynder
07. maj 2001 - 13:18 #23
Det er jo klart, for dit script skrive kun til filen, og ikke noget til skærmen/browseren. :-)

Den eneste linie der skriver til browseren er

print \"Content-type:text/html\\n\\n\";

Til sidst i dokumentet kan du jo så tilføje:

print \"<html><body>\\n\";
print \"Dit indlæg er blevet tilføjet<br>\\n\";
print \"</body></html>\\n\";

Hvis du har noget andet du mener er mere passende, skriver du naturligvis det istedet.


Avatar billede sbm Nybegynder
07. maj 2001 - 13:19 #24
... du kan evt. også læse din ny-opdaterede gastebog2.html ind i et array, og så skrive det til browseren umiddelbart under din bekræftelse....
Avatar billede gnort Nybegynder
07. maj 2001 - 14:49 #25
Hej sbm,
gastebog2.html filen er tom der bliver ikke skrevet noget til den.
Avatar billede sbm Nybegynder
07. maj 2001 - 19:59 #26
Du skrev at chmod var sat korrekt for alle filer? Er der rwxrw-rw- for gastebog2.html? Eller med andre ord: Har du sat en chmod 744 (Nu håber jeg at jeg husker rigtigt... :-)

Når du lister filerne, kan du så se om datoen på gastebog2.html er opdateret, eller om den har samme dato og klokkeslet som da du først oprettede/uploadede filen? Hvis det er uændret, er det nok fordi webbrugeren ikke har ret til at skrive i filen. (Webbrugeren er den bruger der bliver gjort brug af når filen eksekveres via en webserver.)
Hvis dato/klokkeslet har ændret sig, så er det sandsynligvis linien
    if ($linje =~ /<!--Kommentar-->/) {
der af en eller anden grund kikser. Prøv i så fald at skifte den ud med
    if ($linje =~ m/^<!--Kommentar §/) {
hvor du \"bare\" checker på om linien STARTER med denne streng....

AAAAAAAAAAAAAAAHHHHHHHHH!!! DER HAR VI DET JO! Du har skrevet <!--kommentar--> i din html-fil, men smager på <!--Kommentar--> i dit perl-program. SLYNGEL. :-) Det er vist min fejl, for jeg kan se at det gjorde jeg selv i det oprindelige eksempel. Puuuuuuha. Her gør jeg opmærksom på faren ved at systemet er case-sensitive, og så laver jeg sådan noget. :-(

Hvis du retter det så det står skrevet rent med små bogstaver begge steder skulle den være der.
Avatar billede gnort Nybegynder
07. maj 2001 - 22:04 #27
Desværre det hjalp ikke. Jeg har prøvet at chmod filen til alle mulige kombinationer. Programmet laver en ny fil som fylder nul byte og hedder gastebog2html

Du må unskylde hvis jeg er ved at drive dig til vanvid.
Avatar billede sbm Nybegynder
07. maj 2001 - 22:18 #28
Helt i orden. Jeg kan bare lade være med at være et hundehovede, og overse åbenlyse fejl.

Din linie
  $gbog=gastebog2.html;
skal naturligvis ændres til
  $gbog=\"gastebog2.html\";
da den ellers regner . for en konkatenering, hvilket trækker de to dele sammen.

Den burde nu stadig skrive noget ned i filen...?
Avatar billede gnort Nybegynder
08. maj 2001 - 19:22 #29
Hej sbm,
Nu virker det....næsten. HTML filen viser kun den første indtastning, næste gang jeg taster noget ind er filen tom. Jeg prøvede derfor at indsætte
<!--kommentar-->
i html filen, men så gemte den kun den nye indtastning og ikke den gamle. Hvordan får jeg den til at gemme alle indtastninger?
Avatar billede sbm Nybegynder
08. maj 2001 - 19:30 #30
Ahhhh. Jeg havde ikke set din close(NY_BOG)
Den skal først stå EFTER at du er kommet ud af din foreach { ... }
-> Altså efter din linie med
    print NY_BOG $linie; }
Som du har det nu, lukker du for filen så snart du har skrevet det nye indlæg, og det går naturligvis galt.
Avatar billede gnort Nybegynder
09. maj 2001 - 14:22 #31
Hej sbm,
det virker sådan nogenlunde nu. Lige et bonuspørgsmål hvordan laver jeg større mellemrum mellem de forskellig felter?
Avatar billede sbm Nybegynder
09. maj 2001 - 18:27 #32
Da du allerede har lagt dataene ind i en tabel, er den mest oplagte løsning nok at sætte en WIDTH på dine <td> tags.

Eksempelvis:

<td width=\'50px\'>

eller

<td width=\'25%\'>

Eksperimenter selv med det, til det ser ud som du vil have det.
Avatar billede sbm Nybegynder
09. maj 2001 - 18:39 #33
Bemærk lige at hvis du bruger %-angivelser, kan udseendet variere den del fra computer til computer alt afhængig af hvilken opløsning de bruger, og du skal så også angive en % width på dit <table> , f.eks. kunne være <table width=90%> som så vil gøre tabellen 90% af den bredde dit browservindue har.
Avatar billede gnort Nybegynder
09. maj 2001 - 20:13 #34
Hej sbm,
Jeg har lige et dumt spørgsmål mere.
Skulle
print ny_bog $linje; }

ikke være

print ny_bog $linie; }
Avatar billede sbm Nybegynder
09. maj 2001 - 20:50 #35
Jo. Det skal naturligvis være det samme hele vejen ned igennem programmet. Enten $linie eller også $linje, men bare du holder det samme hele vejen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester