、留言板的制作

  • 格式:doc
  • 大小:626.00 KB
  • 文档页数:16

实例1:留言板的制作

我们的这个留言板由服务器端和客户端两部分构成。其工作过程是这样的:用户在Flash电影的第1帧中的输入文本中输入“姓名”、“留言内容”等,然后单击“发送”按钮发送留言,随后,在服务器端的CGI程序完成向数据库中追加;留言的处理后,用户会被带入到Flash电影的第2帧,在该帧中Flash会调用另一个CGI程序显示用户本次的留言和之前所有其它人的留言。

下面我们分别完成服务器端CGI程序和客户端Flash的开发。

1. 服务器端CGI程序的编写

服务器端有3个文件:一个用于把有Flash发来的留言内容写入文本数据库的CGI程序-----leaveword.pl,一个用于把文本数据库中的所有留言发送回Flash的CGI程序----leaveworddisplay.pl,以及一个用于保存留言的文本数据库文件----leaveword.log。

在这个留言板中,我们将收集用户的“姓名”、“来自地区”、“电子邮箱”、“个人网址”、“留言内容”5个信息。这些信息文本在文本数据库中的存储格式如下所示:

陈冰::青岛::icefall@::::这是一个测试。

我们将用::分割每个字段。因此,我们应该在把用户的留言内容提交的数据库之前,从所有5个信息中剔除可能存在的“::”以免让用户无意的输入给我们的数据库造成破坏。

首先,我们来看leaveword.pl的代码:

#!/usr/local/bin/perl

#调用readparse子程序对由Flash发送来的URL编码数据进行解码。

&readparse;

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

open(LOGFILE, "

#把所有留言读取到entries数组中。

#数组中的每个元素就是数据库中的一条记录,即一次留言信息。

@entries=;

close LOGFILE;

$arraylength=@entries;

#以追加方式打开leaveword.log,为把新的留言写入数据库做好准备。

open (LOGFILE, ">>cgi-bin/leaveword.log");

#因为在我们的文本数据库中是用::来作为字段分隔符的,因此需要将留言中所有的:都剔除。

#value数组中保存着已被解码的可用数据。

$value[0]=~ s/://g;

$value[0]=~ s/|//g;

#如果用户的某项信息没有输入内容,就用默认的“未填写”来代替。

if ($value[0] eq "") {

$value[0]="未填写";

}

$value[1]=~ s/://g;

$value[1]=~ s/|//g;

if ($value[1] eq "") {

$value[1]="未填写"; }

$value[2]=~ s/://g;

$value[2]=~ s/|//g;

if ($value[2] eq "") {

$value[2]="未填写";

}

$value[3]=~ s/http:\/\///g;

$value[3]=~ s/://g;

$value[3]=~ s/|//g;

if ($value[3] eq "") {

$value[3]="未填写";

}

else {

$value[3]="http://$value[3]";

}

$value[4]=~ s/://g;

$value[4]=~ s/\n//g;

$value[4]=~ s/|//g;

#如果有人恶意(或无意中)输入了大量的连续的英文、数字或符号,以致会破坏留言系统的格式化,那么就将这些东西剔除。

#这种[!-~][!-~][!-~]……处理机制主要是用于在HTML页面中显示内容时防止数据库格式被恶意破坏的。

$value[4]=~ s/[!-~][!-~]~~//g;

if ($value[4] eq "") {

$value[4]="未填写";

}

#用::来把数组中所有元素连接成一个字符串,再把这个字符串赋给变量newline。

$newline=join('::',@value);

#得到用户提交留言的时间。

($sec, $min, $hour, $mday, $mon, $year, $wday, $ydat, $isdst) = gmtime();

$mon++;

#处理千年问题。

$year=$year+1900;

#从gmtime()函数中得到的是格林威治时间,因此需要计算出北京时间(北京在时区上位于东八区)。

if ($hour>=0 && $hour<=15) {

$hour=$hour+8;

}

else {

$hour=($hour+8)-24;

$mday=$mday+1;

}

if ($mon<10) {

$mon="0$mon"; }

if ($mday<10) {

$mday="0$mday";

}

#将用户提交留言的时间以追加方式写入数据库中。

print LOGFILE ("$year$mon$mday");

print LOGFILE ("::$hour时$min分::");

#将用户的留言信息以追加方式写入数据库中。

print LOGFILE ("$newline");

#为能够用哈希方式处理数据库提供一个关键字hashkeyN,使用哈希方式能够极大的提高搜索数据库时的速度。

if ($arraylength == 0) {

print LOGFILE ("||hashkey1\n");

}

else {

$lastentries = $entries[$arraylength-1];

$hashkeynext = substr($lastentries,length($lastentries)-2,1);

$hashkeynext++;

print LOGFILE ("||hashkey$hashkeynext\n");

}

#关闭数据库。

close LOGFILE;

#向客户端发送回一点数据,以便客户端的LoadVar对象有点东西可装载。

#从而可以判断出向数据库中写入数据的工作是否已经完成。

print "finish=1";

#readparse子程序的作用是对从QUERY_STRING环境变量或标准输入中获取的URL编码数据进行解码。

#解码后的数据被存放在value数组中。

sub readparse {

read(STDIN,$user_string,$ENV{'CONTENT_LENGTH'});

if (length($ENV{'QUERY_STRING'})>0) {$user_string=$ENV{'QUERY_STRING'}};

$user_string =~ s/\+/ /g;

@name_value_pairs = split(/&/,$user_string);

foreach $name_value_pair (@name_value_pairs) {

($keyword,$value) = split(/=/,$name_value_pair);

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;

push(@value, "$value");

$user_data{$keyword} = $value;

if ($value=~/