现在你的/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模块支持其运行。
不要着急。我们已经建立了系统,剩下的只是编码。
发布人:netbull 来自:Linux数据库应用指南