Hejsan!
Jag har två cgi-script som jag skulle vilja göra till ett script!
Det är två gästböcker.
Den första har jag och en kompis snickrat ihop (ingen av oss kan cgi så bra...).
Men den funkar som så att man fyller i ett formulär. Sen öppnar cgi-programmet texten.html och skriver över hela innehållet plus att den
skriver in de nya uppgifterna ifrån formuläret.
#!/usr/bin/perl
#######################################################
# #
# Copyright Johan Nilsson © 2001 #
# #
#######################################################
#############################################################################
$filnamn = "/web/sites/23/selander/www.selander.f2s.com/cgi-bin/texten.html";
$allow_html = "1";
#############################################################################
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;
$value =~ s/<!--(.|\n)*-->//g;
if ($allow_html != 1) {
$value =~ s/<([^>]|\n)*>//g;
}
$FORM{$name} = $value;
}
#############################################################################
open (FIL,">$filnamn") || die "Kan inte öpnna på grund av; $!\n";
print FIL "<html>";
print FIL "<head><title>selander.it</title></head>";
print FIL "<body bgcolor=#4A73B5 text=#fffFFF STYLE=scrollbar-face-color: #4A73B5; scrollbar-arrow-color: #fffFFF; scrollbar-base-color: #4A73B5; scrollbar-track-color: #4A73B5>";
print FIL "<FONT FACE=Verdana, Courier New size=2>";
print FIL "Yeah Yeah<br>";
print FIL "<img src=http://www.selander.f2s.com/frames2/linje.gif border=0 align=top><p>";
print FIL "selander.it är den ultimata sidan som vill hålla dej veta allt om mej...<br>";
print FIL "För det är här det händer, det är här man får reda på saker och ting om mej! :)<br>";
print FIL "Iallafall så var det <a href=\"mailto:$FORM{'email'}\">$FORM{'namn'}</a> som senast skrev något i min gästbok, han skrev ungefär:<br>";
print FIL "<font size=1>$FORM{'meddelande'}<br></font><br>";
print FIL "Copyright";
print FIL "</font>";
print FIL "</body>";
print FIL "</html>";
close (FIL);
#############################################################################
print "Location: <A HREF="http://www.selander.f2s.com/cgi-bin/texten.html\n\n";" TARGET=_blank>http://www.selander.f2s.com/cgi-bin/texten.html\n\n";</A>
Den andra gästboken som jag har är en som jag har laddat hem ifrån jojoxx.net
Den funkar som en vanlig gästbok...
#!/usr/bin/perl
###############################################################################
# Guestbook Pro V 2.01 Copyright Johan Johansson 2000-11-29
# johan@jojoxx.net - [url="http://www.jojoxx.net"]http://www.jojoxx.net[/url]
###############################################################################
# Variabler
$path = '/web/sites/23/selander/www.selander.f2s.com/cgi-bin'; # Se readme.txt
$datafile = 'jxbookpro2.dat'; # Namnet på datafilen för gästboken.
$template = 'jxbookpro2tmpl.html'; # Templatefilen för gästboken.
$msgtemplate = 'jxbookpro2entry.html'; # Templatefilen för varje meddelande.
$messagesperpage = 10; # Meddelanden per sida.
$encodehtml = '1'; # Se readme.txt
# Ändra inte på följande rader.
%form = get_form();
%query = get_query();
$numberofentries = get_nrgbentries();
$startmessage = max(1,$numberofentries-$messagesperpage+1);
$startmessage = $query{'startmessage'} if($query{'startmessage'});
# Lite macron att leka med.
$macro{'nextpageurl'} = $ENV{'SCRIPT_NAME'} . "?startmessage=" . min($startmessage+$messagesperpage,max($numberofentries-$messagesperpage+1,1));
$macro{'prevpageurl'} = $ENV{'SCRIPT_NAME'} . "?startmessage=" . max($startmessage-$messagesperpage,1);
$macro{'lastpageurl'} = $ENV{'SCRIPT_NAME'} . "?startmessage=" . max($numberofentries-$messagesperpage+1,1);
$macro{'firstpageurl'} = $ENV{'SCRIPT_NAME'} . "?startmessage=1";
$macro{'nrmessages'} = $numberofentries;
# Vilka fält skall användas, och i vilken ordning.
open(INDATA,"$path/$datafile") || error('Kunde inte hitta/läsa datafilen <i>' . "$path/$datafile" . '</i>.');
foreach $inline (<INDATA> ){
last if($inline =~ /#--data--/);
if (substr($inline,0,1) ne '#' && index($inline,'=')>0){
# chomp $inline;
$inline = jxchomp($inline);
($name,$value) = split(/=/,$inline);
$config{$name} = $value;
}
}
close(INDATA);
error('Datafilen innehåller inte någon information om <i>fält</i> (fields).') if(!$config{'fields'});
@usefields = split(/,/,$config{'fields'});
# Kolla så att templatefilen för gästboken går att läsa.
open(INDATA,"$path/$template") || error('Kunde inte hitta/läsa templatefilen för gästboken <i>' . "$path/$template" . '</i>.');
close(INDATA);
# Läs in templatefilen för meddelanden.
open(INDATA,"$path/$msgtemplate") || error('Kunde inte hitta/läsa templatefilen för meddelanden <i>' . "$path/$msgtemplate" . '</i>.');
$msgtemplate = join('',<INDATA> );
close(INDATA);
@msgmacros = ($msgtemplate =~ /%%(.*?)%%/g);
# Är det ett meddelande som skall skrivas in?
addtobook() if ($form{'action'} eq 'addtobook');
@gbentries = get_gbentries($startmessage,$messagesperpage);
@gbentries = reverse(@gbentries);
foreach $test (@gbentries){
@theseentries = split(/\t/,$test);
$thismsgmacro{'ip'} = pop(@theseentries);
$thismsgmacro{'time'} = pop(@theseentries);
$thismsgmacro{'date'} = pop(@theseentries);
for($n=0;$n<=$#usefields;$n++){
$thismsgmacro{$usefields[$n]} = $theseentries[$n];
}
$thismsg = $msgtemplate;
foreach $msgmacro (@msgmacros){
$thismsg =~ s/%%$msgmacro%%/$thismsgmacro{$msgmacro}/g;
}
$macro{'gbentries'} .= $thismsg . "\n";
}
print "Content-type: text/html\n\n";
open(INDATA,"$path/$template");
foreach $inline (<INDATA> ){
@testmacros = ($inline =~ /%%(.*?)%%/g);
foreach $testmacro (@testmacros){
$inline =~ s/%%$testmacro%%/$macro{$testmacro}/g;
}
print $inline;
}
close(INDATA);
sub get_form {
my $buffer,$n;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
my @pairs = split(/&|=/, $buffer);
for($n=0;$n<=$#pairs;$n++){
$pairs[$n] =~ tr/+/ /;
$pairs[$n] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$pairs[$n] =~ s/<!--(.|\n)*-->//g;
$pairs[$n] =~ s/<([^>]|\n)*>//g;
}
return @pairs;
}
sub get_query {
my $query_buffer = $ENV{'QUERY_STRING'};
my @pairs = split(/&|=/, $query_buffer);
for($n=0;$n<=$#pairs;$n++){
$pairs[$n] =~ tr/+/ /;
$pairs[$n] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$pairs[$n] =~ s/<!--(.|\n)*-->//g;
$pairs[$n] =~ s/<([^>]|\n)*>//g;
}
return @pairs;
}
sub get_scriptdir {
my $path = $ENV{'PATH_TRANSLATED'};
$path =~ s/\\/\//g;
return substr($path,0,rindex($path,'/'));
}
sub error {
print "Content-type: text/html\n\n";
print <<End_of_html;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Fel!</title>
</head>
<body bgcolor="white">
<h2>Fel!</h2>
<p>$_[0]
</body>
</html>
End_of_html
exit;
}
sub addtobook {
my $missing,$test,$temp;
if($form{'required'}){
$form{'required'} =~ s/ //g;
@required = split(/,/,$form{'required'});
foreach $test (@required){
$missing .= "<li> $test <br>\n" if(!$form{$test});
}
if($missing){
print "Content-type: text/html\n\n";
print <<End_of_html;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Fält saknas!</title>
</head>
<body bgcolor="white">
<h2>Du måste fylla i följande fält</h2>
<ul>
$missing
</ul>
<a href="#" onClick="history.go(-1);">Tillbaks</a>
</body>
</html>
End_of_html
exit;
}
}
open(OUTDATA,">>$path/$datafile") || error('Kunde inte skriva till datafilen <i>' . "$path/$datafile" . '</i>. Fel rättigheter satta på filen?');
foreach $test (@usefields){
$temp = $form{$test};
$temp =~ s/\\/\\\\/g;
$maclf = chr(13);
$unixlf = chr(10);
if(index($temp,$unixlf)>-1 && index($temp,$maclf)>-1){
$temp =~ s/$maclf//g;
}
$temp =~ s/$unixlf/\\n/g;
$temp =~ s/$maclf/\\n/g;
print OUTDATA $temp . "\t";
}
print OUTDATA jxtodaysdate() . "\t" . jxtimenow() . "\t" . $ENV{'REMOTE_ADDR'} . "\n";
close(OUTDATA);
}
sub get_gbentries {
# get_gbentries(startmessage,messagesperpage)
my $inline,$doread=0,$n=0;
my @data;
open(INDATA,"$path/$datafile") || error('Kunde inte hitta/läsa datafilen <i>' . "$path/$datafile" . '</i>.');
foreach $inline (<INDATA> ){
chomp $inline;
$doread = 1 if($inline =~ /#--data--/);
next if($doread eq 0);
next if(substr($inline,0,1) eq '#');
$n++;
if($n>=$_[0]){
$inline =~ s/\\\\/\\/g;
if($encodehtml eq '1'){
$inline =~ s/</</g;
$inline =~ s/>/>/g;
$inline =~ s/\\n/<br>/g;
} else {
$inline =~ s/\\n/\n/g;
}
push(@data,$inline);
}
last if($n eq $_[0] + $_[1]-1);
}
close(INDATA);
return @data;
}
sub get_nrgbentries(){
my $inline,$doread=0,$n=0;
open(INDATA,"$path/$datafile") || error('Kunde inte hitta/läsa datafilen <i>' . "$path/$datafile" . '</i>.');
my @inlines = <INDATA>;
close(INDATA);
foreach $inline (@inlines){
$doread = 1 if($inline =~ /#--data--/);
next if($doread eq 0);
$n++ if(index($inline,"\t")>-1);
}
return $n;
}
sub max {
if($_[0] > $_[1]){
return $_[0];
} else {
return $_[1];
}
}
sub min {
if($_[0] < $_[1]){
return $_[0];
} else {
return $_[1];
}
}
sub jxtodaysdate {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
$mon = substr("0" . $mon,length($mon)-1,length($mon)+1);
$mday = substr("0" . $mday,length($mday)-1,length($mday)+1);
return($year . "-" . $mon . "-" . $mday);
}
sub jxtimenow {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$hour = substr("0" . $hour,length($hour)-1,length($hour)+1);
$min = substr("0" . $min,length($min)-1,length($min)+1);
$sec = substr("0" . $sec,length($sec)-1,length($sec)+1);
return($hour . ":" . $min . ":" . $sec);
}
sub jxchomp{
my ($data,$macnl,$unixnl);
$macnl = chr(13); $unixnl = chr(10); $data = $_[0];
$data =~ s/$macnl//g; $data =~ s/$unixnl//g;
return $data;
}
Det jag nu vill ha är att när man fyller i formuläret och sen trycker på skicka knappen, så görs allt som det brukar i jojoxx.net´s script.
Plus att det senaste inlägget sparas på texten.html (förstasidan)
Man kanske måste skriva om alltihopa?? Men ifall man bara kan bygga ihop dessa två scripten borde det inte vara så svårt...?
Hejdå
Per Selander