[LinuxFocus-icon]
首页  |  站点地图  |  索引  |  搜索

新闻 | 过往期刊 | 链接 | 关于LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  Arabic  

Georges Tarbouriech
by Georges Tarbouriech
<georges.t(at)linuxfocus.org>

关于作者:

Georges先生使用Unix多年,他喜欢用自由软件方案来解决专业领域内的问题。


目录:

 

MySQL & Perl, 便利之合

MySQL and Perl

摘要:

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


 

安全方面

如果你想为你的网站加上数据库支持,你显然要考虑安全性的问题。这里我们并不提供 一个方案去按部就班的解决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  

对这篇文章发表评论

每篇文章都有各自的反馈页面。在这个页面里,您可以提交评论,也可以查看其他读者的评论:
 反馈页面 

主页由LinuxFocus编辑组维护
© Georges Tarbouriech, FDL
LinuxFocus.org

点击这里向LinuxFocus报告错误或提出意见
翻译信息:
en --> -- : Georges Tarbouriech <georges.t(at)linuxfocus.org>
en --> zh: yey <yeyxx(at)263.net>

2002-01-14, generated by lfparser version 2.23