最近几天,
尝试创建了一个基于LAMP的cgi项目,说是项目,其实只是一个小玩具,不过麻雀虽小,五脏俱全,本人由此得到了不少的体会.
本着相互交流,相互促进的原则(communicate可是我博客的主题呢!),我把具体过程给予一定的整理,由此发布出来,相当于固化学习成果了.
版权声明:本文为原创,转载请遵循"保持署名一致,非商业使用"原则.
**
概述:**
LAMP是一套开源的强大工具,
本次通过创建网页查询,从数据库中查询出相应记录并在网页上展示出来.
涉及以下部分,近期将依次发布,敬请留意:
LAMP的安装和设置;
mySQL数据库的创建及数据导入;
使用CGI创建动态网页,对查询数据进行处理,返回查询结果.
==LAMP的安装和设置==
本人使用的linux发行版是Ubuntu
Feisty(7.04),在这个版本中可以一键完成整个系统的安装.整个过程在ubuntu
forum中有详述,在此不在赘述.
#在Apache服务器中进行cgi的设置.
在site-enabled的配置文件中,需要添加你的cgi脚本目录并给予相应的说明.
[code]
ScriptAlias /mycgi/ /var/www/cgi/
<Directory “/var/www/cgi/">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
[/code]
首先定义一下alias,这样在服务器上输入mycgi则会在/var/www/cgi/目录执行.
很简单.需要注意的就是相应目录的权限,要给所有人以执行的权利(755)
设置完成之后,注意重启apache服务器,
sudo /etc/init.d/apache2 restart
==创建mySQL数据库,并导入数据==
#数据的结构
我们要导入的是一个科技论文影响因子的列表,如下显示了它的结构:
每一行是一个记录,共有四栏column,栏间以”,“相隔,分别是缩写的标题,06,05,04年的impact
factor;
#创建数据库和导入上面的数据
注:shell>表示在命令行下输入的命令; mySQL>表示输入的sql命令;
shell>mysql -uroot -p
*****(root的密码)
mysql>create database test;
mysql>create table ifactor(
myid int(6),
title varchar(30) not null,
if04 float,
if05 float,
if06 float
);
mysql>alter table ifactor add primary key(‘myid’);
mysql>alter table ifactor change myid int(6) auto_increment;
数据库的结构如下:
mysql>load data local infile
‘数据文件的绝对路径,eg,/home/test/Desktop/if.txt’
into table ifactor(title,if06,if05,if04);
mysql>select * from ifactor limit 0,5;
至此,数据库建立完成.
#mysql查询,模式匹配简介
在mysql中可以使用两个命令进行模式匹配.一个是LIKE,一个是RLIKE(REGEXP);
前者使用”_“代替一个字符,"%“代替多个字符,RLIKE则使用扩展的正则表达式进行匹配.
如上第一条记录,可以写成:
mysql>select * from ifactor where title like ‘aap%bu%';
[后面必须有%,因为还有字符]
mysql>select * from ifactor where title rlike ‘aap.*bu’;
后面将要使用这个东西.
==使用DBI,CGI==
dbi和cgi是perl的模块, 因此使用dbi,cgi要对perl有所了解.
#建立cgi中使用的mysql账户(为了安全的考虑)
mysql>grant select on test.ifactor to test@localhost identified by
‘testpasswd’;
下面的代码只是其中的一部分,请确保你的代码前面几行是这个东西:
[code]
#!/usr/bin/perl -w
use DBI;
use use CGI ‘:standard’;
use strict;
[/code]
#创建DBI,mysql数据库连接
my $dbh = DBI->connect(‘DBI:mysql:people’, ‘apache’, ‘lampiscool’)
or die “Can’t connect: " . DBI->errstr();
#进行数据库查询
my $sth = $dbh->prepare(‘SELECT title,if04,if05,if06 FROM
ifactor
WHERE title RLIKE ? ‘)
or handle_error(“Can’t prepare SQL: " . $dbh->errstr(),
$dbh);
$sth->execute($query)
or handle_error(“Can’t execute SQL: " . $dbh->errstr(),
$dbh, $sth);
#对查询结果进行处理
my($title,$if04,$if05,$if06);
while (($title,$if04,$if05,$if06) = $sth->fetchrow()) {
print
“<tr><th>$title</th><th>$if04</th><th>$if05</th><th>$if06</th></tr>\n”;
}