Perl和MySQL创建留言板

在互联网的早期,留言板是一种流行的在线交流方式。尽管现在社交媒体和论坛已经取代了留言板的许多功能,但创建一个留言板仍然是学习数据库编程的好方法。本文将介绍如何使用Perl和MySQL创建一个留言板程序。

为什么选择Perl和MySQL

Perl是一种强大的脚本语言,它提供了丰富的文本处理功能。而MySQL是一个流行的开源数据库管理系统,它支持大量的数据存储和查询操作。将Perl和MySQL结合起来,可以创建出功能强大的Web应用程序。

留言板程序的特点

这个留言板程序具有以下特点:

  • 分页显示留言,每页显示10条留言
  • 留言数据存储在MySQL数据库中
  • 显示留言者的姓名、地点、电子邮件地址、网址和留言内容,同时记录留言者的IP地址

MySQL客户端配置文件

为了从Perl脚本连接到MySQL服务器,需要提供有效的MySQL用户名、密码和主机名(以及其他信息)。出于安全考虑,选择将这些数据项存储在Web服务器文档根目录之外的文件中。将这个文件夹命名为includes。例如,如果文档根目录位于/home/joeuser/www/,会将文件存储在/home/joeuser/includes/。无论决定将其放在哪里,必须在实际脚本中指定它的路径。

这个文件的名称是perlgb.cnf,它必须具有以下格式:

[client] host=localhost user=your_username password=your_password

通常,host是localhost,除非连接到一个单独的数据库服务器。user是MySQL用户名,password是MySQL密码。必须编辑这些值以适应配置。

perl_gb MySQL表

perl_gb表包含与留言板条目相关的所有数据。表包含以下字段:

  • message_id:一个唯一的、自动递增的、非空整数
  • post_date:留言发布日期和时间
  • first_name:留言者的名
  • last_name:留言者的姓
  • city:留言者居住的城市
  • state:留言者居住的州
  • country:留言者居住的国家
  • email_addr:留言者的电子邮件地址
  • url:留言者的URL(可选)
  • ip_address:远程用户的IP地址
  • comments:留言者留下的评论

注意,除了url字段外,所有字段都是必填的。

脚本

接下来的部分解释了如何使用DBI在MySQL中检索和存储数据。

要连接到MySQL,使用DBI->connect()方法。

连接参数:DBI需要四个连接参数来连接到MySQL:用户名、密码、主机和数据库名称。前三者将从MySQL客户端配置文件perlgb.cnf中获取。必须在脚本中指定数据库名称,如下所示:

my ($host_name, $user_name, $password) = (undef, undef, undef); my ($db_name) = "your_db_name";

在指定连接参数后,下一步是构建数据源,由代码中的$dsn变量表示。使用的数据库引擎类型决定了数据源的格式。

注意:DBI的首字母大写与否不重要,但mysql必须是小写。

my ($dsn) = "DBI:mysql:$db_name"; $dsn .= ":hostname=$host_name" if $host_name; $dsn .= ";mysql_read_default_file=/path/to/perlgb.cnf";

如果不指定主机名,MySQL默认为localhost。注意,在最后一行,必须指定perlgb.cnf文件的路径。

my (%attr) = (RaiseError => 1); my ($dbh) = DBI->connect($dsn, $user_name, $password, \%attr);

如果调用connect()成功,将返回一个连接句柄。按照惯例,将其命名为$dbh。可以使用这个句柄来运行数据库中指定表的查询。

要从MySQL检索数据,必须创建一个语句句柄。按照惯例,在代码中将其命名为$sth。将SQL SELECT查询传递给$dbh->prepare()将返回一个语句句柄供使用。必须调用$sth->execute()才能实际运行查询。在下面的例子中,正在计算perl_gb表中留言板条目的总数。

my ($sth, $count); $sth = $dbh->prepare(qq{ SELECT COUNT(message_id) FROM perl_gb }); $sth->execute(); $count = $sth->fetchrow_array(); $sth->finish(); $count = "(Couldn't obtain count)" if !defined($count);

调用$sth->fetchrow_array()返回查询返回的第一行。在这种情况下,查询只返回一行和一个字段,所以可以将值存储在标量而不是数组变量中。如果查询返回了多于一个字段的行,将不得不将行存储在数组变量中。

要检索多行,必须在循环中调用$sth->fetchrow_array()。fetchrow_array()将在没有更多行要返回时返回undef。$sth->finish()释放了刚刚运行的查询相关的任何资源。

使用DBI插入数据很简单。为此,使用do()方法。do()方法准备语句并执行查询,所有步骤都在一步中完成。这使能够跳过使用语句句柄的步骤。do()返回传递给它的查询影响的行数。

my ($myQuery); $myQuery = "INSERT INTO perl_gb (first_name,last_name,city,state,country,email_addr,url,ip_address,comments)"; $myQuery .= " VALUES ($first_name, $last_name, $city, $state, $country, $email_addr, $url, $ip_address, $comments)"; my ($rows) = $dbh->do(qq{$myQuery});

脚本的其余部分是简单的Perl。代码没有什么复杂的,所以不会再进一步讨论。

限制

  • 专为MySQL设计:使用了MySQL特定的SQL扩展,所以如果不进行修改,它不会在其他数据库上运行。
  • 专为Unix/Linux设计:但是,稍作修改后,它也可以在Windows机器上运行。
  • 没有管理面板:满足于手动修改样式。然而,如果有足够需求,将构建一个管理面板。

书籍:

  • Christiansen, Tom, and Nathan Torkington. Perl Cookbook. Sebastopol, CA: O'Reilly & Associates, Inc., 1998.
  • DuBois, Paul. MySQL. Indianapolis, IN: New Riders Publishing, 2000.
  • Schwartz, Randal L., et al. Learning Perl on Win32 Systems. Sebastopol, CA: O'Reilly & Associates, Inc., 1997.
  • Wall, Larry, et al. Programming Perl. Sebastopol, CA: O'Reilly & Associates, Inc., 1996.
  • CPAN
  • DevShed Forums
  • Perl.com
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485