MySQL和Perl诞生已有相当长时间,尽管"时尚"不停变化着,他们仍然被广泛使用。本文讨论如何将两种工具结合在一起应用于Ineternet及局域网上。文中的例子编写于Unix系统,当然它同样可以应用于其它广泛使用的系统中。
本文对这对组合的应用作有限讨论,讨论其易用性,速度,可靠性,安全性等。
本文并不是一篇MYSQL或Perl的教程;也不是一篇对MYSQL或Perl的评论。
我们将看到如何结合使用MySQL与Perl,不要忘记:"there is more than one way to do it"。
What about this nice pair ?
MySQL是一种关系型数据库系统(RDBMS),其主页为http://www.mysql.com/。它由GNU GPL发布并供免费使用,请注意阅读版权声明。 它可以在许多平台上工作,既作服务器同时又是客户端。除MySQL之外还有一些其它的自由软件性质的RDBMS,在这里不作任何比较,本文仅讨论MYSQL。我们也不将其与那些大型商业数据库像 Informix,Oracle,Sybase等作比,有足够理由相信MySQL是Internet上使用最广泛的数据库系统之一。在这篇文章里我们使用的MySQL版本是3.23.36。现在的稳定发行版本是3.23.46,而苦苦等待的4.0版仍在测试之中。人们可以从网上下载到它们的源代码或包文件。
为了将MySQL与Perl结合使用,你还需要些东西: Perl DBI模块。至少你应该下载DBI, Msql-Mysql-modules, Data-Dumper和Data-ShowTable等。
本文不介绍它们的安装过程,因为那很简单,同时包中的说明文件已经提供了你需要知道的所有内容。
Perl全称是实用摘录与报告语言(Practical Extraction and Report Language)。 最初它用于文件处理(分析,摘要...),很快它的功能就有了扩展。 你几乎可以用它来做任何任何事情:系统管理,CGI脚本程序以及数据库接口程序。
Perl包含于许多(如果不能称是全部的话)Unix发行版本中,它们中有些是免费的,有些不是。本文写作时,稳定的版本是5.6.1,版本5.7.2在测试中。本文采用的是5.005_03,很不错的一个版本,尽管老点。如果你的机子还没有装Perl,你可以从http://www.perl.com/下载。Perl提供了许多模块,用它们几乎可以完成任何事,你可以从这个网站的CPAN栏目找到它们。
最后一点,为了让这两种软件真正开始工作,你还需要一个web服务器。Apache应该是一个不错的选择,它集成于多种Unix系统中。如果你还没有,可以到http://www.apache.org/下载。
使用的范例
你也许已经注意到LinuxFocus杂志有多种语言的版本。这就意味着作为编辑需要同时管理新文章以及它的译文版本。一般情况下,我们可以看到大约200篇文章,平均每篇文章有5个语言的版本,这样产生了大约1000篇文章并且还在继续增长!这些文章需要被存档,格式标准化,总结及摘要.....应该怎么做这些事?当然,用Perl!
我们的总编Guido Socher编写的许多perl程序使我们的工作变的简单了许多,他写过一本三部头的 Perl教程和一本评论Perl的书。参照本文末尾的参考文献部分。
Javi,我们的西班牙编辑,用Perl编写了一个程序来管理翻译进度。
Atif是我们的明星作者,他来自perl王国,所以他的母语就是Perl。 他同时也撰写关于MySQL方面文章,致力于一个WEB管理工具改进工作。同样你可以在参考文献部分找到他。
总之,如果你在寻找一个Perl世界,加入LinuxFocus。
我是LinuxFocus法文版的编辑之一,我更懒,于是创建了自己的LinuxFocus数据库,猜猜用什么: MySQL 和Perl!
建立数据库
首先你应当已经正确安装了MySQL,并配置好用户密码。关于安装并不是本文讨论的内容,MySQL自带的大量文档已经描述了所有细节。
用mysql.server启动MySQL服务器,这个命令同时调用 safe_mysqld 守护进程,因此你可以给它传参。
用
mysql -h host -u user -p
连接到服务器,如果服务器就装在你本机上,就不用加参数 -h host。输入密码无误后,你将连接到服务器。现在可以建立自己的数据库了。
在mysql命令提示符状态下输入
CREATE DATABASE lf;
,这个是我们的示范数据库(lf代表LinuxFocus),你可以根据你的需要命名成别的。接下来就是给用户授权了,当然首先你要有足够的权限(你需要用有administrator权限的用户连接)。如果需要让某个用户管理数据库,通过GRANT ALL ON lf.* TO username;
给他授权。输入USE lf
选择刚才创建的数据库,并创建一张表。在这里我们创建的表是trissue,命令格式为:CREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));
通过下面的命令可以检查一下我们刚才创建的表内容是否正确USE lf
SHOW TABLES;
DESCRIBE trissue;
下面我们需要在表中填入数据,往一张空表中导入数据的最简单的方法就是使用一个带TAB分隔符的文本文件。如果文本文件已经准备好,输入
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
如果你的文本文件没有问题,那么现在这张表就已经填好数据,你可以通过输入以下命令检验一下:SELECT * FROM trissue;
这将导致显示一个很长的列表。现在,你就可以进行查询来获得任何类型的数据了。ok,到现在为止,我们仅仅用了MySQL,就可以做任何事情,那么,用Perl来做什么?
Perl的工作
Perl可以帮助我们自动进行查询,将结果显示到一个WEB浏览器上,等等。重复一遍,首先需要为Perl安装正确的模块使之能与MYSQL联合工作。
现在我们用Perl来写一个CGI脚本。它的作用是将Perl与HTML技术结合以实现查询数据库并将结果格式化输出。
我们用一个简单的脚本来查询某一作者的所有文章,显示文章的编号,分类,标题,不同语言版本的翻译者的姓名,发表文章的杂志期号。
你可以将这个脚本当作一个模块使用,但是注意这个例程并不是一个非常可靠的程序。你可以从下面的链接下载到一个有详细注释的版本。=>here<=.
#!/usr/bin/perl -Tw
# First, we say this is a "Tainted" Perl script.
#
# This is a comment
# db consult
#
# We use the Perl DBI module
use DBI;
# As cgi :
use CGI qw(param());
print <<END_of_start;
Content-type: text/html
<html>
<title>LFAuthors main db</title>
<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">
# Here comes the button's title for the launching page
<input type="submit" value=" LFAuth ">
</form>
</TD>
</TR>
</TABLE>
<center><H2>Search by author</H2></center>
<form action="/cgi-bin/lf.cgi" method="get">Author name : <input
type="text" size="30" name="author"><input type="submit"
value="Search..."></form></center>
END_of_start
if (param("author") ne '') {
$author = param("author");
$autsrch.='"';
$autsrch.=$author;
$autsrch.='"';
# We connect to the database named lf as user doe
$dbh = DBI->connect("DBI:mysql:lf","doe",'');
$sth = $dbh->prepare("
select *
from trissue
where
author = $autsrch
");
$sth->execute;
print <<END_suite;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
END_suite
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";
} else {
# DB Connect
$dbh = DBI->connect("DBI:mysql:lf","doe",'');
# Search
$sth = $dbh->prepare("
select *
from trissue
");
$sth->execute;
# Display result
print <<SUITE;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
SUITE
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
}
print end_html;
$sth->finish;
# Disconnect
$dbh->disconnect;
exit;
![query](https://i-blog.csdnimg.cn/blog_migrate/1fecc6796a8e53298f631f7762a8e90c.jpeg)
安全方面
如果你想为你的网站加上数据库支持,你显然要考虑安全性的问题。这里我们并不提供一个方案去按部就班的解决WEB服务器或数据库服务器安全问题,然而有一些基本的原则还是需要注意的。
简单点说,当你想在WEB服务器上提供其它功能时,首先需要考虑的是WEB服务器的安全性。这与本文的主题无关,有很多文档讨论了这方面内容。一个比较好的去处是 the Linux Documentation Project.
接下来的一步跟你的数据库服务器有关。在安装一些工具软件比如MySQL,不要忘了阅读软件手册中关于安全性的部分。再重复一下关于用户密码的基本原则:不要让任何帐号没有密码,特别是数据库的root帐号(这个跟计算机的root帐号是不同的)。另一个要点是权限的设置:绝不要将所有帐号都赋予完全控制的权限。这样做显的很普遍,因此人们通常会忘了这一点。
此外,还可以试试chroot数据库。你可以看看这一期里Mark的文章 他讲的是另外一个数据库但这些内容可应用到MySQL中。
另一个安全措施涉及到数据的传送过程。在一个管道(tunnel)里接收和发送数据是个不坏的主意。参考Through the tunnel。
最后但仍是重要的一点,编写安全的程序。 Perl是一种伟大的语言,但在编写程序的过程中经常容易出错。另外一篇LinuxFocus文章将教你如何做,特别是用Perl的时候。 看看这篇文章. 这是"编写安全的程序"系列的最后一篇文章,专门谈到了有关CGI脚本的问题。(必读!)
当然,我们首先假定了在这一些措施之前你已经拥有一个很坚固的系统,没有那些著名的漏洞,已经安装了最新的补丁,以及其它一些必备的安全工具,比如NIDS(Network Intrusion Detection System)的snort(from http://www.snort.org/), 防火墙,端口与安全扫描工具(nmap, nessus)等等。
如果你经济上能够承受,你可以在别的一台计算机上安装服务器:这样,就有了一个单独的WEB服务器,一个单独的数据库服务器...以及镜像服务器,以此来获得高可靠性。警告:为保证安全所做的工作永远不会结束,永远不可能有真正的安全。你只是试图去减少危险,每天它们都变得更加危险。
其它
因为"There Is More Than One Way to Do It",你可以选择你的方式。现在有许多种RDBMS,以及许多种与之相关的语言。写这篇文章是为了展示MySQL与Perl是如何出色的合作。
当然,这种选择带有明显的主观性:我喜欢MySQL,因为它小,可以在许多系统上运行,速度快,可靠...我也非常欣赏MySQL组的工作,不会忘记众多的投稿者。我最为欣赏的是:他们并不是在做重复性的工作(在此之前已经有商业软件的解决方案),而是让事情变的更加简单。
关于Perl,要说的都说了。还要补充一些:我相信没有它你是无法工作的,不管你是一个网管还是一个程序员还是做别的工作。 Perl公社(the perl community)是世界上最大的资源交流地之一。有一本叫做Perl Journal的杂志,现在是SysAdmin杂志的一部分,每期两篇文章,你可以到http://www.samag.com/订阅。
一些题外话: LinuxFocus的读者们也许没有注意到与本杂志相关的一些人,然而我们却可以看到LinuxFocus杂志各种语言的版本。有没有注意到一些小组 ,他们也许只有一两个人,却完成了大量的工作。他们是网站维护者,译者,等等。看看俄文组,土耳其语组,你会发现多数文章都是由Kirill或Erdal翻译。看看葡萄牙语组或阿拉伯语级,同样如此!这些人干了多么了不起的工作,我要向他们表示祝贺!感谢各位! 自由软件世界应当向你们致谢。
抱歉这些跟本文的主题无关,但我相信这些是值得一提的。
回到文章当中来,让我以一段关于自由软件的文字来结束本文。应当感谢那些工作于MySQL和 Perl的人,他们向我们提供了许多伟大的工具,并且多数是免费的。这些工具与真正的商业 产品相比也毫不逊色(如果不能比它们出色的话)。它们经常更新,附有详细的文档,你可以 把它们用于几乎所有Unix系统中。你能找到同样出色的别的软件吗?我想不能!
这篇文章可能没有教你多少东西,但是如果它使你觉得有必要试试这些软件,它就是有用的。
我们不是生活在一个伟大的时代?
参考
Perl.org
cpan.org, Perl文档中心
Guido的Perl教程:
Perl I
Perl II
Perl III
专业Perl编程书评
Perl Programming
Atif的MySQL管理工具
LinuxFocus杂志的MySQL评论: 老文章,但还可一读
MySQL
LinuxFocus上的一篇较老的SQL教程
SQL Part I
SQL Part II
(转贴自www.linuxfocus.org,by Georges Tarbouriech )