网络数据库教程-第1日
一 网络数据库教程-第1日
二 设想访问你的站点的都是什么人
三 我的选择是什么
四 为什么要使用互联网
五 如何应用
--------------------------------------------------------------------------------

一、第一天

错误的技术被用于解决错误的问题

你可能会注意到现在有很多有关互联网的技术。但是,实际上这些技术中90%都是没有用的。我是说,如果它们有用的话,光是学习这些技术就会把你给累死。大多数的网络技术之所以不被人重视,我想是因为以下原因:

没有用,很漂亮很有趣,但没有什么意义。
不能通用于所有浏览器。例如,JavaScript 在不同的浏览器中会出不同的问题。更不用说ActiveX了。
速度慢、占用过多的带宽,没有到可以实际应用的地步。(任何一种技术...咳咳...包括 Java)
技术的失败并不使我感到惊奇。太多的人只是将精力集中在自己做的东西有多漂亮,却忘记了制作它是要用于什么用途。还有。许多技术必须是基于客户端的技术,当你必须依赖客户的要求来决定采用或者技术手段时,则不是一件容易的事。

好在互联网公众并不太关注这些好看但没有用途的东西。它他们希望互联网能为其提高特定的服务或娱乐,帮助他们获得工作甚至找到女朋友,检查银行帐户、股票价格、利率、订购机票等等等等。

要使互联网为你提供这些服务,你必须首先将相关的数据作出合理得力组织安排,并且随时可以将这些数据更新和修改。对数据的管理需要比较复杂的技术(但绝不是上面所说的无用的绣花枕头)。

二、设想访问你的站点的都是什么人

假设有一个公司叫做"Widgets Inc",我们看看对于不同的用户,它意味着什么。

顾客到网站检查他们发给该公司的订单的状况,同时还要看看该公司本周的产品报价和价格表。
销售代表来该网站浏览所收集到的订单,仓库存货、退单的情况,以及最新的促销奖励。销售代表很有可能直接从该网页中获得订购商品的订单。为什么可能呢?互联网为你提供了一切便利的条件。
经理从销售代表处获得总结报告(地区。季度、陆运、海运和空运)。
其他人也空运充该网站获益。供应商、零售商、投资者....机会无所不在。
或许Widgets Inc是一个具有深谋远虑的公司,所以他们准备了相应的技术和技术支持。有关他们的产品和服务的新闻甚至可以从互联网中直接发布给公众。在他们的网页中提供了内容丰富的动态信息,可以吸引每一个用户。

但是要使一个网站具备全面的能力,该网站海需要有完善的安全机制。这个机制基于用户名、口令等等。

让我们进一步假设:你的经理让你为一个重要的客户提供所有历史销售记录。则存储所有历史销售记录也必须是该网站所应具备的功能。

三、我的选择是什么

我架构了这个"Widgets Inc" 例子来说明数据在互联网中扮演的角色。将数据库集成到网站中在我所举的这个例子中具有非常强大的作用。显示中的例子比如互联网电影数据库。这种数据库加入只采用文本文件的形式组织这样一个灵活的数据库是不可能的。它需要有一个数据库。或者说它需要重新设计其外观和运行机制,它需要用新技术来更新。如果没有一个数据库系统或模板系统,这个工作将无法开展,因为你不可能将这个庞大网站的每一页靠手从键盘输入就架设起来。一个用途广泛动态的网站必须靠数据来支持,简单的网站中的数据只能供你浏览,而要提供网站和用户之间的互动浏览功能,则网站的架构就要复杂许多。更先进的网站可以实现用户和数据之间的互动,就需要使网站数据能够被添加、删除和修改。

现在我们谈谈网站数据的处理可能采取的结构:

无结构
这个主意很糟糕。只是一大把文本文件组成的网站不能满足复杂的功能。
有组织的文本文件:Delimited or fixed-width fields
这个主意稍好些,担它仍然存在很多技术问题。你必须无休止地加工数据或者必须牺牲用户介入的速度。数据的维护也将是一个很令人头疼的事。除了必须加入新数据,并且还得处理由于各种疏忽所造成的错误。你还必须编码以处理文件,处理锁定、只读、允许写盘和允许生成数据的结构以及数据之间的各种联系。这样做实在是太费事了。
标识语言:HTML, SGML, XML,
这种方法可以实现数据存放和牺牲的很多灵活性,但是你仍然必须建立非常系统的结构化的数据对象。有些语言Perl和Omnimark 在努力实现数据的结构化。很多语言恩公提供这些功能,但同时也得牺牲速度和简单性。
很多时候编制复杂的数据库常常使人们感到沮丧不已。而这也使得许多公司受到启发。他们制作出相应的软件帮助你处理这些问题,于是出现乐数据库服务器-database server。
你已经听说过这些名称:Oracle, Sybase, Microsoft SQL Server, Informix, Ingress. 这些程序提供了处理数据库非常好的结构:

它们将数据存储在表格(tables)中。 Tables的域可以包含许多种结构不同的数据类型,例如整数(integer)、字符串( character string)、货币(money)、日期(date)和二进制大型对象(Binary Large OBject-BLOB)。
它们提供乐管理表格的管理机制。
表格和管理机制通过复杂的用户/口令/域保卫机制保证数据的安全性。
你可以使用功能强大而且相对容易使用的语言同数据交流。例如SQL。而且。你可以将建立存储后的SQL声明,这样即使用户不懂这种语言也可以利用数据库。
数据库的优势还在于:已经有很多人在使用数据库。你会发现你所要放入你的数据库的很多数据已经具有乐某种数据库格式。你可以充分利用数据的现成结构。

四、为什么要使用互联网

