在互联网的早期,留言板是一种流行的在线交流方式。尽管现在社交媒体和论坛已经取代了留言板的许多功能,但创建一个留言板仍然是学习数据库编程的好方法。本文将介绍如何使用Perl和MySQL创建一个留言板程序。
Perl是一种强大的脚本语言,它提供了丰富的文本处理功能。而MySQL是一个流行的开源数据库管理系统,它支持大量的数据存储和查询操作。将Perl和MySQL结合起来,可以创建出功能强大的Web应用程序。
这个留言板程序具有以下特点:
为了从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表包含与留言板条目相关的所有数据。表包含以下字段:
注意,除了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。代码没有什么复杂的,所以不会再进一步讨论。
书籍: