网络数据库教程-第三天
一、第三天
网络数据库是一个很大的课题,用一个5天的教程不可能谈到所有的内容。我为你教授基础的知识,剩下的就要靠你自己在实践中体会和学习。
在本教程中我们只有时间讲解于网络数据库有关的设置问题。
Apache
Apache网络服务器 是一项性能相当不错的软件。简单地说,它的目的就是让用户能从你的计算机中请求网络信息。通常这些信息是HTML网页和图象(GIF和JPEG图象),但是现代的网络服务器都支持CGI (网络编程)。
这是Apache简单版本的功能。对于特定的应用,你需要对其进行设置,让其真正发挥功能。
Apache的功能实际上非常强大,你可以对其进行多种设置,执行多种功能。但现在我们只能讲解有关网络数据库的设置。今天所讲的需要和Apache其他的文献或我们在这里使用的软件包一起应用。
二、常规的Apache设置
进行常规Apache设置:
选择DocumentRoot子目录
ePerl
mod_perl
DocumentRoot概念比较容易理解。假设我们设立了域www.example.com。而URL可能如下所示:
http://www.example.com/webmonkey/day3.html
我喜欢将我的DocumentRoot设置为/web/docs/,这样以来,相对应于该URL的文件将是/web/docs/webmonkey/day3.html.
假设你按照我昨天的课程中的建议安装了Apache,则你需要编辑/usr/src/apache_1.2.6/conf/srm.conf将DocumentRoot设置为/web/docs。 (编辑方法很简单,你一看就知道该怎么做。你还需要相应改变/usr/src/apache_1.2.6/conf/access.conf. (也不难)。在Unix提示符下,注意一定要实际建立该DocumentRoot子目录:
mkdir /web; mkdir /web/docs
Perl和ePerl (将是明天的主要课程内容),和mod_perl一起就可建立起世界一流的数据库支持下的网站。缩头的课程中我建议你们使用了mod_perl的自动Apache创立功能,所以现在你应该有了这样一个文件 /usr/src/apache_1.2.6/src/httpd。
接下来,你应该:
第1步:建立/usr/src/apache_1.2.6/src/httpd和/usr/sbin/httpd之间的标志性链接。
建立标志性链接的意义是:你的Linux操作系统希望httpd放置在/usr/sbin子目录中,但是以后对httpd的任何重新的设置将把它该在/usr/src/apache_1.2.6/src下。整个特点使你无需每次将httpd拷贝到/usr/sbin下。
cd /usr/sbin
ln -s /usr/src/apache_1.2.6/src/httpd httpd
第2步:检查确保拟定设置中包括了mod_perl。
现在我们做一个快速检查,键入以下指令:
/usr/sbin/httpd -v
屏幕将显示一条短信息:
Server version Apache/1.2.6 mod_perl/1.08.
第3步”设置你的/etc/rc.d/rc.M文件。
该文件和DOS的自动批处理文件(autoexec.bat)类似。它在你的Linux服务器启动时运行。确保使所有必要的重新都被初始化并在boot时能够正常运行。如果你的rc.M文件中没有以下设置,你应该加入:
# Start Web server:
if [ -x /etc/rc.d/rc.httpd ]; then
. /etc/rc.d/rc.httpd
fi
这些代码意思是说:Linux的启动过程将激活文件/etc/rc.d/rc.httpd的内容 (以启动你的httpd)。这时,屏幕应显示:
echo httpd
/usr/sbin/httpd -f /usr/src/apache_1.2.6/conf/httpd.conf &
或许你还没有整个文件,所以你需要生成该文件
第4步:使Apache能够处理CGI和ePerl文件。
现在你需要进行大量细节的设置。回到/usr/src/apache_1.2.6/conf子目录,然后:
在access.conf中,确保以加重字体(bold)加入下列文字:
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
order allow,deny
allow from all
现在,修改srm.conf:
DirectoryIndex index.iphtml index.cgi index.html
你还需要\"uncomment\" 某行,所以最后的设置为:
AddHandler cgi-script .cgi
在httpd.conf中,, 在区域之上加入以下文字:
Perlrequire /web/docs/startup.perl
PerlModule Apache::ePerl
SetHandler perl-script
PerlHandler Apache::ePerl
现在你的/web/docs子目录下需要一个startup.perl文件,你可以拷贝我的:
#!/usr/bin/perl
use strict;
use Apache::Registry;
use CGI;
use DBI ();
1;
缺省情况下,除了你指定的/cgi-bin/子目录之外,Apache不会允许CGI程序在任何其他子目录中运行,如果安全性是你的首要考虑,这一条很重要。但由于现在我们谈的是网络数据库编程,所以在第4步中的设置让Apache运行CGI程序在其他子目录中也能运行。
我们还告诉Apache遇到带有特殊后缀.iphtml的文件时应该怎么做。这种文件叫做内部剖析后的HTML文件。现在Apache知道应该将这种文件转交ePerl进行进一步的处理。最后。我们告诉Apache在服务器初始化之后立即运行文件startup.perl。该文件把几个非常有用的模块载入服务器内存,重要之后的程序需要使用这些模块时就 无需重新载入它们。
三、MySQL和整个数据库/服务器系统
在第1天的教程中,我了解了数据库服务器常驻内存并可以回应请求、存储数据、提供管理界面确保数据只能在授权范围内被处理。现在我们将使用MySQL来实践这些概念。
建立好你的MySQL后,你需要进行的设置比起对Apache的设置就少多了。执行完完整的MySQL安装过程(包括运行/usr/local/src/mysql-VERSION/scripts/mysql_install_db)后,还有一项工作需要执行:将其设置为常驻内存的守护程序。这个过程和我们对httpd的做法相同。编辑/etc/rc.d/rc.M 文件使其包括以下代码:
# Start mysql database server:
if [ -x /etc/rc.d/rc.mysql ]; then
. /etc/rc.d/rc.mysql
fi
生成相应的rc.mysql文件。非常简单:
/usr/local/bin/mysql.server start
当我使用MySQL时,我经常使用这两个程序:/usr/local/bin/mysql和/usr/local/bin/mysqlshow。你不需要键入所有这些内容,- mysql和mysqlshow就能够正常工作,因为/usr/local/bin是指令路径的环境变量的一部分。
让我们试一下:
rdice:# mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
这就是你应该看到的(假设你已经正确安装了Perl和Data::ShowTable)。这项输出项我们显示了:MySQL在最高级别上将数据安排到数据库中。上述两个显示由MySQL自动生成,每一项都有特殊用途:mysql被MySQL自己使用来生成程序自己的内部设置,test作为某种暂存区供所有用户使用,但是它没有任何安全防护机权限设置。也就是说,不要将任何重要信息放在test暂存区内。
我们再来一遍。但是这次我们将欲求mysqlshow告诉我test数据库中的内容:
rdice:# mysqlshow test
Database: test
+--------+
| Tables |
+--------+
+--------+
表格(Tables)是数据库中的下一级。你可以将表格想象为电子工作表:列(columns)代表数据域,而行(rows)则代表单个的记录。
从屏幕输出中我们可以看到test数据库是空的。我们将配合使用 mysql程序和MySQL并在数据库中放入具体的内容。
四、MySQL, SQL, DDL,和DML
同MySQL的互动交流指的是用它的语言SQL(结构化程序语言)。SQL一般划分为两部分,第1部分叫做DDL,即数据定义语言(data definition language),你用SQL这个单元告诉MySQL如何设立表格。还有一部分是DML,即数据控制语言( data manipulation language),这个单元用于从你的表格中获取数据。
这里是计划:我将启动mysql,生成一个表格,然后在表格中输入数据,然后检查我刚输入的数据。(我用加重体显示的文字解释各项指令的含义)
rdice:# mysql test
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 4 to server version:
3.21.28-gamma-log
Type \help\ for help.
mysql> create table albums ( 这里我在使用DDL
-> title varchar(100), 设置表格,在表格中
-> artist varchar(100), 我将存储一些
-> released date); 音乐资料
Query OK, 0 rows affected (0.07 sec)
现在是DML,用于告诉MyDQL在album中加入记录
mysql> insert into albums(title,artist,released)
-> values(\Selling England By The Pound\,\Genesis\,\
1973-01-01\);
Query OK, 1 row affected (0.08 sec)
这里是DML声明,它将使我看到我刚才加入的内容
注意*在SQL语言中指“所有列”
mysql> select * from albums;
+------------------------------+---------+------------+
| title | artist | released |
+------------------------------+---------+------------+
| Selling England By The Pound | Genesis | 1973-01-01 |
+------------------------------+---------+------------+
1 row in set (0.06 sec)
MySQL所认可的所有SQL的语法在MySQL文献中都有详细说明,你随时可以查阅。即使今天的课程也已经涉及了许多进出知识,所以你应该仔细研究一下它。
生成表格的级别语法是:
create table 表格名 (
列1 列1数据类型,
列2 列2数据类型,
...
列_x 列_x数据类型
)
各列可以使用的数据类型可以在MySQL文献中找到。在本例中我使用了\"date\"数据类型以及变量长度字符串。\"varchar\" 字符串的长度由预设的长度限制,在变量中,是100。
要结束mysql中的一个声明,你需要键入一个分号,然后回车。mysql将告诉你的“query(SQL中任何指令的术语)”状态,以及处理所用时间。
insert(插入)的语言更简单:
insert into 表格(列1,列2,...,列_x)
values(value1,value2,...,value_x)
字符串必须用引号圈起来。
select(选择)是SQL非常有用的声明,必要的时候,它的用法可能会非常复杂。
如果在该数据库中我存储了几百个音乐文件,而且我只想看一下有Genesis创作的作品,我就可以用select发出一个声明查询我所需要的内容:
select title, released
from albums
where artist = \Genesis\
order by released
这次我按名称圈定了我所感兴趣的列,而不是用* 通配符。命令行where artist = \Genesis\限制必须查询MySQL记录中由Genesis创作的作品,我还命令MySQL将该作曲家的唱片按照发行日期排序。
除了insert和select指令,还有两种基本的DML指令:update(更新)和delete(删除)。 update使你能够改变在表格行中存储的数据;delete使你能删除表格中的一行。
这些指令的使用范例:
我发现Selling England 的发行日期是2月1日而不是1月1日。所以我更新
我的记录:
mysql> update albums
-> set released = \1973-02-01\
-> where title = \Selling England by the Pound\
-> and artist = \Genesis\;
Query OK, 1 row affected (0.03 sec)
mysql> select * from albums;
+------------------------------+---------+------------+
| title | artist | released |
+------------------------------+---------+------------+
| Selling England by the Pound | Genesis | 1973-02-01 |
| Wind & Wuthering | Genesis | 1976-01-01 |
| We Can\t Dance | Genesis | 1991-01-01 |
+------------------------------+---------+------------+
3 rows in set (0.00 sec)
如果我认为我不喜欢Genesis ...
mysql> delete from albums where artist = \Genesis\;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from albums;
Empty set (0.00 sec)
使用\"update\" 和\"delete\" 指令时,你需要用where指明查询条件(否则你的表格中的每一行都会被修改或删除,你必须小心)
互联网中有一个很好的SQL教程,我建议仔细阅读该教程。它并不完全适用于MySQL,这是因为SQL也有不同的“方言”。该教程所讲的内容基本适用于MySQL,但有一些细微的区别,在MySQL的SQL文献中有具体说明。
今天的课程的最后,我们将再次研究一下mysqlshow:
rdice:# mysqlshow test
Database: test
+--------+
| Tables |
+--------+
| albums |
+--------+
rdice:# mysqlshow test albums
Database: test Table: albums Rows: 0
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| title | varchar(100) | YES | | | |
| artist | varchar(100) | YES | | | |
| released | date | YES | | | |
+----------+--------------+------+-----+---------+-------+
mysqlshow记录了我们在mysql中所作的一切工作。当你要求mysqlshow显示表格信息时,它并不告诉你在表格中具体有什么信息,它只是告诉你表格中目前有多少行,它告诉你的是表格的结构。我们已经了解了\"Field\"和\"Type\" ,其他的表格资料年可以从MySQL的文献中找到详细内容)。
五、我们不是在建立互联网站点吗,我是不是漏了什么东西?
我们现在已经了解了数据库的基本知识。下面我们的任务是将这些SQL技术应用到互联网中。我们将用DBI(Perl的数据库界面)实现这一目的。我将SQL语言直接写入ePerl程序中,并用Perl的DBI模块支持其运行。
不要着急。我们已经建立了系统,剩下的只是编码。发布人:Crystal 来自:LinuxAid