webForumDet fria alternativet

Kodkommentarer...

4 svar · 521 visningar · startad av demo

demo
#1

Hej!

Har gjort en gästbok, och skulle nu vilja ha några kommentarer på koden.

Man fyller i namn, stad, e-post och kommentar, samt väljer en passande ikon till det inlägg man skrivit.

Koden har även en lite censurfunktion inbygd som tar bort olämpliga ord som hämtas ur en textfil.

I en annan funktion hämtas dagens datum, som även de lagras för respektive inlägg. Antalet besökare på sidan, och antalet inlägg registreras och presenteras längst ned på sidan.

De 10 senaste inläggen visas. Vill man se de övriga så hänvisas man till en arkiv och söksida (ett annat pl-script).

Tycker att scriptet/gästboken i sig fungerar utmärkt.

Vet att det är svårt att läsas annans kod, men undrar ändå över en fråga. Hur pass bra kvalite är det på kodandet?

Vad kan göras bättre? Vad är direkt fel? Kan man visa denna kod för en van perl-programmerar, utan att behöva skämmas osv?

Bara några funderingar, liksom.

//Demo

#!/usr/bin/perl

# Sökvägen där ikonbilderna ligger, exempelvis...
$bilder='http://www.mindomän.nu';

# Sökvägen till loggan, exempelvis...
$loggan='http://www.mindomän.nu/bok.jpg';

# Sökvägen till söksidan, exempelvis...
$sokning='http://www.mindomän.nu/cgi-bin/boksok.pl';

# Sökvägen till gästboksfilen
$boktext='bok.txt';

# Sökvägen till din gästbok, exempelvis...
$gastbok='http://www.mindomän.nu/cgi-bin/bok.pl';

# Sökvägen till din boknr.txt
$boknr='boknr.txt';

# Sökvägen till cencurfilen, ord.txt
$ord='censur.txt';

################################################
# Kontrollerar om något är ifyllt i formuläret #
################################################

################################################
###### Tar emot uppgifter från formuläret ######
################################################
$forminfo=$ENV{'QUERY_STRING'}; 
$forminfo=~tr/+/ /; 
$forminfo=~s/%(..)/pack("c",hex($1))/ge; 

@par=split(/&/,$forminfo); 

foreach $a (@par){ 
($ruta, $text)=split(/=/,$a); 
$INFO{$ruta}=$text; 
} 

####################################################################################
###### Kontrollerar om något fält är ifyllt                                   ######
###### Om ja, gå till subrutinen för att ta emot värden                       ######
###### Om nej, går då till subrutinen för att skriva ut listan och formuläret ######
####################################################################################

if($INFO{'namn'} ne "" || $INFO{'epost'} ne "" || $INFO{'hemstad'} ne "" || $INFO{'kommentar'} ne ""){

®istrera_kommentar;
}
else
{
&skriva_gastlista;
}

#############################################
# Subrutin som skriver ut gästbokens inlägg #
#############################################

#########################
# SKRIVER UT HTML-SIDAN #
#########################

