24. april 2001 - 19:25Der 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\";
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.
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. :-)
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.
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\";
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.
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.
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... :-)
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: -----------------------------------------
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:
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?
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.
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.
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.
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.
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.
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?
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.
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.
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.
Synes godt om
Ny brugerNybegynder
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.