[这个贴子最后由ycxing在 2002/12/06 12:45pm 编辑]
这是我早些时候写的。
这里只是一个非常普通,非常简陋的留言本程序。原作者我忘了,反正是抄袭的,不过改了几点小问题。
原代码及解释如下:
代码:
#!/usr/bin/perl -w
#这是服务器的perl解释器路径,加w参数是为了本来是为了运行程序的错误的时候有所警告,不过本人发现
#如果你的程序在Win系统下能够运行,而不能在Unix不能运行时,加个w参数可以帮你解决这个烦恼。
$url="http://localhost/cgi-bin/book/index.cgi";
#本程序的url地址
$passwd="123456";
#本程序所设定的密码
$pageview="10";
#本程序所设定一页能够查看多少留言数
$title="瑞欣供求信息";
#这几个变量是定义参数,就像我们用键盘的时候,必须先定义:按A健就可以在屏幕上显示A。
if ($ENV{'REQUEST_METHOD'} eq "POST")
#判断程序通过Internet的传输方式,是get还是post
#如果传输方式是post,则运行read语句
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
#读取post请求中向标准输入<stdin>发送的字节数
}
#如果传输方式不是post,则运行else语句
else
{
$buffer = $ENV{'QUERY_STRING'};
#传递给CGI程序的url的问号(?)之后的那部分
}
# @pairs是一个数组,split函数用于从列表中分离字符串
@pairs = split(/&/, $buffer);
# foreach是一个条件语句,用来累加一个数组变量的值
foreach $pair (@pairs)
{
($comment, $value) = split(/=/, $pair);
#下面对用户输入进行必要的过滤,如第一行,将用户输入的+号过滤掉为空格
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/\|//g;
$value =~ s/>/>/g;
$value =~ s/</</g;
$in{$comment} = $value;
}
#总的来说,从上面的if到这里为止,是辨认传输方式和读取拥护请求,然后解码
#定义变量
$action = $in{'action'};
$key = $in{'key'};
$fangshi = $in{'fangshi'};
$comment = $in{'comment'};
$page = $in{'page'};
$id=$in{'id'};
#for条件语句
for($i=0;$i<$pageview;$i++)
{
$reply[$i]=$in{$i};
}
if($action eq "add") #判断动作行为
{
&add;#调用add子程序
exit;
}
# 添加子程序add
sub add
{
if(($fangshi eq "") || ($comment eq "")) #检查用户输入是否为空
{
&message("非法操作,请填写完整!");#调用message子程序
print "2秒后自动返回....";
print "<META HTTP-EQUIV='Refresh' Content=' 2\;URL=$url'>";
exit;
}
#定义时间变量
$ltime=localtime(time);
($day,$month,$dayofmonth,$time,$year,$date3)=split(/\s+/,$ltime);
$mon=$mon+1;
@date4=("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
$day=sprintf("%04d年%02d月",$year,$mon);
($dayofmonth="0".$dayofmonth) if ($dayofmonth<10);
$date=join("-",$year,$month,$dayofmonth);
#join表示的是连接符号,"-"则用-来连接年-月-日等
$date=$date." ".$time." ".$date4[$date3]." "."IP:".$ENV{'REMOTE_ADDR'};
#变量过滤
$comment=~s/ / /g;
$comment=~s/\n/<br>/g;
$templine=join("\|",$fangshi,$comment,$date);
#打开guestbook.dat文件
open (FILE,">>guestbook.dat");
print FILE "$templine\n";
#关闭文件
close (FILE);
&view;#调用view子程序
exit;
}
if($action eq "view")
{
&view;#调用view子程序
exit;
}
# 添加子程序view
sub view
{
if (-e "guestbook.dat")
#-e参数表示正在检查文件guestbook.dat是否存在
{
open (FILE,"guestbook.dat");
@lines=<FILE>;
close (FILE);
$counter=@lines;
@lines=reverse(@lines);
if( $pageview*($page-1)>=$counter)
{
if(@lines==0)
{
open (FILE,">guestbook.dat");
print FILE "供|我公司常年供应缸套系列产品<br>|2002-Jun-20 15:32:11 星期日 IP:169.254.116.155\n";
close (FILE);
&view;#调用view子程序
exit;
}
&message("非法操作,指定页不存在!");
print "2秒后自动返回....";
print "<META HTTP-EQUIV='Refresh' Content=' 2\;URL=$url'>";
exit;
}
#定义变量
$page=1 if ($page eq "");
$left=$counter%$pageview;
$pages=($counter-$left)/$pageview;
($pages++) if ($left!=0);
#条件语句if
if($page == $pages)
{
$begin=$pageview*($page-1);
$end=$begin+$left-1;
$end=$begin+$pageview-1 if ($left==0);
}
else
{
$begin=$pageview*($page-1);
$end=$begin+$pageview-1;
}
}
else
{
open (FILE,">guestbook.dat");
print FILE "供|我公司常年供应缸套系列产品<br>|2002-Jun-20 15:32:11 星期日 IP:169.254.116.155 \n";
close (FILE);
&view;#调用view子程序
exit;
}
#以下都是很容易的,输出html代码,就是html代码
print "Content-type: text/html\n\n";
print '<html>
<head>';
print "<title>$title</title>";
print '<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char { font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
td,form,p{ font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
A:link {COLOR: blue; TEXT-DECORATION: none}
A:visited {COLOR:blue;TEXT-DECORATION: none}
A:active {COLOR:red;TEXT-DECORATION: none}
A:hover {COLOR: black; TEXT-DECORATION: underline}
</style>
</head>';
print "<body bgcolor=#ffffff topmargin=0>";
print " <p> </p>" if ($page==1);
print ' <table width="500" border="0" cellspacing="0" cellpadding="8">';
print "<form name=\"reply\" action=\"$url\" method=\"post\">" if ($key eq $passwd);
for ($count=$begin;$count<=$end;$count++)
{
($fangshi,$comment,$date,$reply,$date2)=split(/\|/,$lines[$count]);
print '
<tr>
<td>
<table CELLPADDING="8" CELLSPACING="2" BORDER="1" width="500">
<tr> ';
print '<td bgcolor="#ffffff" align="center" width="80">';
print ' <div align="right"><b>';
print "<a href=\"$url?action=delet&id=$count&page=$page&key=$passwd\">删除本帖</a> " if ($key eq $passwd);
print " <p>";
print ' 供求方式:</font></b></div>
</td>
<td width="300" bgcolor="#ffffff"><font color="#000000">';
print " $fangshi";
print '</font></td>
</tr>
<tr> ';
print ' <td bgcolor="#ffffff" align="center" width="80"> ';
print ' <div align="right"><b><font color="#000000">';
print ' 供求内容:</font></b></div>
</td>';
print ' <td width="300" bgcolor="#ffffff"><font face="Arial, Helvetica, sans-serif" color="#000000">';
print "$comment";
print ' </font><font color="#000000">';
print "<p align=right>$date</p>";
print '</font></p>
</td>
</tr>';
if(($key eq $passwd)||($reply ne ""))
{
print ' <tr>
<td width="18%" valign="top">
';
print ' </td>
</tr>';
}
print '</table>
</td>
</tr>
<tr bgcolor="#ffffff">
<td height="1"></td>
</tr>';
}
print '<tr><td>';
print '<a href=index.cgi title=管理员退出><font color=#9D9D9D>管理员退出</font></a></td></tr>' if ($key eq $passwd);
print "<input type=\"hidden\" name=\"page\" value=\"$page\"></form>" if ($key eq $passwd);
print '<tr><td><p align="right">';
print "第$page页 ";
for($count=1;$count<=$pages;$count++)
{
print " <a href=\"$url?action=view&page=$count\"><font color=#9D9D9D>$count</font></a>" if ($key ne $passwd);
print " <a href=\"$url?action=view&page=$count&key=4R6H8w9N3h\">$count</a>" if ($key eq $passwd);
}
print '</p><td></tr>';
print '
</table>
<p> </p>
</td>
</tr>
</table>';
print " <p><a href=\"$url?action=admin\"><font color=\"#000000\">管理员登陆</font></a></font></p>";
print '
<p align=right>
<font color="#999999" face="Arial">Power by cenliy</font>
</body>
</html>';
}
if($action eq "delet")
{
&delet;#调用delet子程序
exit;
}
#添加子程序delet
sub delet
{
if($key ne $passwd)
{
&message("密码不正确!");#调用message子程序
exit;
}
open (FILE,"guestbook.dat");
@lines=<FILE>;
close (FILE);
@lines=reverse(@lines);
$lines[$id]="deleted";
@lines=reverse(@lines);
open (FILE,">guestbook.dat");
foreach $temp (@lines)
{
$temp=~s/\n//g;
next if ($temp eq "deleted");
print FILE "$temp\n";
}
close (FILE);
$key=$passwd;
&view;#调用view子程序
exit;
}
if($action eq "admin")
{
&admin;#调用admin子程序
exit;
}
&view;#调用view子程序
#添加子程序admin
sub admin
{
print "Content-type: text/html\n\n";
print '<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char { font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
td,p { font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
</style>
</head>
<body bgcolor="#ffffff">
<div align="center">
<p> </p>';
print " <form name=\"admin\" action=\"$url2\" method=\"post\"><p class=\"char\">请输入管理员名称:";
print '
<input type="text" name="email" size="25" style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid rgb(0,0,128)">';
print " <p class=\"char\">请输入管理员密码:";
print '
<input type="password" name="key" size="25" style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid rgb(0,0,128)">
<p>
<input type="submit" name="Submit" value=" 确 定 " style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid">
<input type="reset" name="Reset" value=" 取消 " style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid">
</form></p>
<p> </p>
</div>
</body>
</html>';
}
#添加子程序message
sub message
{
my($info)=@_;
print "Content-type: text/html\n\n";
print '<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char { font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #00B000}
td { font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
</style>
</head>
<body bgcolor="#ffffff">
<div align="center">
<p> </p>';
print " <p>$info</p>";
print ' </td>
<p> </p>
</div>
</body>
</html>';
}