print "Content-type: text/html\n\n";
print "<html><head><title>Gästbok 1.0</title></head>";
print "<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" vlink=\"#0000FF\">";
print "<center><img src=$loggan></center><center><small><br>";
print "<b>På denna sida finner du de 10 senaste inläggen.<BR>";
print "Vill du se eller söka bland de övriga inläggen<br>";
print "hänvisar vi till vår <a href=\"$sokning\">arkiv och söksida</A>.";
print "<b><br></center></small>";
print "<STYLE>A {text-decoration:none} A:hover{text-decoration:underline} </STYLE></p>";
print "<div align=\"center\"><center><table border=\"0\" width=\"400\">    <tr>";        
print "<td width=\"100%\"><p align=\"center\"></p>        </td>    </tr></table></center></div>";
print "<form action=\"/cgi-bin/bok.pl\" method=\"get\">";    
print "<div align=\"center\"><center><table border=\"0\" cellpadding=\"4\"    cellspacing=\"4\">"; 
print "<tr><td align=\"right\"><font color=\"#000000\">";
print "<strong>Namn:</strong></font></td>";
print "<td><input type=\"text\" size=\"30\" maxlength=\"40\" name=\"namn\"></td>";
print "</tr><tr><td align=\"right\"><p align=\"right\"><font color=\"#000000\"><strong>E-post: </strong></font></p>";
print "</td><td><input type=\"text\" size=\"30\" maxlength=\"40\" name=\"epost\"></td>";
print "</tr><tr><td align=\"right\"><p align=\"right\"><font color=\"#000000\"><strong>Hemstad: </strong></font></p>";
print "</td><td><input type=\"text\" size=\"30\" maxlength=\"40\"  name=\"hemstad\"></td></tr><tr><td align=\"right\" valign=\"top\">";
print "<p align=\"center\"><font color=\"#000000\"><strong>Kommentar:</strong></font></p></td><td valign=\"top\"><p align=\"right\">";
print "<textarea name=\"kommentar\" rows=\"4\" cols=\"30\" maxlength=\"100\"></textarea><br>";
print "<input type=\"submit\" value=\"Sänd\"> <input type=\"reset\" value=\"Rensa\"></p></td></tr><tr><td>";
print "<p align=\"right\"><font color=\"#000000\"><strong>Figur:</strong></font></p></td><td>";
print "<input type=\"radio\" checked name=\"R1\" value=\"5.gif\"><img src=$bilder\/5.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"2.gif\"><img src=$bilder\/2.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"3.gif\"> <img src=$bilder\/3.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"4.gif\"><img src=$bilder\/4.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"7.gif\"><img src=$bilder\/7.gif>";
print "</td></tr></table></center></div></form>";
print "</body></html>";

sub skriva_gastlista{
$k=0;
open (TEXT,"$boktext");
while ($rad=<TEXT> ){
$k++;
$rad=~/(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)/;

$INFO1[$k]=$1;
$INFO2[$k]=$2;
$INFO3[$k]=$3;
$INFO4[$k]=$4;
$INFO5[$k]=$5;
$INFO6[$k]=$6;
$INFO7[$k]=$7;
$INFO8[$k]=$8;
}
close (TEXT);
}

################################################################################
###### Kontollerar antalet inlägg/rader i textfilen (om de är mindre än 10) ####
################################################################################
open (TEXT,"$boktext");
$kommentarer=0;
@filen=<TEXT>;
foreach $rad (@filen){
$kommentarer++;
}
close (TEXT);

######################################################################
###### Vänder på vektorn så att vekt(1) blir det senaste inlägget ####
######################################################################
$nr=0;
while ($k ne 0){

$SORT1[$nr]=$INFO1[$k];
$SORT2[$nr]=$INFO2[$k];
$SORT3[$nr]=$INFO3[$k];
$SORT4[$nr]=$INFO4[$k];
$SORT5[$nr]=$INFO5[$k];
$SORT6[$nr]=$INFO6[$k];
$SORT7[$nr]=$INFO7[$k];
$SORT8[$nr]=$INFO8[$k];
$nr++;
$k--;
}

#############################################
###### Skriver ut de 10 senaste inläggen ####
#############################################
print "<center><table border=\"0\" width=\"400\"><TR><TD>";
$nr=0;
while ($nr ne 10){

###########################################################################
# Om antalet inlägg är mindre än tio, skall endast de inläggen skrivas ut #
###########################################################################
if($nr eq $kommentarer){
&raknare;
exit;
}

print "<hr>";
print "<img src=\"$bilder/$SORT6[$nr]\" alt=\"Smiley\"> ";

		if($SORT3[$nr] ne "tomt") 
		
{ 
                print  "<b><a href=\"mailto:$SORT3[$nr]\">$SORT2[$nr]</A></b> <small><i>  ($SORT7[$nr])</i> <br>\n";
	} 
            	  else
		{
               print  "<b>$SORT2[$nr]</b> <small><i>($SORT7[$nr])</i><br>\n";
		}

		print  "$SORT5[$nr]</b><p>\n";

		if($SORT4[$nr] ne "") 
		{ 
		print  "$SORT4[$nr], $SORT8[$nr] - $SORT1[$nr]</small><br>";
		} 
             	  else
	{
                print  "$SORT8[$nr] - $SORT1[$nr]</small><br>";
	}
         
$nr++;
if($nr eq 10){
&raknare;
exit;
}
}

sub raknare{
##################################################
# Räknar fram antalet besökare och lägger till 1 #
##################################################

# Öppnar textfilen för att hämta och ladda om värden

open (RAKNARE,"$boknr");
while ($rad=<RAKNARE> ){
$rad=~/(.*)::(.*)/;
$besokare[1]=$1;
$kommentar[1]=$2;
}
close (RAKNARE);
$besokare[1]++;

open (RAKNARE,">$boknr");
print RAKNARE "$besokare[1]::$kommentar[1]";
close (RAKNARE);

print "<hr><p><small><center>Antalet kommentarer i gästboken är <b>$kommentarer</b> st.<br>Du är besökare nr: <b>$besokare[1]</b> som välkomnas till denna gästbok!";
print "<p><i>Detta gästboksscript är konstruerat<br>av ";
print "<a href=\"mailto:mitt\@epost.com\">mitt namn</a>.</CENTER></SMALL></td></tr></table>";
exit;
}

###################################
# Subrutin som registrerar inlägg #
###################################
sub registrera_kommentar{

################################################################
###### Kontrollerar att obligatoriska uppgifter är ifyllda #####
################################################################

if($INFO{'namn'} eq "" &#0124;&#0124;$INFO{'kommentar'} eq "") 
{ 
print "Content-type: text/html\n\n"; 
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Namn och kommentar är obligatoriska uppgifter!<br>"; 
print "Backa med din browser och fyll i glömd uppgift!"; 
print "</left></h3></b>";
exit; 
} 

#######################################################################
###### Kontrollerar att epostuppgifterna innehåller korrekta tecken ###
#######################################################################

if($INFO{'epost'}=~/[;<>\*\`&\$!#\(\)\[\]\{\}:'"]/) 
{ 
print "Content-type: text/html\n\n"; 
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Din epost innehåller ett felaktigt tecken!<br>"; 
print "Backa med din browser och korrigera uppgiften!"; 
print "</left></h3></b>";
exit; 
} 

if($INFO{'epost'} eq "")
{
$INFO{'epost'}="tomt";
}

####################################################################
###### Skriver ut ett meddelande om att inlägget är registrerat ####
####################################################################
print "Content-type: text/html\n\n"; 
print "<meta http-equiv=\"Refresh\" content=\"2; URL=$gastbok\">";
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Tack för din kommentar, $INFO{'namn'}!<br>"; 
print "Du kommer inom kort att förflyttas till gästboken.<br>Om ditt inlägg inte syns, så uppdatera sidan."; 
print "</left></h3></b>";

################################
###### Tar bort HTML-taggar ####
################################
$INFO{'namn'} =~ s/</\<\;/g;
$INFO{'namn'} =~ s/</\>\;/g;
$INFO{'hemstad'} =~ s/</\<\;/g;
$INFO{'hemstad'} =~ s/</\>\;/g;
$INFO{'kommentar'} =~ s/</\<\;/g;
$INFO{'kommentar'} =~ s/</\>\;/g;

##########################################
##### Ersätter radbrytningar med <br> ####
##########################################
$INFO{'kommentar'}=~s/\n/<br>/g; 

##############################
### Tar fram dagens datum ####
##############################
@dagar = ("Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag");
@manader = ("Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December");

@tid = localtime(time);

if ($tid[3] > 2){
$tid[3] = $tid[3].":e";
}else{
$tid[3] = $tid[3].":a";
}

if ($tid[0] < 10){
$tid[0] = "0".$tid[0];
}

if ($tid[1] < 10){
$tid[1] = "0".$tid[1];
}

if ($tid[2] < 10){
$tid[1] = "0".$tid[1];
}

$tid[5]=$tid[5]+1900;

$datum=  "$dagar[$tid[6]]en den $tid[3] $manader[$tid[4]] $tid[5]";

#############################################################
# Går igenom censurfilen och ersätter olämpliga ord med *** #
#############################################################
open(FILE,"$ord");
@censur=<FILE>;
close FILE;

map {
chomp;
$replace = '*' x length($_);
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'epost'} =~ s/$_/$replace/gi;
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'hemstad'} =~ s/$_/$replace/gi;
$INFO{'kommentar'} =~ s/$_/$replace/gi;
}
@censur;

############################################################
# Kontrolelrar så att inget skrivit :: och förstör filerna #
############################################################
@kontroll = ('::');                                         
map { 
$replace = '*' x length($_); # Här är det du söker.
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'epost'} =~ s/$_/$replace/gi;
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'hemstad'} =~ s/$_/$replace/gi;
$INFO{'kommentar'} =~ s/$_/$replace/gi;
}
@kontroll;

#####################################################
### Tar fram numret på inlägget, samt ökar med 1 ####
#####################################################
open (RAKNARE,"$boknr");
while ($rad=<RAKNARE> ){
$rad=~/(.*)::(.*)/;
$besokare[1]=$1;
$kommentar[1]=$2;

}
close (RAKNARE);

$kommentar[1]++;

open (RAKNARE,">$boknr");
print RAKNARE "$besokare[1]::$kommentar[1]";
close (RAKNARE);

###########################
### Sparar variablerna ####
###########################
open (LOGG,">>$boktext");

print LOGG "$kommentar[1]::$INFO{'namn'}::$INFO{'epost'}::$INFO{'hemstad'}::$INFO{'kommentar'}::$INFO{'R1'}::$ENV{'REMOTE_ADDR'}::$datum\n";

close (LOGG);
exit;
}

------------------
"De som styr vårt land - är överklassens rövarband."

[Redigerat av demo den 06 nov 2000]

CssonMedlem sedan feb. 2000314 inlägg
#2

Några synpunkter:

  • Använd CGI-modulen till att läsa in formuläret:

    # Överst i filen
    use CGI;
    $q = new CGI;

    # Där du vill ha det
    print $q->param('namn');
    print $q->param('email');

    Om du har ett formulärfält som heter "namn" och/eller ett som heter "email" skriver denna kodsnutt ut de värden som besökaren matat in. Modulen innehåller många andra bra funktioner, men det kan vara lite besvärligt att sätta sig in i dokumentationen. Väljer du att använda denna kan du också använda method=POST (CGI-modulen gör ej skillnad på GET och POST) vilket känns lite snyggare.

  • Lås filer med flock (förutom om scriptet ska kunna köra under Windows 95/98), ange "<" när du bara ska läsa filer och kontrollera alla filöppningar/stängningar:

    #Överst i filen
    use Fcntl ':flock';

    # Filöppning för läsning
    open(TEXT,"<$boktext") or die("Kunde inte öppna filen $boktext : $!");
    flock(TEXT, LOCK_SH) or die("Kunde inte låsa filen $boktext : $!");

    # Filöppning för skrivning (> eller >> )
    open(TEXT,">>$boktext") or die("Kunde inte öppna filen $boktext : $!");
    flock(TEXT, LOCK_EX) or die("Kunde inte låsa filen $boktext : $!");

    # Filstängning:
    flock(TEXT, LOCK_UN) or die("Kunde inte låsa upp filen $boktext : $!");
    close(TEXT) or die("Kunde inte stänga filen $boktext : $!");

  • Använd here documents istället för upprepade print "..."-satser. Till exempel:

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

    print <<'_HTML_';
    <html><head><title>Gästbok 1.0</title></head>
    <body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#0000FF">
    <center><img src=$loggan></center><center><small><br>
    <b>På denna sida finner du de 10 senaste inläggen.<BR>
    Vill du se eller söka bland de övriga inläggen<br>
    hänvisar vi till vår <a href="$sokning">arkiv och söksida</A>.
    <b><br></center></small>
    <STYLE>A {text-decoration:none} A:hover{text-decoration:underline} </STYLE></p>
    <div align="center"><center><table border="0" width="400"> <tr>
    <td width="100%"><p align="center"></p> </td> </tr></table></center></div>
    <form action="/cgi-bin/bok.pl" method="get">
    <div align="center"><center><table border="0" cellpadding="4" cellspacing="4">
    <tr><td align="right"><font color="#000000">
    <strong>Namn:</strong></font></td>
    <td><input type="text" size="30" maxlength="40" name="namn"></td>
    </tr><tr><td align="right"><p align="right"><font color="#000000"><strong>E-post: </strong></font></p>
    </td><td><input type="text" size="30" maxlength="40" name="epost"></td>
    </tr><tr><td align="right"><p align="right"><font color="#000000"><strong>Hemstad: </strong></font></p>
    </td><td><input type="text" size="30" maxlength="40" name="hemstad"></td></tr><tr><td align="right" valign="top">
    <p align="center"><font color="#000000"><strong>Kommentar:</strong></font></p></td><td valign="top"><p align="right">
    <textarea name="kommentar" rows="4" cols="30" maxlength="100"></textarea><br>
    <input type="submit" value="Sänd"> <input type="reset" value="Rensa"></p></td></tr><tr><td>
    <p align="right"><font color="#000000"><strong>Figur:</strong></font></p></td><td>
    <input type="radio" checked name="R1" value="5.gif"><img src=$bilder/5.gif>
    <input type="radio" name="R1" value="2.gif"><img src=$bilder/2.gif>
    <input type="radio" name="R1" value="3.gif"> <img src=$bilder/3.gif>
    <input type="radio" name="R1" value="4.gif"><img src=$bilder/4.gif>
    <input type="radio" name="R1" value="7.gif"><img src=$bilder/7.gif>
    </td></tr></table></center></div></form>
    </body></html>

    _HTML_

    Om det bara är enstaka rader kan du använda print qq. Till exempel:

    print qq~<center><table border="0" width="400"><TR><TD>~;

  • Du borde antingen ha en möjlighet att bestämma den relativa sökvägen till bok.pl eller ändra koden i formuläret så att formuläret inte är <form action="/cgi-bin/bok.pl"> utan bara <form action="bok.pl">.

Några tips bara :)

/Csson

------------------
Erimax.com
Cykelsemester

[Redigerat av Csson den 06 nov 2000]

emissionMedlem sedan dec. 19996 095 inlägg
#3

Det såg i det stora hela mycket bra ut.

Det stora print-blocket där sidan skrivs ut blir mer överskådligt med

print <<EOT;
Content-type: text/html\n\n
<html><head><title>Gästbok 1.0</title></head>
.
.
.
EOT

if($INFO{'namn'} ne "" || $INFO{'epost'} ne "" || $INFO{'hemstad'} ne "" || $INFO{'kommentar'} ne ""){

kan skrivas:

if($INFO{'namn'} || $INFO{'epost'} || $INFO{'hemstad'} || $INFO{'kommentar'}){

$rad=~/(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)/;

gör man smidigare med en split, liksom för

$rad=~/(.*)::(.*)/;

Sedan kan man ju alltid göra explicita variabeldeklarationer, taint check, fillåsning och annat, men man behöver ju inte ta i så man spricker. :)

------------------
-------------------
What a waste it is to lose one's mind. Or not to have a mind is being very wasteful. How true that is.
Dan Quayle

stevenetMedlem sedan juni 2000985 inlägg
#4

Fast fillåsningen är rätt viktig...

------------------
SteveNet - stevenet@webmarkit.net
Stjäl inte mer än vad du kan bära, staten hatar konkurrens.

demo
#5

Hej!

Tack för era synpunkter och föslag på förbättringar. :)
Tycks väl inte ha varit helt fel ute ändå. Men nu vet jag vad som kan göras bättre till nästa gång.

Alltid bra att låta andra granska ens script och komma med synpunkter. Det är ju en metod att utveckla sig själv lite grann, liksom.

//Demo

------------------
"De som styr vårt land - är överklassens rövarband."

Genererad på 393 ms · cache AV · v20260730165559-full.f96bc7eb