在我上学的时候,教授曾经问过这样一个问题:为什么鲸鱼要生活在极地海洋?有一个同学回答说:因为鲸鱼块头太大了,它们的皮肤面积太大,保温的鲸脂层太厚以及因为它们的新陈代谢系统的原因。他总结说:如果鲸鱼不生活在极地海洋中,它们就会热死。

我的答案很简单:因为极地海洋中有它们所需要的足够的食物。

那么,你为什么要上互联网呢?因为互联网上有你的观众。那么观众为什么要上互联网呢?因为在互联网中可以找到他们需要的东西。

即使在一个公司内部的环境中,网络浏览器也是无所不在。它使得网络成为信息交流的方便途径。
浏览器可以移植。你不需要随身带着你的计算机和个人软件。只要有浏览器你就可以通过网络找到你的数据。
网络同数据的接口非常快,而且容易编程,即使同某些快速的开发语言例如Visual Basic相比也是如此。
你无需费心向你的用户(内部网络的用户还不算多,但外部网络的用户则无法用数字估量)分发专门用于你的数据库的软件。
你无需考虑为每个用户提供软件升级。只要你升级乐拟定服务器上的软件,则你的每一个用户都会获益。
你无需培训用户使用你的软件几乎所有上网的用户都知道如何使用浏览器及知道如何填写表单。
当然,一些专业技术例如Visual Basic或Visual C++, Powerbuilder或Developer 2000可以帮你生成数据库界面。但是我在前面的讨论中已经谈了这种制作方法的费时费力。所以我不打算教你用这些语言制作数据库。

五、如何应用

如何应用?这是一个很难用一句话就能回答清楚的问题。事实上,我需要把其余几天的时间都用来回答这个问题。

明天我将向你介绍目前可以应用的技术有哪几种。这里所说的技术包括操作系统,你可以用 Windows NT或Unixe的一种。接下来我们将可一下数据库、网络服务器和网络开发工具以及语言。检查完所有这些选项之后,我将以其中的一种为例向你介绍如何用它搭建数据库。

第3天的课程中我将集中谈两种软件:网络服务器(相对较简单)和数据库服务器(相对较难),什么是服务器,我如何利用服务器工作?这些问题都将得到回答。我还将揭示应用表格和SQL(结构化重新语言- Structured Query Language)的秘诀。

第4天的课程中我将讨论将数据库同外部网络集成的技术和技巧。

第5天将是第3和第4天课程的深化。其实我还需要在准备一次课程详细探讨目前所讲的概念。

你可以进入这些利用数据库搭建的网站了解一下我们所要讲解的什么。

互联网电影数据库
这个站点非常有趣。如果你项了解某部电影或某个演员,这个站点可以提供你这些信息。信息我,这个站点可不是用单纯的外部文件就能搭建起来的。
热联线成员中心
该站点处理数据的方式不是那么明显,但实际上,在这个站点中显示的页面只是一种"虚拟文件" - 它们看起来项网页,但实际上它们是用模板和数据库给拼出来的。
CD数据库
这个站点为那些播放在CD-ROM光驱中播放CD时懒得键入歌曲名称的人服务。

网络数据库教程-第2日
浏览: 292 次
一 确定系统类型
二 Windows NT和Linux的对比
三 安装Linux和相应软件
四 设定你的期望

--------------------------------------------------------------------------------

一、确定系统类型

Know your playing field

The story so far ...

现在我们已经懂得了人们需要什么:数据。而数据库是处理数据最好的途径。并且我们了解了网络对于数据库来说是一个了不起的界面。

那么,接下来我们需要了解数据库如何工作。

决策,决策...

我们是否应该使用Windows NT或UNIX类型的系统作为我们的互联网网络服务器平台?

在我们决定使用何种技术之前,我要提请你注意:生成数据库支持的网站绝不象编写HTML文件那样简单。这不仅因为数据库要复杂许多,而且因为它需要同互联网服务器集成应用。

要安装、配置和初始化网络数据库的技术,你必须是系统的管理员。在UNIX系统中,系统管理员用户叫做"root"或者有时候叫做"the superuser"。在Windows NT系统中,系统管理员就叫做"管理员"。

在某些提供免费主页存放的站点,例如Geocities, Angelfire或其他当地的ISP来说,他们能为你提供5到10Mb的空间,但目前他们还不允许你为自己的网页设立数据库管理机制。

所以,你必须主管一个系统来运行数据库。架设你现在就在管理一个系统,你需要选择用Windows NT系统和UNIX系统来建立你的数据库,该系统需要被细分为各个子目录。我将集中介绍每一种系统的规范设置。该设置包括一个操作系统、一个网络服务器、一个SQL服务器和一个网络开发工具。这些是你运行一个网络数据库的核心。

二、Windows NT和Linux的对比

Windows NT服务器4和MS IIS和MS SQL服务器以及Allaire Cold Fusion

Slackware Linux & Apache & TCX Mysql & Perl (带模块)
的对比

(注意:我在使用作为UNIX OS系统的代表,因为它比较便宜并且具有通用性。其他的UNIX平台的工作也比较好,但其中的某些命令可能和我在本文中用到的有些区别。)

Windows NT的优点

使用方便
Windows软件相对而言容易安装,它的界面直观,运行简便(我很喜欢SQL服务器)和ODBC(开放数据库互联-Open DataBase Connectivity)非常好用。
产品系列的稳定性
许多人都非常喜欢微软软件的稳定性和强大的功能。微软是一个能随时提供持续稳定的支持的公司。它的产品系列不会突然之间枯竭,你不用害怕自己用微软产品某一天找不到升级和更新的技术支持。微软还是技术趋势的领头人。很多人喜欢微软,因为他们都在用微软的视窗产品。
Windows NT的缺点

软件成本太高
要配备这个系统你需要花几千美元。而且其他和Windows相关的就是成本也很高。要配备这个系统,你先得准备好你的钱包。
"必须花钱的支持"是一个逆喻。使用商业软件的优点在于包括了技术支持。从使用角度讲,你所得到的支持从是离理想要差那么一点点。即使你
得到他们的技术支持,你也需要为此付出种种额外的费用。如果你真的发现他们的软件中存在某些问题,你要想让问题得到解决,可能得需要几周的时间。
功能不灵活
商业软件只能完成它既定的使命,除此之外,没有其他用途。如果你想获得什么特别的东西,你必须等待它的新版本面市。可能会在明年。
功能有限
商业软件的哲学就是:“保持它的简洁”。而这样以来,某些功能也过于简单,不能作进一步的开发。
Linux的优点
这种软件很便宜。
Linux整个系统只需花US$200。如果你只将其用于个人目的,你几乎不用花多少钱,但是你必须用你可怜的调制解调器从网上下载300 Mb的程序。而你付30美元就可以获得linux的发行版。另外,Linux带有很多你需要的工具(例如邮件服务器mail server, C/C++ 编译器等等),你无需在单买这些软件。
高性能软件
Linux、Apache、和Perl建立的系统速度快、稳定,可以开发出许多功能。还可以支持和结合超文本:Mod_perl将Apache附加到Perl上,DBI将Perl附加到数据库上,ePerl 可以随意处理网络编程模式......
Linux的缺点

心脏不好者慎用

一旦你掌握了Linux,在整个领域内你将无所不能。然而不幸的是,要掌握这门技术可不是一件容易的事。Perl, Apache,和Mysql也是如此。怎么说呢,天上不会掉馅饼。
艰难的说服过程
除非你所生存的空间不存在任何组织或者叫没有任何官僚体制,否则你必须说服你的上级去应用一种免费的系统。你的上级会反问你这样的问题:你怎么可以在工作中冒这样的险?免费的东西,会好使吗?
最后的赢家是...

在我看来呢,应选择Linux。在实际应用中,我采用两种方式。对于本教程来说呢,我们假设的是读者还没有建立自己的网络数据库系统。那么对于你们而言,你们希望采用免费的东西还是必须花大笔钱的东西?

还有许多使用免费系统的优点,在之后几天的课程中我将逐步谈到这些优点。

三、安装Linux和相应软件

如果你了解UNIX,你可以继续读下面的各段,否则,你需要:

 

买或借一本有关的好书。
为自己获得一个UNIX帐户,如果你是一个学生,这会比较容易。否则,你可以找提供UNIXshell介入服务的ISP。
花时间学习和使用它。
你需要获得一个Linux软件。我对Slackware很熟悉,所以我在此以它为例。但是Red Hat, S.u.S.E., 和Caldera也很不错。我建议你查询Linux Online。整个站点不仅告诉你各种Linux 软件的情况,而且还告诉从哪里可以找到他们。还有大量有关Linux的文献可供参考。

你还可以从CD-ROM中安装Slackware的Linux软件。最新的版本是3.4。不要用更低版本的东西。

你无需将你的计算机完全用于运行Linux;其安装选项可以让你选择"multi-boot" 来选择从Windows OS 或Linux来驱动计算机。你所需的只是将硬盘分区。你可以买一个新硬盘,或者使用分区工具。

安装Linux我有几个不成规矩的建议:

不要安装Perl。
不要安装Apache。
你肯定会需要这些,但是3.4版本的Slackware软件实际上还不是最新的软件。你可以从相应的站点下载最新版本http://www.perl.com/ and http://www.apache.org/。Perl的最新版本命名为latest.tar.gz,Apache的最新版本是1.2.6。它还有1.3版本,但这只是试用版。我们还暂时不需要它的新功能。

下载的过程中你可以顺便下载这些:

LinuxThreads
以下Perl模块,也是来自Comprehensive Perl Archive Network, 或称作CPAN,你可以在http://www.perl.com/ 找到:
Data-Dumper (在Data子目录)
Data-ShowTable (在Data子目录)
MD5
MIME-Base-64 (在MIME子目录)
CGI
libnet (在Net子目录)
libwww-perl (在LWP子目录)
最新版本的mod_perl。你也可以从CPAN获得整个软件,但你最好看一下mod_perl 的主页。
ePerl, "嵌入式(Embedded)Perl"语言。
Mysql数据库软件包。
你可能还需要获得Netscape的linux版本。
大部分的这些文件都是.tar.gz格式的文件。它是"磁带归档文件(Tape Archive)"格式的文件,它用GNU Zip进行了压缩。要解压缩这些文件,你需要使用

tar xvzf /path/to/file/file.tar.gz
只是假设在tar中已经包含了一个子目录。你可以检查一个子目录是否包含了

tar tvzf /path/to/file/file.tar.gz | less
我建议解压缩(un-tar.gz-ing)所有/usr/src 子目录中的文件,但ePerl, Apache, Mysql和mod_perl除外。这些文件需要扩展到 /usr/local/src中。还存在将这些文件放置到其他路径的可能性,我欢迎这些建议。

你需要重新建立Linux内核,例如包括对网卡的支持。这样做时注意按照README和INSTALL中的指南去执行。你还需要将你的内核更新到最新的版本,它可以从The Linux Archives获得。

我建议你按照的每种文件都带有如何编译的指南。如果你只了解Windows环境,可能你很少用到代码编译。依照README和INSTALL文件中的指南执行即可。

首先安装(不只是解压缩un-tar.gz,而是实际安装) Perl,接着安装LinuxThreads,然后是各种Perl模块。mod_perl的安装最简单,它将Apache在编译的同时即安装,所以你无需单独编译Apache,你只需处理Apache配置文件。

接下来安装ePerl。ePerl欲求两步不同的安装程序:第一种是将其作为独立的程序安装,然后作为Perl(和mod_perl)模块。第2步需要你重新处理Apache配置文件。

我详细介绍安装过程是因为出于我“痛苦”的经历。Mysql的运行需要LinuxThreads的支持。而LinuxTheads需要Perl,Mysql也需要Perl和Data-ShowTable模块的支持。Mod_perl需要Apache 和libwww-perl,而Libwww-perl需要libnet。

四、设定你的期望

要将这一切组装在一起要花将近一天的时间,而这也是因为我已经重复这样的过程不下10次。第1次安装需要花1周的时间,而且那时候没有人给我任何指南。

我还不能说最坏的情况已经过去。明天我们还必须处理网络服务器的配置(configurations)和Mysql数据库引擎。最麻烦的事情便是细节的处理...

网络数据库教程-第3日
浏览: 356 次
一 网络数据库教程 - 第三天
二 常规的Apache设置
三 MySQL和整个数据库/服务器系统
四 MySQL, SQL, DDL,和DML
五 我们不是在建立互联网站点吗,我是不是漏了什么东西?

--------------------------------------------------------------------------------

一、第三天

网络数据库是一个很大的课题,用一个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)加入下列文字:

<Directory /web/docs>

Options Indexes FollowSymLinks ExecCGI

AllowOverride None

order allow,deny

allow from all

</Directory>
现在,修改srm.conf:

DirectoryIndex index.iphtml index.cgi index.html
你还需要"uncomment" 某行,所以最后的设置为:

AddHandler cgi-script .cgi
在httpd.conf中,, 在<VirtualHost>区域之上加入以下文字:

Perlrequire /web/docs/startup.perl

PerlModule Apache::ePerl

<Files ~ ".+/.iphtml$">

SetHandler perl-script

PerlHandler Apache::ePerl

<Files>
现在你的/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模块支持其运行。

不要着急。我们已经建立了系统,剩下的只是编码。
网络数据库教程-第4日
浏览: 282 次
一 网络数据库教程 - 第四天
二 ePerl - Perl和HTML的结合
三 DBI - Perl的数据库接口
四 前景 ...

--------------------------------------------------------------------------------

一、 第四天

嵌入式网络编程理念

几年前,网络编程起始于公共网关接口(Common Gateway Interface)简称CGI。CGI的基本概念如下:

当一个用户发出一个CGI请求时,URL将加入一些信息让服务器将其按照CGI请求进行处理。URL加入的信息形式可能如下:
用户请求的CGI一般在/cgi-bin/ 子目录:http://www.somewhere.com/cgi-bin/某个CGI程序
网络服务器的配置可能会自动将某些文件的扩展名识别为可以执行的CGI程序:http://www.erehwon.org/gosearch.py.py 通常被理解为Python程序,这是另外一种很流行的网络编程语言。
文件的扩展名可能直接采用CGI作为扩展名:http://www.xyz.net/dosomething.cgi
在这些情况中,网络服务器将用户请求交给URL指定的程序进行处理,并提供相应的信息:通常是环境变量和标准输入(STDIN)。
然后程序开始运行,生成子进程并生成相应的信息,然后将其发送给标准输出(STDOUT),通常程序会生成一个尽可能简短的HTTP头信息,作为其输出的一部分。
网络服务器将“捕捉”到的捕捉输出流发通过网络送给用户。用户的浏览器根据HTTP头将其进行翻译,其结果通常是HTML文本,但是CGI程序也可以很容易地生成字节流最后将其还原为JPEG图象或RealAudio节目。
标准的简单C程序如下:

#include <stdio.h>

int main () {

print("Hello, world!/n";

}
我可以很容易地将其转化成CGI程序,只需加入一个HTTP头。

#include <stdio.h>

int main () {

print("Content-type: text/plain/n/n";

print("Hello, world!/n";

}
下面所需作的只是编译代码,将编译后的二进制文件放在我的网络目录中适当的位置。

CGI在互联网世界的应用很广泛,但是对它也有很多不满意之处。

生成子进程是一个相当复杂的工作,耗费很多时间和内存,许多访问率相当高的站点的开发人员常因为由此造成的速度问题抱怨不已。
网络服务器包含很多信息,而不只是环境变量和标准输入(STDIN)。有时候如果网络程序能够访问这些资料将会带来许多便利。
传统的编程对于互联网来说都显得过于臃肿庞大,你最需要的其实就是一个能代替你编写HTML的一个智能程序,所以,为什么要把程序编得象计算机的代码呢?为什么不能使它更象HTML本身?
编写互联网应用程序最现代的方法产生于最近的几年。这些编程方法起源于基于用户端的HTML,或者叫.shtml,其概念强大之处在于将编程代码嵌入HTML文件。一些比较流行的例子如下:

Active Server Pages (.asp文件), 这种程序应用于微软的IIS网络服务器。ASP文件可以用几种比特的脚本编写引擎例如VBScript, JavaScript,和PerlScript启动。
Allaire Cold Fusion,这是一种非常方便的商用互联网开发环境。尽管它最初只能用于Windows NT,但后来它也开发出了适用于UNIX的版本。
Meta-HTML, 这种"免费软件"适用于UNIX 系统,它支持ODBC以及本地化的mSQL接口,它可以提供用于Netscape和Apache网络服务器的插件软件。
本文中我不具体谈这些工具,但我打算谈一下Ralf Engelschall的ePerl,这种应用程序使你能将Perl源代码嵌入到文本文件中。它还集成了mod_perl/Apache,这些事项以前我们需要在Apache的设置中完成。mod_perl/Apache的集成强调速度及解决CGI编程中对服务器-内程序访问的失败,而ePerl则处理标准编程语言在生成HTML时的臃肿和罗嗦。

下面,编写一些SQL代码,并将其放入变量。例如,在我昨天的例子中:

$SQL = <<"EOT"; select title, released from albums
where artist="Genesis" order by released EOT
这个变量是用户端光标查询(cursor)的核心。光标查询 (cursor)是一种先进的SQL查询方法,它执行逐行查询功能。该查询功能实际上在同时全部执行,但我们的Perl查询只能一行一行地获得查询结果,所以它感觉上象是针对应用程序的光标。用户端光标查询的语句及执行代码如下:

$cursor = $dbh->prepare($SQL);

$cursor->execute;
现在我们逐行进行查询:

while ( @columns = $cursor->fetchrow {

print ( ( map { "[$_]" } @columns , "/n";

}
这行Perl代码用于打印出列序列中的每一条数据-其数值利用 $cursor-> fetchrow方法从$cursor行中提取出来。其数值用[ ]包围。很显然,我可以将任何内容放在while循环内,而不只是打印语句。

最后,实现系统资源的回收和断开连接。我们关闭光标查询和数据库处理器。

$cursor->finish;

$dbh->disconnect;
如果某个你想执行的SQ指令不是select语句,你不需要使用while ( $cursor->fetchrow { ... } 循环,因为你实际并不需要发布会任何信息,你不需要循环查询各行。

假如在昨天的例子中,我没有从album数据库中删除my Genesis信息,我将利用今天所学的方法将其变成一个可以应用于互联网的ePerl程序。

<?

use DBI; # 假如你没有startup.perl文件则需要假如该行代码

my $dbh = DBI->connect('DBI:mysql:test:localhost', ',')

or die $DBI::errstr;

my $SQL = <<"EOT";

select title, released

from albums

where artist = 'Genesis'

order by released

EOT

my $cursor = $dbh->prepare($SQL);

$cursor->execute;

!>//

<HTML>

<HEAD><TITLE>ePerl/DBI/HTML Integration

Example</TITLE></HEAD>

<BODY>

<P>

有关Genesis albums的数据库程序结果为 ...

<HR>

<TABLE BORDER>

<TR><TH COLSPAN=2>Albums by Genesis</TH></TR>

<TR><TH>Title</TH><TH>Release

Date</TH></TR>

<?

my @columns;

while ( @columns = $cursor->fetchrow {

print ( "<TR>",( map { "<TD>$_</TD>" }

@columns , "</TR>/n";

}

!>//

</TABLE>

<HR>

<P>

... and that's it!

</BODY>

</HTML>

<?

$cursor->finish;

$dbh->disconnect;

!>//
你可以查看该程序执行的结果。

Albums by Genesis
Title Release Date
Selling England By The Pound 1973-01-01
Trespass 1974-01-01
A Trick of the Tale 1976-01-01
Wind & Wuthering 1976-01-01
Duke 1980-01-01
We Can't Dance 1990-01-01

四、 前景 ..

我们已经学习了网络数据库编程的基本知识,在第5天的课程中,我们将编写一个系统演示编写网络数据库将遇到的各种情况。

在生成该数据库之前还有一些细节问题需要研究。而且我们也不能忘记我们向数据库存取信息的基本途径:HTML表单。我将用到另外一个有用的Perl 模块,CGI.pm。
------------------------------------------------
网络数据库教程-第5日
一 必不可少的CGI.pm
二 数据库转义序列
三 在Here-Document字符串内嵌入引用表达式
四 嵌入子程序
五 用SQL设置表单- selection.iphtml
六 用CGI.pm - receive.iphtml处理表单结果
--------------------------------------------------------------------------------

一、 必不可少的CGI.pm

在过去的几天里我们已经谈了许多重要的事项。当然谈得都不是太深入。今天我将用一个实例比较细致地阐述一下过去几天所学的概念。而且几天还会涉及一些新的问题。

在各种有关Perl CGI编程的讨论中常常会提到Lincoln Stein的CGI.pm 。总体来说,CGI.pm 所用的编程理念和我在本教程中所倡导的完全相反。

从一开始,我就在试图帮助你们建立互动、动态生成的网页。这也是嵌入式HTML编程的初衷,而且它也能使网站的编码和组织更简便快捷。

而CGI.pm的观点是将网络编程分离出来,它给你一种感觉仿佛你是在用CGI.pm搭建一个网页,例:

#!/usr/bin/perl

use CGI;

$query = new CGI;

print $query->header(),

$query->start_html(-title=>'Made with CGI.pm'),

'This is what I mean by ',

$query->b('abstracted'),

'.',

$query->end_html();

exit 0;
该程序的执行结果是一个简单的HTTP头,一个起始HTML块(包括一个<TITLE>,几行文字,以及标准的HTML结束块。注意所有这些都是用CGI的$query 对象以及与其相关的方法编制的:

Content-type: text/html <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML><HEAD><TITLE>Made with CGI.pm</TITLE> </HEAD><BODY>This is what I mean by <B>abstracted</B>.</BODY></HTML>

我总是尽量避免使用这种编程方法,但是我也不得不承认这种方法有时候
用起来很顺手。

CGI.pm的优点不在于它的抽象性,而在于它所提供的工具。CGI.pm有一个非常强大的cookie处理器以及表单参数解码方法。

我们都了解表单,它是HTML,而且它具有很多用途。

View the page source to see how I put this one together.

作为一个网络程序员,表单是从用户处收集的只要方法。当一个用户点击递交(Submit)按钮时,浏览器将用户输入的信息打包编码然后发送给你的CGI程序进行处理。而CGI程序的职责就是要解包,解码和使用表单中的内容。

这个过程很烦琐,为什么不让CGI.pm帮你处理这些事情呢?表单参数可以用param方法提取:

 

#!/usr/bin/perl

#

# BAR.cgi is a simple Perl CGI program using CGI.pm.

#

# A Web page with a form containing the FOO textarea

# is meant to submit to BAR.cgi (pay attention to

# the "param" method).

#

use CGI;

$query = new CGI;

print $query->header(),

$query->start_html(-title=>'Test of the param method'),

'The value of the FOO parameter is: ',

$query->param('FOO'),

$query->end_html();

exit 0;
这就是用CGI.pm解决这个问题的方法。在以后的某些ePerl代码中我还将用到CGI.pm,但只是为了利用其param方法的优势。

二、 数据库转义序列

在第3天的教程中我用做了一个唱片数据库,其中有一张唱片叫做"We Can't Dance",这一项不能作为字符串利用mysql程序插入到数据库中-因为MySQL将符号'作为字符串的限位符。

变通方法是通过加入反斜杠将该限位符“转义”:

mysql> insert into albums(title,artist,released)

-> values('We Can/'t Dance','Genesis','1991-01-01');
当然在为了数据库上下文中处理这些细节比较令人头疼。

当你想在数据库中插入项目时,通常会直接使用表单参数。你的ePerl代码可能如下:

$foo = $query->param('foo');

$foo =~ s/'//'/g; # this Perl command will substitute ' with /'

$SQL = <<"EOT";

insert into my_table(my_column)

values ('$foo')

EOT
这种设置方法不好,因为:

MySQL用反斜杠"转义"字符,但其他的某些数据库程序则可能使用不同的转义序列,所以用反斜杠硬性“转义”会影响程序的可移植性另外,该转义符在此处只转义了单引号 ' -还有其他的字符也需要转义。

需要转义的其他字符在不同的数据库中会有所区别。

你不需要记忆文献中所述的细节。用$dbh->quote记忆可以帮你实现上述目的。

$foo = $dbh->quote($query->param('foo'));
$query->param('foo')将返回表单文字区输入的foo的值,并且$dbh->quote将根据和你的数据库相应的DBD转义必要的字符。

$dbh->quote还在这个字符串外添加引号,这样就省得你在键盘输入引号了。

三、 在Here-Document字符串内嵌入引用表达式

here-document字符串的语法如下:

$string = <<"HERE_DOCUMENT";

You can type all sorts of stuff in here....

You can also $interpolate variables right into your h-d string.

The here-document string will quit when it runs into the label

given at its outset.

HERE_DOCUMENT
here_document非常方便,特别是在编制传递给$dbh以生成客户端$cursor光标查询的 $SQL字符串时。

看一下我们如何在上面的$dbh->quote例子生成$SQL。 我必须生成一个中介变量$foo插入实际生成$SQL的here-document字符串。但这样也不是很理想。我们可以做得更好。

问题是,当$dbh->quote返回一个字符串标量值时,它不是字符串标量值,它是一个函数(实际上是一个方法),这个问题可以在here-documents中变通解决。例如,下面的代码就不能执行:

$SQL = <<"EOT";

insert into my_table(my_column)

values ($dbh->quote($query->param('foo')))

EOT
我在here-document做一些变通 (变通方法用加重体字显示)

$SQL = <<"EOT";

insert into my_table(my_column)

values (${ /($dbh->quote($query->param('foo'))) })

EOT
/ 对$dbh->quote所提供的值作了一个引用。${ ... }取消该引用。语法看起来不好看,但是,据我所知,从来也没有人认为Perl 是一种漂亮的语言。

四、 嵌入子程序

尽管ePerl可以让你在HTML中任意嵌入Perl,但有时候在你的.iphtml文件中
使用子程序能使你的程序显得简洁明了。

例:

<HTML>
<HEAD><TITLE>Embedding a Subroutine</TITLE></HEAD>
<BODY>

<P>
Here's an HTML calendar for the current month:
<B><?=${ /(`cal| head -1`) }!></B>

<P>
<?=${ /( calendar_table() }!>//

</BODY>
</HTML>
<?

sub calendar_table {

#
# I make copious use of the Unix "cal" command here.
# This won't work on DOS-derivative machines.
#

my @cal = `cal`; # fill the cal array with the
output of a shelled cal command
my $return = ';

shift @cal; # junk the first line... it's not needed

$return .= "<TABLE BORDER>/n";
$return .= "<TR>";
# I dedicate the following line to my fellow Perl junkies
everywhere
$return .= join(', map { s//W//g; "<TH>$_</TH>" }
unpack("A2A3A3A3A3A3A3", shift @cal));
$return .= "</TR>/n";

foreach ( @cal {
$return .= "<TR>/n";
$return .= join(', map { s//W//g; "<TD>$_</TD>" }
unpack("A2A3A3A3A3A3A3",$_));
$return .= "</TR>/n";
}

$return .= "</TABLE>/n"; # the value of this line is
returned

}

!>//
这里是该程序执行的结果(如下)。 注意如果子程序非常大的话可能会给内存造成麻烦(因为$return的体积会很大),但是当我们遇到这个问题时我们会用相应的办法解决。

Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

五、 用SQL设置表单 - selection.iphtml

这里是我所用到的例子,它包括两个程序selection.iphtml和receive.iphtml。

首先调用selection.iphtml - 它将提供一个表单。用户填完表单后,表单将被
递交给receive.iphtml。当它列表显示结果后,你将回到selection中。

但是我不能在这里演示插入、更新或删除SQL语句,因为我不能公开该数据库的
内容。

<?

my $dbh = DBI->connect('DBI:mysql:test:localhost', ',',

{ PrintError => 0}) || die $DBI::
errstr;

!>//

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

<HTML>

<HEAD>

<TITLE>An ePerl Database Example: Fiddling with
Albums</TITLE>

</HEAD>

<BODY>

<P>

Use the following form to query the contents of an
(admittedly limited)

database of CD albums of mine.

<TABLE>

<TR>

<TD><?=${ /( search_by_band ( /$dbh }!></TD>

<TD><?=${ /( search_by_year ( /$dbh }!></TD>

</TR>

</TABLE>

<FORM ACTION=receive.iphtml METHOD=POST>

<B>Or, type in a title:</B> <INPUT NAME=title SIZE=20>

(for all titles, just put the cursor in this field
and hit ENTER)

</FORM>

</BODY>

</HTML>

<?

$dbh->disconnect;

!>//

<?

sub search_by_band {

#

# Note that I passed a reference to the database handle dbh.

# This means that, in order to reference it within this

# subroutine, I'll have to refer to it as $$dbh.

#

my $dbh = shift;

my $return = ';

#

# The "distinct" keyword in SQL will only return one row for
a set of

# identical matches. "Order by" will sort the
# returned set alphabetically.

#

my $SQL = <<"EOT";

select distinct artist

from albums

order by artist

EOT

my $cursor = $$dbh->prepare($SQL);

$cursor->execute;

$return .= "<FORM ACTION=receive.iphtml METHOD=POST>/n";

$return .= "<B>Pick an artist:</B><BR>/n";

$return .= "<SELECT NAME=artist>/n";

my @fields;

while ( @fields = $cursor->fetchrow {

$return .= "<OPTION>$fields[0]/n";

}

$return .= "</SELECT><BR>/n";

$return .= "<INPUT TYPE=SUBMIT NAME=artist_submit
VALUE=/"Go Search on This Artist!/">/n";

$return .= "</FORM>/n";

}

sub search_by_year {

my $dbh = shift;

my $return = ';

#

# If COLUMN is defined as a date datum, then year(COLUMN)
will return only

# the year portion of the data in the column. "Order by
COLUMN desc"

# will reverse the usual sort order.

#my $SQL = <<"EOT";

select distinct year(released)

from albums

order by released desc

EOT

my $cursor = $$dbh->prepare($SQL);

$cursor->execute;

$return .= "<FORM ACTION=receive.iphtml METHOD=POST>/n";

$return .= "<B>Or, pick a year:</B><BR>/n";

$return .= "<SELECT NAME=year>/n";

my @fields;

while ( @fields = $cursor->fetchrow {

$return .= "<OPTION>$fields[0]/n";

}

$cursor->finish;

$return .= "</SELECT><BR>/n";

$return .= "<INPUT TYPE=SUBMIT NAME=year_submit
VALUE=/"Go Search on This Year!/">/n";

$return .= "</FORM>/n";

}

!>//
 

六、 用CGI.pm - receive.iphtml处理表单结果

<?

my $cgi = new CGI; # 利用 "param" 解码方法的优势

my $dbh = DBI->connect('DBI:mysql:test:localhost', ',',

{ PrintError => 0}) || die $DBI::errstr;

!>//

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

<HTML>

<HEAD>

<TITLE>Results from the Database Search</TITLE>

</HEAD>

<BODY>

<P>

<?=${/( display_query_results(/$dbh, /$cgi) }!>//

<P>

<A HREF=selection.iphtml>Return to the query page</A>

</BODY>

</HTML>

<?

$dbh->disconnect;

!>//

<?

sub display_query_results {

#

# 注意我将引用传递给数据库处理器dbh和
# cgi对象 - 这意味着要想在子程序中引用他们

# 我必须使用$$dbh和$$cgi.

#

my $dbh = shift;

my $cgi = shift;

my $return = ';

my $SQL;

if ( defined($$cgi->param('title')) {

my $SQL = <<"EOT";

select title, artist, year(released)

from albums

where ucase(title) like ${ /($$dbh->quote(uc($$cgi->
param('title')) . '%') }

order by title, artist

EOT

#

# 在上述语句中我使用了更复杂的SQL。SQL不会
# 自动将返回的结果排序,但是利用

# "order by" 语句可以很容易地实现排序 - 只需设定你希望显示的列数

# 以及它们,的顺序优先级,"Like"可以匹配子程序 -

# 如果你提供了标题 "abc," 则所有标题以"abc"开头的唱片

# 都会被返回。为了消除这种现象,我
# 在SQL中使用ucase(title),以及uc($$cgi->param('title'),
将两个字符串都大写显示。

# %字符是一个通配符,很象UNIX中的*

# 文件名globbing.

#

my $cursor = $$dbh->prepare($SQL);

$cursor->execute;

$return .= "<TABLE BORDER>/n<TR><TH COLSPAN=3>";

$return .= "<B>Matches on the title search for:
<TT><I>${ /($$cgi->param('title') }</I></TT></B></TH></TR>";

$return .= "<TR><TH>Title</TH><TH>Artist</TH><TH>
Year of Release</TH></TR>/n";

my @fields;

while ( @fields = $cursor->fetchrow {

$return .= "<TR><TD>$fields[0]</TD><TD>$fields[1]
</TD><TD>$fields[2]</TD></TR>/n";

}

$cursor->finish;

$return .= "</TABLE>/n";

} else {

if ( defined($$cgi->param('artist_submit')) {

$SQL = <<"EOT";

select title, year(released)

from albums

where artist = ${ /($$dbh->quote($$cgi->param('artist'))) }

order by released desc, title

EOT

} elsif ( defined($$cgi->param('year_submit')) {

$SQL = <<"EOT";

select artist, title

from albums

where year(released) = ${ /($$dbh->quote($$cgi->param('year'))) }

order by artist, title

EOT

}

my $cursor = $$dbh->prepare($SQL);
$cursor->execute;

$return .= "<TABLE BORDER>/n<TR><TH COLSPAN=2>";
$return .= (defined($$cgi->param('artist_submit'))?
("<B>Artist: <TT><I>".
"${ /($$cgi->param('artist')) }</I>".
"</TT></B></TH></TR>/n<TR>".
"<TH>Album Title</TH>".
"<TH>Year of Release</TH></TR>/n":
("<B>Year of Release: <TT><I>".
"${ /($$cgi->param('year')) }</I>".
"</TT></B></TH></TR>/n<TR>".
"<TH>Artist</TH><TH>Album Title</TH>".
"</TR>/n");

my @fields;
while ( @fields = $cursor->fetchrow {
$return .= "<TR><TD>$fields[0]</TD>";
$return .= "<TD>$fields[1]</TD></TR>/n";
}
$cursor->finish;
$return .= "</TABLE>/n";
}

$return;
}

!>//

本教程到此就结束了,但是它只是为了数据库编程的入门,而不是结束。我希望该教程能对你有所帮助。

网络数据库教程(5日教程)相关推荐

  1. 考oracle ocm,Oracle数据库OCM考试系列教程与总结_OCM考试实验笔记

    oracle数据库OCM考试系列教程与总结_OCM考试实验笔记 以下包括OCM考试系列的文章,在以下各章节中基本的内容都已经涉及到,在这些文章中,将对之前的OCM考试系列文章进行汇总,对一些之前没提到 ...

  2. MongoDB在不同主机间复制数据库和集合的教程_MongoDB_脚本之家

    MongoDB在不同主机间复制数据库和集合的教程 更新时间:2016年07月04日 15:49:51   作者:lucifercn MongoDB自带了clone一族JavaScript函数来进行数据 ...

  3. 使用PowerDesigner 15对现有数据库进行反向工程(图解教程) by Yulh

    原文 使用PowerDesigner 15对现有数据库进行反向工程(图解教程一) by Yulh 由于早期的一个项目在数据库设计建立时没有输出为E-R图,偶在对此项目进行二次改造升级时则使用了PD对原 ...

  4. 网络工程原理与实践教程实验安排

    <网络工程原理与实践教程(第3版)>胜在超凡实验指导书和教材合为一体,"易学,易教,内容新"  第10章 实    验.... 235 实验1 水晶头的制作... 23 ...

  5. Unity网络多玩家游戏开发教程(上册)

    Unity网络多玩家游戏开发教程(上册) 试读文档下载地址:http://pan.baidu.com/s/1jGwwxam Unity作为强大的游戏开发平台,为网络游戏的的开发提供大量的组件和API. ...

  6. Unity网络多玩家游戏开发教程第1章Unity自带网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说 ...

  7. vue-resource网络请求模块(安装教程) - cmd篇

    vue-resource网络请求模块(安装教程) - cmd篇 安装vue-resource 网络请求模块,用于依赖后端服务器的vuejs项目进行对服务器端数据的请求或跨域请求. cmd安装步骤: 先 ...

  8. TPOT网络蜜罐安装——保姆级教程(一个人的血泪史)

    前言: 最近需要安装一个TPOT网络蜜罐,看网上教程太少或者我使用了不可行,受了俩星期的折磨后,由于不可抗因素需要重新安装,记录一下,防止后来人踩坑. 我的环境: WINDOWS10   VMware ...

  9. 网络项目实践与设备管理教程-毛正标

    网络项目实践与设备管理教程-毛正标 生成树技术与链路聚合 1.哪些类型的帧会被泛洪到除接收端口以外的其他端口( BD ). A.已知目的地址的单播帧 B.未知目的地址的单播帧 C.多播帧 D.广播帧 ...

最新文章

  1. 利用多线程实现报表的高效导出
  2. 深度学习(三十二)——AlphaGo, AlphaStar
  3. 鼠标经过超链接文字变色
  4. 异常信息java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:
  5. sed mysql配置文件_shell解析my.cnf配置文件
  6. sublime for mac 注册码
  7. 今天你的网站被攻击了吗?
  8. TCP_IP Sockets编程C语言实现第2版 源码下载
  9. Java编程实现获取本机IP和计算机名的功能
  10. 华为鸿蒙智慧屏_华为智慧屏X65将于4月8日发布搭载了鸿蒙OS操作系统
  11. Redis 6.0学习指南
  12. android模拟器 vm版,怎样用vmware虚拟机安装android模拟器
  13. zoj 3551 Bloodsucker 概率DP
  14. QQ另存为出现“你没有权限在此位置中保存文件,请与管理员联系以获得相应权限”
  15. H5canvas(保存图片,globalCompositeOperation)
  16. 分享一套PHP的cms系统,免授权可商用,零元CMS企业官网系统,采用laravel+admin架构的企业建站系统
  17. 初级测试工程师要求(零基础必备)
  18. 立秋后6大脏器排毒法 干净才是真正文艺范儿(转)
  19. CVE-2022-1388——F5 BIG-IP iControl REST 身份认证绕过漏洞
  20. 文件和打印机共享 win7 and xp

热门文章

  1. Draw.io | 一款强大且支持在线编辑和导出的流程图绘制神器
  2. 2022-2028年全球与中国皮卡行业市场前瞻与投资战略规划分析
  3. java retry_Retry重试机制
  4. python 使用osl的时候会出错
  5. 面向对象-1-类和对象、基础语法、初始化、内置方法和属性
  6. 羊了个羊游戏开发教程2:随机生成卡牌
  7. 如何让你的代码维护性提高
  8. 水处理小知识:养殖场废水脱色剂除色又除臭
  9. Attributed Strings
  10. GAD计算机辅助诊断,GAD-7-PHQ-9可打印.doc