第一章 PHP简介

第一节 PHP简介

1.Web程序工作原理

1Web一词的含义

network:【计算机】电脑网络,网

Web:【计算机】万维网(World Wide Web),互联网(Internet)

Web程序,顾名思义,即可工作在Web上的程序。实际上,它也可工作于企业内网(内联网:Intranet)、企业间网(外联网:Extranet),只不过它在Web上更具应用优势,更为常见,故人们称它为Web程序。

2)单机程序工作原理

单机,即不连接到其他计算机的计算机,不在网络中。两单机AB,只在A上安装有程序X,若要在B上得到X的运行结果,必须在B上安装一遍C,然后运行之,若B类的计算机比较多,则需要逐一安装运行,非常麻烦;它们之间不能直接进行通信和协作。如图1所示。

1 单机程序工作示意图

3)客户机/服务器程序工作原理

将单机连成网络,如将AB连成网络,则可以使它们之间提供服务,如AB提供服务。常见的服务是文件共享,FTP文件下载等。我们把提供(响应)服务的计算机称作服务器(Server),接受(请求)服务的计算机称作客户机(Client),也叫工作站(Workstation)。服务器一般用性能较高的计算机担当。客户机/服务器程序的工作原理如图2所示。

2 客户机/服务器程序的工作原理

服务器和客户机的角色可以转换。一台计算机,可以对自己提供服务,这时,它既是服务器,又是客户机。如,计算机A把自己的文件夹a共享,然后在网络上找到A,则可以下载a,即自己对自己提供了服务,自己请求并响应了服务。

客户机/服务器的这种计算机间的协作方式,称作C/S方式,或C/S架构。

C/S程序分为两部分:服务器端部分和客户机端(以后简称客户端)部分,分别称为服务器端程序(或服务程序)和客户端程序(或客户程序)。对于客户端程序,对每一个客户机,也都需要分别安装,这一点与单机程序的分发相同,也很麻烦。但是,安装好了客户端程序后,就可以通过通信线路与服务器交互,或通过服务器,与其他客户机通信。典型的例子是大家常用的聊天程序QQ,如图3所示。

3 C/S程序QQ的工作原理

4)浏览器/服务器程序工作原理

若通过客户机中的浏览器(Browser),向服务器发出请求,接收其响应的结果,那么,这时,我们称这样的协作方式为B/S方式,或B/S架构,其工作原理如图3所示:

4 浏览器/服务器程序的工作原理

这时,客户端程序就是浏览器,而浏览器的安装是随着操作系统的安装完成的,不需要用户额外安装。大多数情况下,大多数人用的操作系统是Windows操作系统,对他们而言,使用B/S程序(如上网看新闻,收发电子邮件),可不需要安装专门的客户端程序,直接在浏览器中操作即可。这使得B/S程序的维护十分方便,因为不用管客户端程序,只要维护好服务器端程序即可。

人们说当今是一个网络时代,实际上着重指得是互联网时代,也就是Web的时代。人们使用这种B/S程序比较多,是造成这种叫法的一个重要缘故。

本课程中的Web程序,就是指这种B/S程序。

5C/SB/S中服务器的组成

服务器,是担负服务任务的机器。这些服务任务一般专门的软件来完成。一般地,把具有某种服务功能的服务器软件及其所在的机器,都统称XX服务器(XX表示某种具体服务)。这些软件可以集中于一台机器中(如图5),这样的机器可以称为集中式服务器;也可以单独存在于某台机器中(如图6),这样的机器可以称为独立式服务器,多个独立式服务器可组成服务器群或矩阵(台湾词为“阵列”)

5 集中式服务器

6 由独立服务器组成的服务器群

按照服务任务,常见的几种服务器软件如表1所示。

1 几种常见服务器软件

服务器软件类别

服务器软件举例

功能

Web服务器软件

ApacheIISPWS

接收来自浏览器的任务请求,分派任务给其他服务器软件,接收其他服务器软件对任务的处理的结果,将该结果返回给浏览器

服务器端脚本解释软件(一般与Web服务器软件同处于同一台机器上)

PHPASP

接收来自Web服务器软件分派给自己的服务器端脚本执行任务;进行脚本的语法分析,若语法有错误,则向Web服务器返回出错信息,否则,执行脚本,将解析结果/执行结果返回给Web服务器软件

数据库服务器软件

MySQLOracleMS SQL Server

接收来自其他服务器软件的数据处理任务请求,执行该任务,将执行结果返回给请求者

电子邮件服务器软件

MS Exchange

Sendmail

接收来自其他服务器软件的邮件处理任务请求,执行该任务,将执行结果返回给请求者

服务器端脚本:用服务器端编程语言编写的程序。

服务器端编程语言:只运行在服务器端,被服务器所解释和执行的编程语言,如PHP语言。

6B/S程序工作的具体过程

说明:在以后的B/S程序图示中,通信线路不再特别表示。

7 B/S程序工作过程示意图

7PHP程序工作的具体过程

8 PHP程序工作过程示意图

具体过程是ApachePHP、浏览器之间的协作过程:

用户通过浏览器向服务器请求PHP文件(如在地址栏输入:http://211.64.40.187/index.php),Apache在服务器上的用户文档发布目录下查找浏览器所请求的PHP文件,若找不到,则向浏览器返回错误信息,否则,将其提交给PHP解释器解释执行,PHP解释器对该PHP文件进行语法分析,若发现语法错误,则经Apache返回错误信息(以浏览器能识别的代码表示)到浏览器,否则执行该PHP程序(可能包含对数据库MySQL的操作),将PHP程序执行结果(以浏览器能识别的代码表示)经Apache返回到浏览器,浏览器对返回的结果进行解释、执行,执行的结果显示在浏览器窗口中。

如果浏览器所请求的文件不是PHP文件,而是HTML文件(.htm文件)或JavaScript文件(.js文件),该过程将简化:Apache在服务器上的用户文档发布目录下查找浏览器所请求的HTML文件或JavaScript文件,若找不到,则向浏览器返回错误信息,否则,将其返回给浏览器,浏览器对返回的结果进行解释、执行,执行的结果显示在浏览器窗口中。

2.PHP简介

PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛使用的开放源代码多用途脚本语言,尤其适用于 Web 开发并可以嵌入到 HTML 中去。其语法利用了 CJava Perl,非常容易学习。该语言的主要目标是让 Web 开发人员可以很快写出动态生成的网页,但 PHP 的功能远不止如此。

一个简单的PHP程序:

<?

echo hello,world;

?>

该程序运行的结果是在网页上输出了一个内容为hello,world的字符串。

PHP是一种语法简单、功能强大的网络编程语言。在语法格式上,PHP借鉴了广泛流行的CJavaPerl等编程语言的特点,非常类似于C语言,但比C语言更简单,易学和易用,因此特别适合于学习过C语言,有志于网络编程的人学习和使用。

在功能上,它提供了丰富的函数库,支持复杂字符串处理,正规表达式和图形处理,可根据用户请求将服务器的数据轻松地产生动态网页,支持目前几乎所有流行的数据库系统,如OracleSQL ServerMySQLmSQLInformixSyBaseODBCPostgreSQL以及dBase等。在在可移植性上,PHP程序可在Windows下快速开发,代码甚至不加修改即可运行在UnixLinux上。

本课程中的PHP程序,就是指使用这种PHP语言编写的程序。它只能被服务器所解释执行,只能运行于服务器端,用户在浏览器中看到的,只是经服务器解释后,返回给浏览器的HTML等客户端代码(可从浏览器的“查看->源文件”菜单中看到),这些代码是由浏览器解释执行的,执行的结果,显示在浏览器窗口中,形成网页。所以,在客户端,看不到PHP代码,这也是PHP语言写成的代码比较安全的一个原因。

 第二节 PHP的开发环境的搭建

从图8中可以看出,要使PHP程序能够正常工作,必须:

(1)      选用合适的程序编辑软件,以便进行程序的编写;

(2)      为其在服务器上配置好一个运行环境:安装和配置好以下软件,使它们能够正常协作:ApachePHPMySQL,以便进行程序的测试和运行。

以上两点构成一个完整的PHP开发、测试和运行环境。其中,(1)的3个软件部署在服务器上,(2)的软件部署在客户机上。为方便大家学习和理解整个环境的搭建过程,本课程的实验条件是人手一机,每台机器既作服务器又作客户机,整个环境的搭建工作可在一台机器上完成。

以上两点构成一个完整的PHP开发、测试和运行环境,其根本目的是为了学习使用PHP语言进行Web程序编写和软件开发,所以,我们把这个环境的搭建工作称之为PHP开发环境的搭建。

1.程序编写,软件开发工具软件的选用

1)有关工具软件

这些工具软件用于编写,修改源程序文件。我们的源程序文件都是ASCII码文件(纯文本文件),所以,只要是能够处理纯文本的工具软件,都可选用。

常用的编辑软件有:记事本。为了提高效率,常使用一些专业工具软件,如UtraEditDreamWeaver,不建议使用FrontPage(它对PHP的支持不好)。

Ÿ 记事本:常用于简单的代码编辑。

Ÿ UltraEdit10简体中文版:短小精悍,代码编辑功能强大,编程高手的利器

Ÿ Dreamweaver MX中文版:图形化编辑环境,速度慢,功能多,常用于复杂网页设计和网站管理。注意该软件提供了“代码”、“代码/设计”、“设计”三种视图:“代码”视图以全部是源代码的方式供用户编辑使用,常用于代码(服务器端代码或客户端代码)的编写,修改;“设计”视图以可视化的方式供用户使用,常用于设计网页界面,以减少手工撰写客户端代码的工作量;“代码/设计”视图是上述两种方式的结合。

2)源文件扩展名

无论用哪种工具软件编写源程序文件,若文件中含有PHP代码,必须确保文件的扩展名,与在Apache配置中的PHP文件的扩展名的设定一致;若不含PHP代码:①若仅含有HTML代码,一般以.htm为扩展名;②若仅含有JavaScript代码,这种文件常作为.htm文件的包含文件(引用文件,类似于C程序文件中的头文件)一般以.js为扩展名;③若含HTML代码和JavaScript代码,一般以.htm为扩展名。

3)开发工具软件的使用

这些开发工具软件,简单易用,用户稍加学习即可掌握。对于Dreamweaver,操作类似WORD,另外,它自带学习教程,可以参考。

2.服务器软件的安装和配置

对于Windows下多数软件的安装,我们是通过执行该软件的安装程序(setup.exeinstall.exe、软件文件名.exe),由安装程序负责具体的安装过程。这个过程中,安装程序做的工作一是系统注册:把该软件的一些系统文件,复制或移动到操作系统的有关系统目录中,实现与操作系统的接口,便于操作系统使用;二是将自身的程序文件、数据文件等复制到本软件的安装目录下,用于本软件的运行。

1PHP语言解释器软件的安装和配置

该软件没有安装程序,所以具体的安装过程需要用户来完成。不过过程也十分简单:解压缩该软件包至安装目的目录,将系统文件php4ts.dllPHP系统扩展函数库)和php.iniPHP配置文件)分别放到操作系统目录下的相应的位置即可。

2Apache的安装和配置

大体经过安装->配置两大步骤完成。配置大体经过编辑配置文件->启动服务完成。

Ÿ 安装:其安装过程由其安装程序进行,启动安装程序后,按提示操作即可。

Ÿ 配置目的:向Apache说明清楚PHP的有关情况,以便实现二者的协作。

Ÿ 配置方法:主要通过一个配置文件中有关参数的修改或添加进行。所谓“修改”,即对该文件中已经存在的参数,修改其参数值;所谓“添加”,即将该文件中缺少的参数和参数值增加到该文件中相应位置,为了省事,也可以放到该文件的最后。该文件名为httpd.conf,存在于Apache安装目录下的conf目录下,是一个纯文本文件,可用记事本打开修改。也可以通过开始菜单中Apache程序组中的“Edit Configuration”打开该文件,进行配置操作。注意每次配置变动后一定要保存,并启动或重新启动Apache的服务,所做的最新配置才会起作用。

Ÿ 有关参数和参数值的说明

1)格式多是这样的单独的行:

#参数名  参数值

行首的#表示注释,应去掉才会使配置起作用。

2)参数和参数值的含义、作用

2  Apache配置参数设定

示例路径:PHP安装路径——d:/php;发布文档(即文件)主目录——d:/www

 

参数名和参数值

操作

作用

BindAddress 服务器机器IP

修改

进行地址绑定(指定服务器地址)

LoadModule php4_module d:/php/sapi/php4apache.dll

添加

指名将PHP配置为Apache的模块(Apache module)方式进行工作时的PHP语言解释器

Port  80

修改

指定Apache对外提供Web服务的通信端口

ServerAdmin  服务器管理员邮箱(abc@abc.com)

修改

当发生错误时送回客户端浏览器的管理员信箱

ServerName  服务器的计算机名称

修改

指明主机名称

DocumentRoot  "d:\www"

修改

指明向客户端提供Web服务的发布文档主目录

<Directory  "d:\www">

修改

发布文档主目录定义,该处目录的值应与⑥中的一致

ScriptAlias  /php/  "d:/php/"

AddType  application/x-httpd-php  .php

Action  application/x-httpd-php  "/php/php.exe"

添加

指明PHP脚本语言名称和PHP脚本语言解释器的路径

指明PHP脚本扩展名

指明PHP脚本解释器(PHP以非模块工作时起作用)

DirectoryIndex   index.php

修改

指定默认文档(主页文档,只请求服务器地址就响应的文档)

Ÿ 有关服务的操作:服务,是一直运行,监听来自其他程序(客户端)的请求,接收请求,处理请求(自己处理或提交其他程序处理),返回处理结果的一种运行着的程序,一种进程。一般运行于操作系统后台。有关Apache的服务操作,通过开始菜单中Apache程序组中的有关命令进行:

«  Install Service:在操作系统中注册服务

«  Uninstall Service:在操作系统中删除服务

«  Start Service:启动服务

«  Restart Service:重新启动服务

«  Stop Service:停止服务

注意:

服务的启动、重新启动、停止,必须以在操作系统中注册了服务为前提;

服务的启动、重新启动、停止过程中有Apache的消息反馈。

3ApachePHP的协同测试

测试目的是检查二者是否能够正常协作。具体来说,是检验配置后的ApachePHP、浏览器是否具备了这样的协作能力:

用户通过浏览器向服务器请求PHP文件(如在地址栏输入:http://211.64.40.187/index.php),Apache在服务器上的用户文档发布目录下查找浏览器所请求的PHP文件,若找不到,则向浏览器返回错误信息,否则,将其提交给PHP解释器解释执行,PHP解释器对该PHP文件进行语法分析,若发现语法错误,则经Apache返回错误信息(以浏览器能识别的代码表示)到浏览器,否则执行该PHP程序(可能包含对数据库MySQL的操作),将PHP程序执行结果(以浏览器能识别的代码表示)经Apache返回到浏览器,浏览器对返回的结果进行解释、执行,执行的结果显示在浏览器窗口中。

做法是,在服务器上用户的发布文档目录下,放置一个含有PHP代码的文件,即PHP程序,通过客户端浏览器,向服务器请求这个文件,若浏览器能得到正确的来自服务器的结果,则表明二者安装和配置成功,否则,应根据出错信息,修改配置。

第三节 实验一 PHP开发环境的搭建

本实验对Windows95及其以上版本的Windows操作系统机器通用。

0.实验目的

1)能够快速部署Windows下的开发环境,满足学习,使用PHP对于开发和服务环境的需要。

2)加深对B/S程序工作原理的理解

1.实验准备

0)知识准备:Web程序工作原理(本章第一节)

1PHP服务器环境需要以下3个服务器端系统软件

Ÿ Web服务器软件:Apache 1.3.14

Ÿ PHP语言解释器软件:PHP 4.0.4

Ÿ 数据库服务器软件:MySQL 3.23.43

2)开发工具软件:

记事本:Windows自带。

UltraEdit10简体中文版(压缩包文件:uedit10.zip

Macromedia Dreamweaver MX中文版:已安装好

注: PHP相关软件、开发工具的获得:在我的网站上的有关网页上下载。

我的网站:http://www.sunshoulong.cnhttp://211.64.32.2/dsks

3)操作系统软件:服务器和客户机上均为Windows

具体到德州学院计算机系的机房环境,请在Windows 2000 Professional环境下做

Win98下已经搭建好,是为以后章节的学习使用的,无实验意义)

4)实验中的路径说明

为说明问题的简单起见,路径为比较简单的示例路径,但已经过测试。实际运用时,路径完全可根据自己需要设定。

2.PHP的安装和配置

1)安装

①将PHP-4_0_4-Win32.rar解压缩到d:\php

②将d:\php下的php4ts.dll移动到c:\操作系统安装目录\system

③将d:\php下的php.ini-dist复制到c:\操作系统安装目录 下,更名为php.ini

注意:操作系统安装目录,具体位置见表3php.iniPHP的配置文件。

3:操作系统安装目录

操作系统

操作系统安装目录

Windows95

windows

Windows98

windows

Windows me

windows

Windows XP

windows

Windows NT系列

winnt

Windows 2000系列

winnt

Windows 2003

windows

2)配置:通过修改php.ini中的参数来实现。对MySQL而言,若无特殊要求,一般无须配置。因为PHPphp.ini中已经做好了对MySQL的配置,所以一般无须修改。

3.Apache的安装和配置

1)安装软件:双击Apache_1_3_14_win32.exe,按照提示,安装到d:\apache下,即完成安装。

2)配置服务:单击[开始]->[程序]->[ Apache Web Server]->[ Management]->[ Edit configuration],打开Apache的配置文件httpd.conf,按表4提示进行配置,完毕后,保存。

注意:

Ÿ 所谓“修改”,即对该文件中已经存在的参数,修改其参数值;所谓“添加”,即将该文件中缺少的参数和参数值增加到该文件中相应位置,为了省事,也可以放到该文件的最后

Ÿ 每处的配置要想起作用,必须将行首的#号(注释符号)去掉

Ÿ 描述以httpd.conf文件的行文顺序进行

Ÿ 4中路径、地址、主机名、信箱等,实际配置时请根据自己情况进行

Ÿ 每次配置变动后一定要保存,并启动或重新启动Apache的服务,所做的最新配置才会起作用

4  Apache配置参数设定

示例路径:PHP安装路径——d:/php;发布文档(即文件)主目录——d:/www

序号

参数名和参数值

操作

作用

BindAddress 服务器机器IPlocalhost(127.0.0.1)

修改

进行地址绑定(指定服务器地址)

LoadModule php4_module d:/php/sapi/php4apache.dll

添加

指明将PHP配置为Apache的模块(Apache module)方式进行工作时的PHP语言解释器

Port  80

修改

指定Apache对外提供Web服务的通信端口

ServerAdmin  服务器管理员邮箱(abc@abc.com)

修改

当发生错误时送回客户端浏览器的管理员信箱

ServerName  服务器的计算机名称

修改

指明主机名称

DocumentRoot  "d:/www"

修改

指明向客户端提供Web服务的发布文档主目录

<Directory  "d:/www">

修改

发布文档主目录定义,该处目录的值应与⑥中的一致

ScriptAlias  /php/  "d:/php/"

AddType  application/x-httpd-php  .php

Action  application/x-httpd-php  "/php/php.exe"

添加

指明PHP脚本语言名称和PHP脚本语言解释器的路径

指明PHP脚本扩展名

指明PHP脚本解释器(PHP以非模块工作时起作用)

DirectoryIndex   index.php

修改

指定默认文档(主页文档,只请求服务器地址就响应的文档)

说明:

①处:localhost指服务器机器本机。如果机器没有插网线,请选择localhost,否则有可能会提示说找不到地址。

⑦处上面有说明:This should be changed to whatever you set DocumentRoot to

教学网站上有Apache配置文件样本可供参考。

3Web服务的安装和启动

Ÿ 安装Apache服务

ApacheWindows操作系统服务中注册。单击:开始à程序àApache Web ServeràApache as a serviceàInstall service。服务只需要注册一次。

Ÿ 启动Apache服务

单击:开始à程序àApache Web ServeràApache as a serviceà Start Service,启动服务。还可以停止,重新启动服务。

说明:

Windows2000 ProfessionalWindows XP中,也可通过开始à控制面板à管理工具à服务,根据需要,对Apache服务进行启动、停止、重新启动等操作。

4.测试ApachePHP的支持

1)测试目标:检查二者是否能够正常协作

2)测试方法

①用记事本或uedit编写测试脚本,存为d:\www\index.php,内容为:

<?

echo phpinfo(); 

?>

注意:index.php被配置成了Apache的默认文档

phpinfo()PHP内置函数,用来显示PHPApache配置信息。

②在浏览器中敲入http://你的机器的IP地址或localhost(127.0.0.1),回车后若显示类似图9PHP配置页面(以Win98下为例),则说明你的配置达到了上述的测试目标,ApachePHP能够正常协作;若不显示类似画面,则配置有误,此时你的Apache不能够识别PHP脚本,需更改配置。

9 Apache配置成功(图中PHP4.3.4版本为例)

 

5.MySQL软件的安装和服务的启动

1)安装

mysql-3.23.43-win.zip解压缩后,双击setup.exe,按照提示,进行安装。

根据指定安装路径的不同,安装可采取的方式有:

①默认安装:安装过程中不指定安装路径,采用默的c:\mysql。采用该种方式安装,一路按“下一步”按钮即可完成。

②定制安装:安装过程中指定自己的安装路径(如:d:/mysql),而不是采用默的c:\mysql。采用该种方式安装完成后,需要做一个配置文件,将MySQL的有关信息向操作系统特别声明一下。具体方法是:用记事本或uedit创建一个文件my.ini 保存在你的操作系统安装目录下,该文件内容如下

[mysqld]

basedir=d:/mysql/

datadir=d:/mysql/data/

注意:本实验采用定制安装方式

2)启动服务程序

双击d:\mysql\bin下的winmysqladmin.exeMySQL服务程序),这样就会在操作系统的后台服务中注册并启动MySQL服务程序(默认情况下,每次操作系统启动时自动启动该服务,在Windows2000的服务中可更改其启动方式)

3MySQL数据库连接测试:通过MySQL的客户端程序mysql.exe,测试其与服务程序的连接是否正常,服务程序是否能够正常工作。

启动客户端程序mysql.exe:在命令提示符或MS-DOS下,进入d:\mysql\bin,键入命令mysql回车。

若出现类似如下结果:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 26 to server version: 3.23.43

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

则表明本测试成功。

键入exit回车,可退出与MySQL服务器的连接

 

至此,我们已经成功完成了PHP脚本解释器软件、Web服务器软件Apache、数据库服务器软件MySQL的部署。对于操作系统软件和开发工具软件,读者可自行完成部署。

 

本实验到此结束。


第二章 Web客户端技术

第一节 Web客户端工作原理

1.浏览器工作原理

1Web客户端工作原理

Web客户端,在本课程中,显然就是指浏览器(Browser)端。任何应用系统都必须有一个供用户操作的界面,即用户界面。浏览器的工作,从整个B/S程序来看,是用户与整个B/S程序打交道的一个界面(接口),即人机界面(接口)、用户界面,它的任务是:

Ÿ 收集用户输入的数据(如用户数据:http://211.64.32.2/dsks/index.php

Ÿ 将用户数据发送到服务器(向服务器请求该用户对服务器的请求)

Ÿ 接收服务器返回的响应(用浏览器能认识和执行的代码即客户端代码表示,如HTML代码,JavaScript代码等)

Ÿ 解释,执行这些代码,将结果显示在浏览器窗口中

可见,浏览器扮演的,是(多数情况下是远程的)服务器在用户那里的一个代理(Agent)的角色。这个代理,具有收集消息,请求响应和解释其领导(服务器)发回的指示的作用。

2Web客户端代码

无论是组织用于收集用户数据的界面,还是解释来自服务器的指示形成结果界面,都是用Web客户端代码表示的。常用的Web客户端代码使用HTML语言或JavaScript语言编写的,分别称为HTML代码或JavaScript代码。另外还有CSSXML等语言。本课程仅介绍HTML语言或JavaScript语言。

2.HTML工作原理

1HTML简介

HTMLHyper Text Markup Language,超文本标记语言。

20世纪80年代末,在欧洲粒子物理实验室(CERNthe European Laboratory for Particle Physics)工作的Tim Berners-Lee(人称WWW之父)通过研究发现:人们的视觉处理是以页为基础的。于是他得出了一个结论:电子资料应以页的方式呈现。以此为出发点,他使用超文本为中心的管理方式来组织网络上的资料,并提出了建立、存取与浏览网页的方法;建立了超文本标记语言;设计了超文本传输协议(HTTPHypertext Transport Protocol),用于获取超链接文件;使用统一资源定位器(URLUniform Resource Locator)来定位网络文件、站点或服务器。

2HTML工作原理

1HTML本质

HTML不是程序语言,而是一种标记语言。所谓标记,在有的书上也叫标签,从面向对象的角度而言,就是对浏览器对象的标识的意思。它用来控制文字、图片等浏览器的子对象在浏览器中的表现,以及如何建立文件之间链接的标记,这些标记均放在文本格式的文件中。而程序与之最大的不同,就是可用来控制操作系统或应用程序执行并完成某项作业。超文本标记语言的文档应该尽量做到,从形式上看,无论在任何操作系统的任何浏览器上打开都具有相同的效果。

2HTML的基本结构

其基本结构分为三部分:

Ÿ 版本声明,即序(Prologue

Ÿ 头部(Head

Ÿ 主体(Body

其中,主要部分是头部和主体。

【例2-1Web文档基本HTML结构标记

2-1.htm源代码:

<!--

代码内容:Web文档基本HTML结构标记

    :孙寿龙

    :20050907

-->

<HTML>

       <HEAD>

              <TITLE>这里写网页的标题</TITLE>

       </HEAD>

       <BODY>

              这里是网页的主体(显示在浏览器窗口中的部分)

       </BODY>

</HTML>

说明:

①标记一般成对出现:<开始标记></结束标记>,为了防止忘记写结束标记符,可采用成对书写,然后在中间插入的写法。

②放在HEAD标记内的信息一般不显示在浏览器的窗口中,通常这里面用来定义JavaScript函数,包含JavaScript代码文件,包含层叠样式表(CSSCascading Style Sheets)文件等一些预处理工作。

BODY标记内通常放上需要表示或展示内容的标记格式。

HTML中的注释:

       第一种格式:<!注释内容>。其中,注释内容中不可出现“>”,常用于说明标记里的内容;

       第二种格式:<!--注释内容-->。其中,注释内容中可包括“>”在内的任何符号,常用于注释大段的内容。

HTML编辑软件:只要是文本编辑器或自带HTML编辑器的软件,就可以用来编写HTML文件,也可以使用HTML专用编辑器如Dreamweaver等来编辑HTML。可通过使用HTML专用编辑器快速生成一个HTML的基本结构;快速学习并掌握HTML语言。

⑥标记符中的字母,如<HTML>中的HTML,大小写不敏感,建议统一大些或小写使用。

⑦文件的扩展名:若仅含有HTML代码,一般以.htm为扩展名;若仅含有JavaScript代码,这种文件常作为.htm文件的包含文件(引用文件,类似于C程序文件中的头文件)一般以.js为扩展名;若含HTML代码和JavaScript代码,一般以.htm为扩展名。

(3)HTML标记简介

1)基本标记(Basic Tags

Ÿ <HTML></HTML>  定义整个超文本文档(网页)对象,描述Web页面的起始与终止。

Ÿ <HEAD></HEAD>  设置页面的头部分,用来包含当前文档的一些相关信息。如定义样式、网页的标题、网页中使用的脚本语言以及对搜索引擎有帮助的关键字。

Ÿ <TITLE></TITLE>  用来指明文件的标题,其内容将显示在浏览器的标题栏内,设置它的好处:可为下载时提供默认的文件名;可为搜索引擎提供搜索关键字。

Ÿ <BODY></BODY>  放置Web页面的正文内容,包含文件内的文字、超链接文字的颜色、背景色彩、图片、动画、影像、音效等几乎所有对网页的展示功能。

Ÿ <META>  用来介绍与文件内容相关的信息。每一个<META>标记用于指明一个名称或数值对,常常放在头部标记中。

2)文本、字符格式(Text & Char Format

Ÿ <Hn></Hn>  标题文字(n=1~6

Ÿ <BR>  换行标记

Ÿ <P></P>  段落标记

Ÿ <HR>  水平线标记

Ÿ <FONT FACE=”字体名称”  SIZE=”大小”  COLOR=”颜色名或颜色值”>字符串</FONT>  设置字符串的字体、大小、颜色

 颜色名:red,green,blue,yellow,black,white等。

 颜色值:格式为#rrggbb,其中,r,g,b分别用十六进制数表示的红、绿、蓝三种颜色,如#FF0000表示红色,而#6CB0A6表示一种青色。

Ÿ 字符格式标记

<B></B>  粗体

<I></I>  斜体

<U></U>  加下划线

<STRONG></STRONG>  着重强调

<SUP></SUP>  定义上标

<SUB></SUB>  定义下标

3)超链接(Hyperlink

标记<A href=URL” … ></A>表示一个超链接元素。超链接的属性主要有超链接地址、超链接文件打开的窗口位置,都在其开始标记中定义。

【例2-2】超链接标记

2-2.htm源代码:

<A  href="http://nc.dzu.edu.cn/article/show.php?id=139" target="_blank" >ASP,PHP,JSP之比较</A>

其中,

href即超链接地址,其值为http://211.64.32.2/dsks/index.php

target即窗口位置,对其值_blank而言,浏览器接收到服务器211.64.32.2发来的文件ndex.php,将在一个新浏览器的窗口中显示。

超链接一般简称链接。

4)表格(Table

常用表格来精确定义页面文本或图片等的排版格式、排版布局,以使整齐美观。

<TABLE></TABLE>  定义一个表格

<TR></TR>  定义表格内的一行

<TD></TD>  定义一行内的一个单元格

5)表单(Form

表单的概念同VBVFVC等程序设计语言,它是浏览器收集、发送用户所填数据的一种浏览器对象(控件),就像一部货车,一艘轮船,它本身不承载数据,而是通过包含表单对象(就像轮船上的集装箱)这些可以盛放数据的数据容器来承载数据,传送数据,从这个角度来看,它实际上是一个盛放数据容器的容器。

表单是B/S程序中人机交互界面的主要形式。从服务器的角度来看,或者说从服务器程序编写人员来看,表单及表单对象的名称(即其NAME属性名)被服务器看作变量来接收,称作表单变量;表单变量的值即用户在客户端表单对象中填写的数据。

表单的一般标记有:

Ÿ 表单本身:<FORM  NAME=form1  ACTION=chuli.php  METHOD=POST ></FORM>  定义表单,其中:

属性ACTION的值起指明将表单中数据提交(发送的意思)的方向,即服务器上的某个处理程序。

属性METHOD指明提交数据的方法,常用POSTGET

Ÿ <INPUT>  输入型表单对象

  ①文本字段,类似于VBVFVC里的文本框控件,基本标记形式如下:

  <input name="textfield" type="text" value="这里是文本字段的值">

  ②隐藏域,设计时可见,运行时不可见的文本字段,程序员常用它向FORMACTION指向的文件传送变量。

<input type="hidden" name="hiddenField">

  ③文本区域,类似于VBVFVC里的文本框控件,基本标记形式如下:

<textarea name="textarea" cols="25" rows="5">这里是文本区域的值</textarea>

  ④单选按钮,类似于VBVFVC里的单选按钮控件(有人也称之为无线按钮),作用是在同名的多个单选按钮中提供单项选择。

  ⑤复选框,作用是在同名的多个复选框中提供多项选择。

  ⑥列表/菜单域,概念等同于VBVFVC里的下拉列表框。<SELECT></SELECT>

⑦提交表单型表单按钮,标记形式:

<INPUT  TYPE=submit  VALUE=”提交”>  作用是将表单中的数据提交到表单属性ACTION的值所指向的服务器端程序,由服务器端程序处理

⑧重置型表单按钮,标记形式:

<INPUT  TYPE=reset  VALUE=”重新填写”>  作用是清空表单中每个输入域中的数据,等待用户重新输入。

⑨定制型表单按钮,标记形式:

<INPUT TYPE=button VALUE=”转到教学网站” ONCLICK=window.location= http://211.64.32.2/dsks’ ”>  作用是执行用户指定的函数、过程。这里,用户通过指定该按钮的单击事件处理过程为:将当前页面跳转到教学网站主页。

【例2-3FORM标签示例

2-3.htm源代码:

<form name="form1" method="post" action="2-3.php">

  姓名:<input name="xm" type="text"><br>

  简介:<textarea name="jj" cols="25" rows="5"></textarea><br>

  性别:

  <input type="radio" name="xb" value="1">

  <input type="radio" name="xb" value="0">

  <br>

  爱好:

  <input type="checkbox" name="ah" value="1">运动

  <input type="checkbox" name="ah" value="2">音乐

  <input type="checkbox" name="ah" value="3">旅游<br>

  今天要去哪里逛一逛:

  <select name="where">

    <option value="你未选择任何地方!" selected>请选择</option>

    <option value="http://211.64.32.2/dsks">孙寿龙教学网站</option>

    <option value="http://www.dzu.edu.cn">德州学院网站</option>

    <option value="http://www.163.com">网易</option>

  </select>

  <br>

  <input type="hidden" name="hiddenField">

  <br>

  <input type="submit" name="Submit" value="提交">

  <input type="reset" name="Submit2" value="重置">

  <input type="button" name="Submit3" value="定制">

</form>

向服务器请求2-3.htm的结果见图10

10 FORM标签示例

以上介绍了HTML的常用标记,美国麻省理工学院(MITMassachusetts Institute of Technology)计算机科学实验室的WWW标准化组织W3C(又称万维网联盟W3C),是HTML的先锋,其互联网地址为:http://www.w3.org。有关HTMLCSSXML语言的各种最新的、权威的、官方的资料,在该网站均可查到。

3.JavaScript工作原理

HTML代码所表示的文档是一种静态文档,几乎没有交互功能,很难使页面成为动态页面。增加脚本语言,可使数据发送到服务器之前先进行处理和校验,动态地创建新的Web内容,更重要的是,引入脚本语言使我们有了事件驱动的软件开发环境。

1JavaScript简介

JavaScript的原名叫LiveScript,是NetScape公司在引入Sun公司有关Java的程序设计概念后,重新设计而更名的。JavaScript是一种可以嵌入HTML文档的,基于对象并具有某些面向对象特征的脚本语言。

说明:浏览器端脚本语言除了JavaScript,还有VBScriptJscript,后两个是Microsoft公司设计的,欲了解相关内容,可到Microsoft公司网站查询。本课程仅介绍JavaScript

2JavaScript的特点

JavaScript是一种基于对象(Object-Based)和事件驱动(Event Driven),由浏览器解释执行的,具有安全性能的客户端脚本语言。使用它的目的是与HTMLJava AppletJava小程序)一起实现在一个Web页面中链接多个对象,与Web客户交互作用,从而可以开发客户端的应用程序等。它是通过嵌入在HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是JavaHTML折衷的选择,具有以下几个基本特点:

Ÿ 是一种脚本语言

采用小程序段的方式实现编程,以嵌入的方式,与HTML标识结合在一起,方便用户的使用操作。

Ÿ 基于对象的语言。

这里的对象,是指客户机、浏览器、网页文档。也就是说,JavaScript以类似CJava的语法,以客户机、浏览器、网页文档、文档内部各种以标记表示的HTML元素为对象,以控制这些对象为目标,进而控制整个客户端的一种客户端脚本编程语言。

Ÿ 简单

首先它是一种基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一种非常好的过渡。其次它的变量类型是采用弱类型,并未使用严格的数据类型。

Ÿ 安全

它不允许访问服务器本地的硬盘,因此不能将数据存入到服务器上;不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。

Ÿ 动态

它可以直接对用户的输入做出响应,无须经过Web服务程序。它对用户的响应,是采用以事件驱动的方式进行的。事件(Event)可分为两类,一是用户对浏览器进行的某种操作,比如按下鼠标、移动窗口、选择菜单等,可以视为用户事件;二是系统事件,如时间的时刻变化等。当事件发生后,会向浏览器发送相应的消息(用户消息或系统消息),根据消息,浏览器可能会做出相应的响应,这种响应称为事件驱动,也叫消息驱动。

Ÿ 跨平台

JavaScript代码由浏览器解释执行,与操作环境无关,只要能运行浏览器的计算机,并支持JavaScript的浏览器就可正确执行,从而实现了“编写一次,走遍天下”的梦想。

实际上JavaScript最杰出之处在于可以用很小的程序做大量的事。无须有高性能的电脑,软件仅需一个字处理软件及一浏览器,无须WEB服务器通道,通过自己的电脑即可完成所有的事情。

JavaScript Java 很类似,但并不一样。Java 是一种比JavaScript 更复杂许多的程序语言,而 JavaScript 则是相当容易了解的语言。许多 Java 的特性在 Java Script 中并不支持。

3JavaScript的工作原理

1JavaScript的工作原理

JavaScript编程可以完成诸如构造动画,动态菜单等使页面更加生动、活泼的任务(实例见洪恩在线:http://www.hongen.com/pc/homepage/javascript/index1.htm),还可以对客户机文件系统、注册表等进行操作,如对文件夹、文件的建立,复制,删除,修改注册表,锁定注册表,锁定浏览器等等,有许多随着网页打开而运行的病毒就是含在网页中的JavaScript程序在作怪。由此可见,JavaScript是控制客户机的精灵。

B/S程序中,为了均衡负载,减轻服务器的计算负担,凡是不需要服务器程序做的工作,可尽量交给客户端程序(如JavaScript程序)去做。我们用HTML标记构造出用户界面,用户通过界面输入数据,向浏览器请求数据等操作。在用户输入数据,或者是输入完毕,将数据向服务器提交的时候,对数据的检验等任务完全可交给JavaScript程序来完成。本课程主要介绍此类任务的JavaScript编程技术。

通过JavaScript脚本检验FORM数据

JavaScript的工作原理,就是以基于对象和一些面向对象的特征:

Ÿ JavaScript通过控制客户机上各种对象的方式,控制客户机,对客户机进行操作。

Ÿ 根据用户或系统事件,做出相应的响应。

第二节 Web客户端基本技术

1.数据传递

1)客户端向服务器传递数据的方法:POSTGET

浏览器向服务器进行数据传送,若使用FORM,常用的传送数据的方法是GETPOST

GET方法通过URL请求来传递用户的输入,形式:URL?var_name1=value1&var_name2=value2,即将表单内各字段名称与其内容,以成对的字符串连接,置于表单ACTION 属性所指的URL 后,如http://211.64.32.2/login.php?name=abc&password=123,数据都会直接显示在 URL上,就像用户点击一个链接一样;POST 方法通过 HTTP POST 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由ACTION 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理。

②通过GET方法提交数据,可能会带来安全性的问题。比如一个登陆页面,当通过GET方法提交数据时,用户名和密码将出现在URL上。如果登陆页面可以被浏览器缓存或其他人可以访问客户的这台机器。那么,别人就可以从浏览器的历史记录中,读取到此客户的账号和密码。所以,在某些情况下,GET方法会带来严重的安全性问题。

GET方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 POST 方法好;而POST 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。使用PHP,默认的POST_MAX_SIZE2M(通过配置php.ini实现),如果你想利用POST方式上传软件,就需要更改这个值了(我设置为20M仍然能够正确上传文件),但是倘若试图使用GET方式,就没有可能实现这种功能。

建议在FORM中,使用POST方法。

下列情况表明传递数据使用的是GET方法:

Ÿ 在地址栏中进行GET请求

在地址栏中使用请求形式:URL?var_name1=value1&var_name2=value2……。

http://nc.dzu.edu.cn/article/show.php?id=139(其中URLhttp://nc.dzu.edu.cn/article/show.php),

作用:向URL所指向的程序文件show.php传递一个变量,变量名为id,变量值为139,该程序将从数据库中取出有关id139的那条新闻的信息,表示成HTML代码后返回给请求者的浏览器。

在地址栏中进行GET请求的情况

Ÿ 单击了一个链接。

  【例2-4】通过链接传递数据的HTML标记

2-4.htm源代码:

<A  href="http://nc.dzu.edu.cn/article/show.php?id=139" >ASP,PHP,JSP之比较</A>

Ÿ FORMMETHOD属性,使用GET属性值

2)小结

PHP的角度看,浏览器向服务器传递数据:

使用表单对象时,$表单对象名=表单变量。

使用URL?参数名=参数值时,$参数名=查询字符串(querystring)变量。

如【例2-3】中,用户在文本字段textfield中输入的数据,发送到FORMACTION指向的服务器程序2-3.php后,2-3.php将接收到表单变量$textfield和该变量内的值。

当在超链接地址或地址栏采用URL?var_name1=value1&var_name2=value2……形式时,var_name1var_name2等是查询字符串变量。

另外,一个服务器程序,也称页,对接收到的表单变量或查询字符串变量,都作为页内局部变量处理,本页程序执行完毕,这些变量统统自动释放,所以不能将这些变量传递到另外一个PHP程序中去,即不能跨页传递。就像接力棒比赛中,不能跨人传棒。

既然默认情况下,不能将x.php中的$a传到y.php,要想将x.php中的局部变量$a传到程序y.php,可借助于隐藏域:在x.php中用表单中的隐藏域,临时存储$a的值,然后提交表单到y.php,即可实现向y.php发送数据的目的。

具体做法一般是这样:

x.php:

<form action=y.php method=post>

<input type=hidden name=a value=<? echo $a;?>>

<input type=submit value=”提交”>

<input type=reset value=”重置”>

</form>

这时,从请求服务的角度来看,x.php就是客户端程序,y.php就是服务器程序了。

2.JavaScript嵌入HTML的方式

C语言非常相似,但去掉了C语言中有关指针等容易产生的错误,并提供了功能强大的类库。对于已经具备C语言的人来说,学习JavaScript脚本语言是一件非常轻松愉快的事。

JavaScript的脚本包括在HTML中,它成为HTML文档的一部分。与HTML标识相结合,构成了一个功能强大的Internet网上编程语言。

1JavaScript嵌入HTML的方法

1)块嵌入:显式的JavaScript脚本块嵌入的方法

JavaScript块:

<Script Language ="JavaScript">

JavaScript语句1

JavaScript语句2

……

</Script>

说明: 通过脚本语言开始标记<Script>和脚本语言结束标记</Script>指明JavaScript脚本源代码块。

     通过属性Language ="JavaScript"说明标记中是使用的何种语言,这里是JavaScript语言, 表示在JavaScript中使用的语言。

嵌入的地方:

Ÿ 嵌入<head></Head>中:在主页和其余部分代码之前装载,从而可使代码的功能更强大;

Ÿ 嵌入<Body></Body>中:以实现某些部分动态地创建文档。

下面是将JavaScript脚本块加入Web文档中的例子:

【例2-5】将JavaScript脚本块加入Web文档

2-5.htm源代码:

<HTML>

<Head>

<Script Language ="JavaScript">

document.write("hello,world");

//document.close();注释方式同CPHP

</Script>

</Head>

</HTML>

在浏览器的窗口中调用2-5.htm,则显示“hello,world”字串。见图所示。

JavaScript脚本输出的hello,world

说明:

document.write()是文档对象的输出函数,其功能是将括号中的字符或变量值输出到窗口;

document.close()是将输出关闭。

在实际应用中,常常将自定义的JavaScript函数放在<head></Head>中,JavaScript脚本块形成这个样子:

<Script Language ="JavaScript">

function  fun1(参数表){

 JavaScript语句集

}

function  fun2(参数表){

 JavaScript语句集

}

 

……

</Script>

2)包含文件:为了避免<head></Head>JavaScript脚本块过大导致的网页文档代码过长,还可采取一种形式类似C程序,在头部包含JavaScript代码的做法:

<HEAD>

<script  language=JavaScript  src=abc/xyz.js></script>

</HEAD>

xyz.js中的内容即具体的JavaScript脚本块。

3)隐式的嵌入方式

不进行声明或仅进行简短声明,直接用于事件驱动的处理程序中。

【例2-6】直接用于事件处理代码中的JavaScript脚本

2-6.htm源代码:

<input type="button" name="Submit3" value="单击我" onClick="javascript:alert('hello,world');">

<!--或:

<input type="button" name="Submit3" value="单击我" onClick="alert('hello,world');">

-->

直接用于事件驱动中的JavaScript脚本

显然这种方式对于较短的事件处理JavaScript代码很适用,若这种代码较长,应采取块嵌入或包含文件的方法。

3.客户机对象技术

JavaScript的工作原理可以看出,为了更好地完成控制操作和做出响应动作,JavaScript编程者必须清楚地了解常用的客户机对象。

1)对象的基础知识

1)使用对象的什么:使用对象的属性、事件、方法。在JavaScript中,属性,表示对象的性质的值,往往用“对象名.属性名”的形式引用;事件往往用“on事件名”来侦测、标识,表示“当……的时候”;方法是对象发出的动作,往往用“对象名.方法名()”的形式使用。

2)如何获得(引用)对象:一个对象要真正地被使用,可采用以下几种方式获得该对象:

«  引用JavaScript内部对象(常用)

«  引用浏览器对象(常用)

«  创建新对象,然后引用之

即对象使用之前必须存在,要么创建新的对象,要么利用现存的对象。

JavaScript内部对象:JavaScript built-in Object,即JavaScript语言本身的对象,如eval(字符串)——返回字符串表达式中的值。

浏览器对象:如窗口WINDOW,文档DOCUMENT、表单FORM等,它们之间是分层次的树状关系,反映这种关系的模型,称作文档对象模型(DOMDocument Object Model)。

文档对象模型

创建新对象:

格式:新对象名=new  已存在对象名(参数表);

如:

var now = new Date();

var year = now.getYear();

alert(‘现在是’+now);

alert(‘今年是’+year);

2)对象的引用方式

n 自引用

指对象的自我引用,用关键字this代指自己。

【例2-7】使用this关键字进行自引用

2-7.htm源代码:

<CENTER>【例2-7this关键字的使用</CENTER>

今天要到哪里去逛一逛?<br>

<input type="radio" name="where" value="http://211.64.32.2/dsks" onClick="alert('网址:'+this.value);">孙寿龙教学网站<br>

<input type="radio" name="where" value="http://www.dzu.edu.cn" onClick="alert('网址:'+this.value);">德州学院<br>

<input type="radio" name="where" value="http://www.163.com" onClick="alert('网址:'+this.value);">网易

this关键字的使用

n 按层次引用:按文档对象模型层次进行引用

按层次引用引用的基本模式是:父对象.子对象,如:

window.alert(window.document.form1.textfield1.value);

其中,当前窗口可不用指明window对象,所以上一行代码常常写成这个样子:

alert(document.form1.textfield1.value);

DOM层次引用对象的适用条件:应明确知晓父子关系和各自名称。

n 按下标引用。适用于对象集合的处理,同名对象的集合按该名字命名的数组,通过数组下标的访问引用每个对象,下标从0开始。使用场合:同名单选按钮组、复选框组等,组内各成员的引用。

【例2-8】以遍历数组的形式引用对象

2-8.htm源代码:

<html>

       <head>

              <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

              <title>【例2-8】以遍历数组的形式引用对象</title>

              <script language="javascript">

                     function func2_8(){

                     var mychoice="";

                     for(var i=0;i<document.form1.ah.length;i++){

                        if(document.form1.ah[i].checked)

                             mychoice=mychoice+document.form1.ah[i].value+"";

                     }

                     alert("你的选择是:"+mychoice);

              }

              </script>

       </head>

       <body>

              <form name="form1" method="post" action="">

                     爱好:<br>

                     <input type="checkbox" name="ah" value="运动">运动

                     <input type="checkbox" name="ah" value="音乐">音乐

                     <input type="checkbox" name="ah" value="旅游">旅游<br>

                     <input type="button" name="Submit" value="看看我选择了什么" onClick="func2_8();">

              </form>

       </body>

</html>

说明:数组元素的个数,即数组的长度,用“数组名.length”引用数组的长度属性值length得到。

以遍历数组的形式引用对象

n 按名引用。同类型但不同名的对象集合内各成员,可通过这种方式引用。

【例2-9】按名引用对象

2-9.htm源代码:

<html>

       <head>

              <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

              <title>【例2-9】按名引用对象</title>

              <script language="javascript">

                     function func2_9(){

                     var xm="";

                     var nl="";

                     var dw="";

                     xm=document.form1.elements["xm"].value;

                     nl=document.form1.elements["nl"].value;

                     dw=document.form1.elements["dw"].value;

                     alert("你填写的是:\n\n姓名:"+xm+"\n年龄:"+nl+"\n单位:"+dw);

              }

              </script>

       </head>

       <body>

              <form name="form1" method="post" action="">

                     姓名:<input type="text" name="xm"><br>

                     年龄:<input type="text" name="nl"><br>

                     单位:<input type="text" name="dw"><br>

                     <input type="button" name="Submit" value="看看我填写了什么" onClick="func2_9();">

              </form>

       </body>

</html>

按名引用对象

类似地,也可通过document. Forms[]数组来引用在同一个页面上多个表单中的某个表单,例如,

将第一个表单中名为textfield1的文本框赋值123

document.forms[0].textfield1.value=123;

2)事件及事件处理

①基本概念

通常鼠标或热键的动作我们称之为事件(Event),而由鼠标或热键引发的一连串程序的动作,称之为事件驱动(Event Driver)。驱动,在这里就是引发,触发的意思。这些动作,就是对事件进行处理的程序或函数,我们称之为事件处理程序(Event Handler)。其基本格式与函数全部一样,可以将前面所介绍的所有函数作为事件处理程序。格式如下:

Function 事件处理名(参数表){

事件处理语句集;

}

可以使用自己编写的函数作为事件处理程序,也可以使用JavaScript中内部的函数,还可以直接使用JavaScript的代码等,如例2-6

②主要事件

n onClick——单击

当用户单击鼠标按钮时,产生onClick事件,同时onClick指定的事件处理程序将被调用执行。在很多对象中产生:

Ÿ button(按钮对象):包括

«  reset button(重置型按钮)

«  submit button(提交型按钮)

«  radio (单选按钮或无线按钮)

Ÿ checkbox(复选框或检查框)

Ÿ 超链接

……

使用方法大同小异,参考【例2-6】即可。

n onChange——数据被更改

下列情况将触发相关对象的onChange事件:

text元素输入的字符值改变时

texturea元素输入的字符值改变时

select元素选项改变后

【例2-10onChange事件的处理

2-10.htm源代码:

<html>

       <head>

              <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

              <title>【例2-10onChange事件的处理</title>

              <script language="javascript">

                     function func2_10(textname,textvalue){

                            alert("文本框"+textname+"的值被改成了"+textvalue)

                     }

              </script>

       </head>

       <body>

              修改这些文本框中的值,看看会发生什么事情:<br>

              <input name="textfield1" type="text" onChange="func2_10(this.name,this.value);"><br>

              <input name="textfield2" type="text" onChange="func2_10(this.name,this.value);">

       </body>

</html>

onChange事件

更多事件的详细介绍,请参考相关资料,在此不再赘述。

3)常用JavaScript内置对象的使用

按数据类型可分为:字符串(string)对象、算术函数(math)对象、日期(Date)对象

按使用时是否需要创建实例可分为:静态对象和动态对象。

静态对象:在引用其属性或方法时不需要为它创建实例,如string(字符串);

动态对象:在引用其属性或方法时必须为它创建一个实例,如Date(日期)。

基本使用格式:对象名.属性名

对象名.方法名()

1)串对象

①属性。只有一个属性,即length。它表明了字符串中的字符个数,包括所有符号。例:

②方法。共有19个,主要用于串在Web页面中的显示、字体大小、字体颜色、字符的搜索以及字符的大小写转换等。

其中,常用方法如下:

Ÿ 显示的控制方法

afontsize(size)字体大小:作用同HTML字体标签。

语法:fontsize(size)  其中,1size7

bbold()粗体字

cItalics()斜体字

Ÿ 字体颜色;fontcolor(color)

Ÿ 大小写转换

toLowerCase()小写转换,toUpperCase()大写转换。

Ÿ 取指定位置的字符:charAt(index),,0index≤串.长度-1

Ÿ 定位字符首次出现位置:indexOf(characterfromIndex)

从指定formIndtx位置开始,在串中搜索character首出现的位置,0formIndex≤串.长度-1

Ÿ 定位字符末次出现位置:lastIndexOf(characterfromIndex)

从指定formIndtx位置开始,在串中搜索character末次出现的位置,0formIndex≤串.长度-1

Ÿ 取子串:substring(start,end)

取下标为[startend)的子串。

start>end,返回下标为[startend)的子串;

start=end返回空串

start>end,返回下标为[startend)的子串

Ÿ 上标:sup(),作用同HTML上标标签

Ÿ 下标:sub(),作用同HTML下标标签

【例2-11JavaScript串对象的使用

2-11.htm源代码:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>【例2-11JavaScript串对象的使用</title>

</head>

<script language="javascript">

       document.write("<center>【例2-11JavaScript串对象的使用</center>");

       document.write("<br>");

      

       sa="hello";

       sb="world";

       document.write("sa"+sa);

       document.write("<br>");

       document.write("sb"+sb);

       document.write("<br>");

        

       document.write("sa的长度:"+sa.length);

       document.write("<br>");

      

       document.write("sa设成7号字体:"+sa.fontsize(7));

       document.write("<br>");

      

       document.write("sa变红色:"+sa.fontcolor("red"));

       document.write("<br>");

      

       document.write("sa变大写:"+sa.toUpperCase());

       document.write("<br>");

      

       document.write("sa中首次出现字母l的下标位置="+ sa.indexOf("l",0));

       document.write("<br>");

        

       document.write("sa中末次出现字母l的下标位置="+ sa.lastIndexOf("l",0));

       document.write("<br>");

      

       document.write("sa.substring(0,2)="+ sa.substring(0,2));

       document.write("<br>");

        

       document.write("sa.substring(2,0)="+ sa.substring(2,0));

       document.write("<br>");

      

       document.write("sa.substring(2,2)="+ sa.substring(2,2));

       document.write("<br>");

      

       document.write("sa.charAt(2)="+ sa.charAt(2));

       document.write("<br>");

      

       document.write("sb输出为上标:"+sb.sup());

       document.write("<br>");

      

       document.write("sb输出为sa的上标:"+sa+sb.sup());

       document.write("<br>");

      

       document.close();

</script>

<body>

</body>

</html>

 

2)系统函数

JavaScript中的系统函数又称内部方法。它提供了与任何对象无关的系统函数,使用这些函数不需创建任何实例,可直接用。

方法名:eval(字串表达式)

作用:返回字符串表达式中的值

例:

test=eval("8+9+5/2");//test=19.5

4)窗口对象的使用

有关输入可通过窗口(Window)对象来完成,而输出可通过文档(document)对象的方法来实现。

【例2-14】窗口的简单例子

2-14.htm源代码:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>【例2-14】窗口的简单例子</title>

</head>

<body>

<script languaga="JavaScript">

       var yourinput=window.prompt("请输入数据:","这里是默认数据");

       document.clear();

       document.write("你刚才输入的是:"+yourinput);//输出流

       document.close();//关闭输出流

</script>

</body>

</html>

窗口的简单例子

其中window.prompt()是窗口对象的一个方法,作用是,当装入Web页面时,在屏幕上显示一个具有“确定”和“取消”的对话框,让你输入数据。document.write是文档对象的一个方法,作用是实现Web页面的输出显示。

 

窗口对象在DOM中的层次:顶层

 

1)属性:主要用来对浏览器中存在的各种窗口和框架的引用

Ÿ parent:指明当前窗口或框架的父窗口。

Ÿ defaultStatus:窗口的状态栏的默认显示值。

Ÿ status:窗口状态栏信息。

Ÿ top:引用顶层窗口。

Ÿ window:指的是当前窗口

Ÿ self:当前窗口自引用。

Ÿ frames 框架集合

Ÿ location 窗口中文档地址

框架,窗口的窗口,可以理解为子窗口,实现一个窗口的分隔,注意以下几点:

frames中各frame是通过HTML标识<frame>的顺序来引用的,它包含了一个窗口中的全部帧数。

②框架本身是窗口的子窗口,继承了窗口对象所有的全部属性和方法。

 

2)方法:主要用来提供信息或输入数据以及创建一个新的窗口。

Ÿ open():将文档输出到一个新窗口中去。

语法格式:window.open(新窗口的文档来源,新窗口名称,新窗口特征参数);

可以创建一个新的窗口。其中参数表提供有窗口的主要特性和文档及窗口的命名。

表 新窗口特征参数

新窗口特征参数名

设定值

含 义

toolbar

yes/no

窗口中是否含有标准工具栏

location

yes/no

窗口中是否含有地址栏

directions

yes/no

窗口中是否含有文件夹按钮

status

yes/no

窗口中是否含有状态栏

menubar

yes/no

窗口中是否含有菜单栏

scrollbar

yes/no

窗口中是否含有滚动条

revisable

yes/no

能否调整窗口

width

像素值

确定窗口的宽度

height

像素值

确定窗口的

说明:yes/no也可以换成1/0;参数之间用逗号分隔。

例如:window.open(abc/xyz.htm,xyz,toolbar=no,status=no,resizable=no);xyz为窗口名称,在其中输出文档abc/xyz.htm,窗口xyz不带有工具栏、状态栏,不允许调整大小,其他特征采用浏览器对窗口的默认设定值。

Ÿ alert():输出一个具有“确定”按钮的消息框,用来向用户显示消息,一旦按“确定”钮后,方可继续执行其他脚本程序,因此也可作为调试程序的手段。

语法格式:window.alert(消息);

常常采用简化格式:alert(消息);

Ÿ confirm():输出一个具有“确定”和“取消”按钮的 确认框,获取用户确认信息。

语法格式:window.comfirm(消息);

Ÿ prompt():输出一个允许用户输入信息的输入框。

语法格式:window.prompt(“提示信息”,默认值)

Ÿ close():关闭当前窗口

  语法格式:window.close();

 

3)事件

窗口对象对应于HTML文档中的<body><frame>两种标识;

Ÿ onload事件:装入Web文档

Ÿ onunload事件:卸载Web文档

如下代码标识的文档,当打开时和关闭时,都有相应的消息显示。

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title></title>

</head>

<body onload="alert('欢迎光临!');"  onunload="alert('欢迎再来!');">

</body>

</html>

(5)文档(document)对象

属性:

Ÿ bgColor 网页背景颜色

Ÿ fgColor 网页前景颜色,即网页中文字的颜色

Ÿ forms 网页中表单的集合

Ÿ lastModified 网页最后修改日期

Ÿ linkColor 网页中超链接文字颜色

Ÿ links 网页中超链接的集合

Ÿ location 网页文档地址

Ÿ title网页文档的标题,即<title></title>中的内容

方法:

Ÿ clear () 清空文档内容

Ÿ write(字符串) 输出字符串

Ÿ writeln(字符串) 输出字符串,然后换行

事件:

Ÿ onload事件:装入Web文档

Ÿ onunload事件:卸载Web文档

 

第三节 实验二 Web客户端技术

实验目的:掌握基本的Web客户端技术

实验要求:掌握基本HTML设计和JavaScript编程技术

实验环境:

实验室已经安装好如下实验环境

操作系统:Windows98

Web服务器:Apache 1.3.14 安装路径:c:\Apache 默认发布文档路径:c:\Apache\htdocs

PHPPHP 4.0.4 安装路径:c:\php

脚本编辑器:Macromedia Dreamweaver MX中文版、记事本或UltraEdit10简体中文版

注意:使用以上脚本编辑器,若要保存为.php文件,必须在保存时指明扩展名为.php

尤其是记事本,必须在保存时,单击“保存类型”下拉框,选择“所有文件(*.*)”类型,然后指定文件扩展名是.php,单击“保存”按钮后,保存的文件才能保证是.php文件。常见错误是直接保存,导致保存的文件其实是文本文件,如abc.php.txt等以.txt为扩展名的文本文件。

 

实验内容:

Ÿ 本章实例程序(代码可从教学网站下载):【例2-1~【例2-14

实验方法:

1)编写程序:录入或下载本章实例程序或附加试验程序,保存到发布文档目录

2)阅读程序:结合讲义等资料,阅读理解这些程序,也可根据自己需要修改这些程序

3)观摩效果:在浏览器中通过HTTP协议方式请求这些程序文件(而不是在我的电脑或资源管理器中打开)

做法:http://localhost/要访问的文件,回车


第三章 PHP语法

本章主要介绍PHP基本语法,为进一步控制客户端表示,和操纵数据库做准备。

第一节 基本语法

1.最简单的PHP程序

【例3-1】最简单的PHP程序(3-1.php

3-1源程序

该例作用是PHPApache送出一个字符串常量,内容是hello,world,再由Apache将其送到给向客户端的浏览器,由浏览器来解释执行。浏览器接收到的内容如图所示,可通过浏览器的查看菜单单击源文件来看到。

3-1浏览器收到的代码

由于hello,world不是HTMLJavaScript等浏览器能解释的客户端代码,所以它只能被浏览器原样输出到浏览器窗口中。在浏览器窗口中看到的最终结果如图所示。

3-1浏览器执行结果

2.剖析最简单的PHP程序

3-1源程序3-1.php中:

1PHP语言标记符:<?PHP语言开始标记符,?>是结束标记符,二者之间的部分是PHP代码。

注意:

PHP语言标记符有多种,<? ?>是最为精简的一种,为简便起见,本课程采用这种标记符。

<? ?>中的PHP代码与<? 以及 ?>至少应有一个空格或回车,以便PHP语言解释器能正确区分它们。

2)变量:$aPHP变量。变量名区分大小写。

变量的表示:一个美元符号跟一个变量名称。

有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。

例如,$a是一个变量,$A是不同于$a的另一个变量。$a$_a$_a123_123_a是合法变量,$123a不合法。

变量的声明:使用前不需要声明数据类型,其类型由所存储的数据决定,即所用即所声明。

PHP 在变量定义中不需要明示的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果你把一个字符串值赋给变量 varvar 就成了一个字符串。如果你又把一个整型值赋给 var,那它就成了一个整数。

3)字符串常量:"hello,world"PHP字符串常量。

4)赋值运算:一个等号=”表示赋值运算。

5)语句结束符:分号“;”是语句结束符,这一点也同C语言。

6)关键字:echoPHP关键字,是PHP的内置函数名,可换成print。许多PHP编程者常使用只有4个字母的echo

注意:

①关键字echo等不区分大小写;

②同C语言,PHP是函数化语言,echo关键字就是echo()函数的函数名,echo $a也可写为echo($a)print($a)

7)注释:本例采用的是C/C++语言形式的注释方法,常用于简短的行注释。行注释也可采用Unix Shell语言的注释方法,即把“//”换成“#”即可。多行注释的方法与C语言同。

总结:例3-1的程序,虽然简单,但基本浓缩了PHP的语法要素,其形式与C语言类似甚至更简单。

3.常用变量处理函数

1gettype——获取变量类型

语法格式:string gettype ( mixed var )

返回 PHP 变量var的类型。

常见的返回的字符串的可能值为:

boolean

integer

double

string

array

object

resource

NULL

2)判断变量是否为某种类型

is_int -- 检测变量是否是整数

语法格式:

bool is_int ( mixed var )

描述:

如果 var integer 则返回 TRUE,否则返回 FALSE

: 若想测试一个变量是否是数字或数字字符串(如表单输入,它们通常为字符串),必须使用 is_numeric()

其他常用的,判断变量是否为某种类型的函数:

is_bool()

is_float()

is_integer()

is_numeric()

is_string()

is_array()

3unset -- 释放给定的变量

语法格式:

void unset ( mixed var [, mixed var [, ...]] )

描述:

unset() 销毁指定的变量。

 

<?

// 销毁单个变量

unset ($foo);

 

// 销毁单个数组元素

unset ($bar['quux']);

 

// 销毁一个以上的变量

unset ($foo1, $foo2, $foo3);

?> 

 

unset():删除数组或数组元素

: unset() 函数允许取消一个数组中的键名。要注意数组将不会重建索引。

<?

$a = array( 1 => 'one', 2 => 'two', 3 => 'three' );

unset( $a[2] );

/* 将产生一个数组,定义为

   $a = array( 1=>'one', 3=>'three');

   而不是

   $a = array( 1 => 'one', 2 => 'three');

*/

$b = array_values($a);

// 现在数组 $b array(0 => 'one', 1 =>'three')

?> 

4empty -- 检查一个变量是否为空

描述

bool empty ( mixed var )

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""0"0"NULLFALSEarray()var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

除了当变量没有置值时不产生警告之外,empty() (boolean) var 的反义词。参见转换为布尔值获取更多信息。

 

例子 empty() isset()(检测变量是否设置)的一个简单比较。

<?

$var = 0;

 

// 结果为 true,因为 $var 为空

if (empty($var)) { 

    echo '$var is either 0 or not set at all';

}

 

// 结果为 false,因为 $var 已设置

if (!isset($var)) {

    echo '$var is not set at all';

}

?> 

 

5var_dump -- 打印变量的相关信息

语法格式:

void var_dump ( mixed expression [, mixed expression [, ...]] )

描述:

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

var_dump() print_r()常用于程序调适,前者会显示更多的信息。

例子 var_dump() 示例

<?

$a = array (1, 2, array ("a", "b", "c"));

var_dump ($a);

 

/* 输出:

array(3) {

  [0]=>

  int(1)

  [1]=>

  int(2)

  [2]=>

  array(3) {

    [0]=>

    string(1) "a"

    [1]=>

    string(1) "b"

    [2]=>

    string(1) "c"

  }

}

 

*/

 

$b = 3.1;

$c = TRUE;

var_dump($b,$c);

 

/* 输出:

float(3.1)

bool(true)

 

*/

?>

 

6print_r ——打印关于变量的易于理解的信息。

语法格式:

bool print_r ( mixed expression )

描述:

print_r() 显示关于一个变量的易于理解的信息。如果给出的是 stringinteger float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。

记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。

 

<?

    $a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));

    print_r ($a);

?>

 

上边的代码将输出:

Array

(

    [a] => apple

    [b] => banana

    [c] => Array

        (

            [0] => x

            [1] => y

            [2] => z

        )

)

4.访问客户端变量的方法

注意:在B/S程序中,客户端指浏览器Browser端。

从第二章第二节可以了解到:

PHP的角度看,浏览器向服务器传递数据:

使用表单对象时,$表单对象名=表单变量。

使用URL?参数名=参数值时,$参数名=查询字符串(querystring)变量。

一个简单的 HTML 表单

x.htm

<form action="x.php" method="POST">

    姓名:<input type="text" name="username"><br>

    电子邮件:<input type="text" name="email"><br/>

    <input type="submit" name="submit" value="提交" />

</form>

根据特定的设置和个人的喜好,有很多种方法访问客户端变量,这里仅介绍常用的两种方法:

例:访问POST表单变量(简称POST变量)

x.php

<?

//①直接使用客户端变量(学习使用)

//PHP配置文件中 指令 register_globals = on 时可用。不过

//为提高服务器安全性和提升性能

// PHP 4.2.0 起默认为 register_globals = off

// 在实际应用中,不提倡使用/依赖此种方法。

   echo $username;

 

// ②通过超全局变量数组引用表单变量的方式(实际应用)

// PHP 4.1.0 起可用

   echo $_POST['username'];//username是通过GET方法传递的,这里应将$_POST换成$_GET

   echo $_REQUEST['username'];

?>

通过GET方法传递:当表单采用GET方法,或username为查询字符串变量时。

 

关于第二种,首先要弄清楚变量的传递方法(POST/GET),然后通过相应的超全局变量数组($_POST/$_GET)来引用,为方便页内使用,可先转成简单变量的形式,如$username=$_POST['username'],然后再使用

 

第一种方法不用管客户端传递数据的方法,按名访问即可,较为简单。因实验条件原因(实验室Win95下安装的PHP版本为4.0.4),同时考虑到方便学习,本课程采用第一种:直接使用客户端变量的方法。

 

5.PHP变量的作用域

按照PHP变量的定义方式,PHP变量的分类和相应的作用域分别为:

1)客户端变量:主要是表单变量、查询字符串变量等,由客户端编程人员设计、定义、提交的变量。

     作用域是一个PHP页。

2)服务器端程序员变量:在PHP程序中程序员定义的变量,如例3-1中的$a

     作用域是一个PHP页。

3)预定义变量:由PHP自己定义好的变量,变量名是固定的,存储在$_SERVER$_ENV等部分超全局数组中。作用域是全局。

6.超全局变量数组

PHP 4.1.0 起,取得客户端变量的首选方法是通过引用超全局变量数组中的元素。超全局变量数组元素包含了来自 Web 服务器(如果可用),运行环境,和用户输入的数据(客户端变量)。

其中,

1)存有客户端变量的数组:

$_POST:通过 HTTP POST 方法传递的变量组成的数组。

$_GET:通过 HTTP GET 方法传递的变量组成的数组。

$_COOKIE:通过 HTTP cookies 传递的变量组成的数组。

$_REQUEST:此数组包含 $_GET$_POST $_COOKIE 中的全部内容。

$_FILES:通过 HTTP POST 方法传递的已上传文件项目组成的数组。

$_SESSION:包含当前脚本中 session 变量的数组。

 

2$GLOBALS:由所有已定义的全局变量组成的数组。变量名就是该数组的索引。

3$_SERVER:存储来自 Web 服务器信息的数组,是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组由Web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些新的信息。

 

常用的$_SERVER数组元素:

PHP_SELF

当前正在执行脚本的文件名,与document root 相关。

例如,在URL 地址为 http://www.sunshoulong.cn/abc/xyz.php 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到/abc/xyz.php这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。

 

使用格式:(注意大小写敏感)

echo $PHP_SELF;//php.iniregister_globals=On

echo $_SERVER[PHP_SELF]; //php.iniregister_globals=Off

 

以下使用形式同上,仅解释意义:

 

SERVER_NAME:服务器名字

SERVER_SOFTWAREWeb服务器软件名称

DOCUMENT_ROOT:发布文档主目录

HTTP_HOST:服务器主机名

SERVER_PORT:服务器Web服务端口

以上五个对应Apache配置文件中的相应参数

 

HTTP_USER_AGENT:客户端浏览器信息

REMOTE_ADDR:客户机地址

REMOTE_HOST:客户机主机名

以上三个存有服务器获取的正在访问客户机的信息

 

相关PHP函数:

gethostbyaddr --  根据客户IP得到客户主机名

语法格式:

string gethostbyaddr ( string ip_address )

例:

<?

$hostname=gethostbyaddr($_SERVER['REMOTE_ADDR']);

echo “你的计算机主机名是:”.$hostname;

?>

 

gethostbyname --  根据给定的主机名(域名)得到IP

语法格式:

string gethostbyname ( string hostname )

例:

<?

$ip = gethostbyname('ilong');

echo “主机名为ilong的计算机的IP地址是:”.$ip;   //211.64.40.187

echo <br>;

$ip = gethostbyname('www.dzu.edu.cn');

echo  “域名为www.dzu.edu.cn的计算机的IP地址是:”.$ip;   // 211.64.32.1

?>

7.数据类型

仅选择介绍如下几种:

n 原始类型

« 4种标量类型:

布尔型(boolean

整型(integer

浮点型(float)(浮点数,也作“double”)

字符串(string

« 1种复合类型:

数组(array

« 2种特殊类型:

资源(resource

NULL

n 2种伪类型:

mixed   mixed 说明一个参数可以接受多种不同的(但并不必须是所有的)类型

number  number 说明一个参数可以是 integer 或者 float

 

1)布尔型(boolean

这是最简单的类型。boolean 表达了真值,可以为 TRUE FALSE

语法

指定布尔值:使用关键字 TRUE FALSE。两个都是大小写不敏感的。

<?

$a = TRUE; // 指定 TRUE $a

?>

布尔值的检测:

<?

// 这样检测无必要

if ($a == TRUE) {

  echo "to do something";

}

//只需简单地这样检测

if ($a) {

  echo "to do something";

} 

真值和假值的情况:

FALSE

布尔值 FALSE

整型值 0(零)

浮点型值 0.0(零)

空白字符串和字符串 "0"

没有成员变量的数组

没有单元的对象

特殊类型NULL(包括尚未设定的变量)

TRUE

所有其它值都被认为是 TRUE(包括任何资源)

包括-1 和其它非零值(不论正负)

2)整型(integer

整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。

如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x

<?

$a = 1234; // 十进制数

$a = -123; // 一个负数

$a = 0123; // 八进制数(等于十进制的 83

$a = 0x1A; // 十六进制数(等于十进制的 26

?> 

3)浮点型(float

浮点数(也叫“floats”,“doubles”或“real numbers”)可以用以下任何语法定义:

<?

$a = 1.234;

$a = 1.2e3;

$a = 7E-10;

?>

4)字符串型(string

string 是一系列字符。

常用两种方法定义:单引号、双引号。

单引号

指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来。

要表示一个单引号,需要用反斜线(\)转义;要表示一个反斜线,需要用两个反斜线表示。

<?

// 输出结果:Tom said: "I'll be back"

echo 'Tom said: "I\'ll be back"';

 

//输出结果:Will you want to delete C:\*.*?

echo 'You deleted C:\\*.*?';

 

//输出结果:将不会把 \n 转义为换行

echo '将不会把 \n 转义为换行';

 

$a=abc;

//输出结果: 变量名$a也不转义为变量$a的值abc

echo '变量名$a也不转义为变量$a的值abc';

?> 

 

双引号

如果用双引号(")括起字符串,PHP 支持更多特殊字符的转义序列:

转义字符

序列

含义

\n

换行

\r

回车

\t

制表符

\\

反斜线

\$

美元符号

\"

双引号

\[0-7]{1,3}

此正则表达式序列匹配一个用八进制符号表示的字符

\x[0-9A-Fa-f]{1,2}

此正则表达式序列匹配一个用十六进制符号表示的字符

注意:试图转义任何其它字符,反斜线本身也会被显示出来。

双引号字符串最重要的一点是其中的变量名会被变量值替代。

<?

$a=abc;

//输出结果: 变量名abc转义为变量abc的值abc

echo '变量名$a转义为变量$a的值abc';

?> 

 

变量解析

当用双引号指定字符串时,其中的变量会被解析。

如果遇到$PHP会尽可能多地取得后面的字符以组成一个合法的变量名。若要显示地指明变量名,用花括号把变量名括起来。 应明确双引号中变量名,以免发生变量解析错误。

<?php

$beer = 'TsingTao';

echo " $beer:中国啤酒名牌"; //出错,这里用的是中文冒号

echo " $beer : 中国啤酒名牌"; //正常工作,这里用的是中文冒号,但在冒号前加了个空格

echo " $beer: 中国啤酒名牌"; //正常工作,英文冒号: 是无效变量标识符

echo "$beer's taste is great"; //正常工作, 单引号’是无效变量标识符

echo "He drank some $beers";   //出错, 's' 是有效的变量标识符

echo "He drank some ${beer}s"; //正常工作,使用花括号强制指明变量名

echo "He drank some {$beer}s"; //正常工作,使用花括号强制指明变量名

?> 

5)数组型(array)

定义数组: array()

可以用 array() 语言结构来新建一个array。它接受一定数量用逗号分隔的 key => value 参数/值对。

array(key_1=>value_1key_2=>value_2,……)

// key_n可以是 integer 或者 string

// value_n可以是任何值

 

例如:

<?

$a = array("foo" => "bar", 12 => true);

 

echo $arr["foo"]; // bar

echo $arr[12];    // 1

?> 

键名:key,即数组元素的下标

键值:value,即数组元素的值

如果键名是一个 integer 的标准表达方法,则被解释为整数(例如 "8" 将被解释为 8,而 "08" 将被解释为 "08")。key 中的浮点数被取整为 integerPHP 中没有不同的数字下标和和关联下标数组,数组的类型只有一种,它可以同时包含整型和字符串型的下标。

注意:如果方括号内没指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果制定的键名已经有值了,该值将被覆盖。

如:

<?

// 有些键没有指定健名的数组

array(5 => 43, 32, 56, "b" => 12);

 

// 上数组等同于这个数组

array(5 => 43, 6 => 32, 7 => 56, "b" => 12);

?> 

value值可以是任何值。

数组元素的修改:

语法格式:

$arr[key] = value;

$arr[] = value;

// key 可以是 integer 或者 string

// value 可以为任何值。

如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。

数组元素和数组的删除:

unset(数组名[键名])  删除数组元素

unset(数组名)  删除整个数组

例:

<?

$arr = array(5 => 1, 12 => 2);

$arr[] = 56; // 本行等价于 $arr[13] = 56;

$arr["x"] = 42; // 增加一个新的元素,键名为"x"

unset($arr[5]); // 将键名为5的元素删除

unset($arr);    // 将整个数组删除

?> 

常用数组实用函数、语句结构

有相当多的实用函数作用于数组,更多资料,可参见有关资料中的数组函数库部分。

Ÿ count -- 统计数组中的元素的个数

语法格式:

int count (数组名)

count() 例子

<?

$a[0] = 1;

$a[1] = 3;

$a[2] = 5;

$result = count ($a);

// $result == 3

 

$b[0] = 7;

$b[5] = 9;

$b[10] = 11;

$result = count ($b);

// $result == 3;

?> 

Ÿ foreach ——控制结构:遍历数组

两种语法格式:

第一种格式

foreach (array_expression as $value)

statement

遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式

foreach (array_expression as $key => $value)

    statement

做同样的事,只除了当前单元的键值也会在每次循环中被赋给变量 $key

Ÿ list——把数组中的值赋给一些变量

语法格式:void list ( mixed ... )

list() 用一步操作给一组变量进行赋值。 list() 仅能用于数字索引的数组并假定数字索引从 0 开始。

例: list() 例子

<?

$info = array('张三', '', '25');

 

// 取出数组$info中所有元素值,分别赋值到三个变量中

list($name, $sex, $age) = $info;

print "$name $sex 性,今年$age \n";

 

//取出数组$info中部分元素值,分别赋值到相应变量中

list( , , $age) = $info;

print "张三今年$age \n";

?> 

6)资源型

一个资源是一个特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

资源类型变量用于保存打开文件、数据库连接、图形画布区域等的特殊句柄。

以数据库应用为例,在同时有众多的数据库连接存在时,要进行查询和关闭连接等操作,必须指明这些操作是对哪个连接的,所以有必要给每个连接赋予一个标识值,一般是整数。这种标识值的数据类型称为资源型。

具体应用见第四章。

7NULL 

特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL

在下列情况下一个变量被认为是 NULL

被赋值为 NULL

尚未被赋值。

unset()

语法

NULL 类型只有一个值,就是大小写敏感的关键字 NULL

8.运算符

1)算术运算符

加(+)、减(-)、乘(*)、除(/)、取模(求余:%

$a % $b:取模运算,求$a 除以 $b 的余数。

除号(“/”)总是返回浮点数,即使两个运算数是整数(或由字符串转换成的整数)也是这样。

: 取模 $a % $b $a 为负值时的结果也是负值。

2)赋值运算符

基本的赋值运算符是“=”。

适合于所有二元算术和字符串运算符的“组和运算符”例如:

<?

$a = 3;

$a += 5; // sets $a to 8, as if we had said: $a = $a + 5;

$b = "Hello ";

$b .= "There!"; // sets $b to "Hello There!", just like $b = $b . "There!";

?> 

3)错误控制运算符

错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

4)比较运算符

为避免出错,$a若与$b类型不同,请先转换成同类型,再比较。

比较运算符:相等(==)、不等(!=<>)、小于(<)、小于等于(<=)、大于(>)、大于等于(>=

5)逻辑运算符

与(and&&)、或(or||)、非(!)、异或(xor

6)字符串连接操作符

连接运算符(“.”):

$c=$a.$b,它将$a$b拼接成一个新的字符串$c

连接赋值运算符(“.=”):

$a.=$b,它将字符串$b的内容附加在字符串$a的后面。

<?

$a = "Hello ";

$a.= "World!";     // now $a contains "Hello World!"

?> 

9.函数

主要分为系统函数、用户自定义函数。

1)系统函数。PHP定义的系统函数十分丰富,多达162个函数库,用于162方面的处理。如上述用于变量检测、数组循环等,分别属于变量处理函数库和数组函数库。用户按照说明使用即可。

常用的是:数组函数库、变量函数库、字符串处理函数库、MySQL 函数库(将在第四章介绍)、时间日期函数库、HTTP 相关函数库、数学函数库。

数组函数库、变量函数库中的常用函数已经在前面介绍,下面介绍其余函数库中常用的函数。

Ÿ 字符串处理函数库

int strlen (字符串名) – 得到字符串的长度

substr()——截取子串

string substr (string string, int start [, int length] )

. substr()基本用法

<?

echo substr('abcdef', 1);     // bcdef

echo substr('abcdef', 1, 3);  // bcd

echo substr('abcdef', 0, 4);  // abcd

echo substr('abcdef', 0, 8);  // abcdef

echo substr('abcdef', -1, 1); // f

?> 

如果start 是负数, 将从母串的末尾开始反向截取

<?

$rest = substr("abcdef", -1);    // returns "f"

$rest = substr("abcdef", -2);    // returns "ef"

$rest = substr("abcdef", -3, 1); // returns "d"

?> 

ord()——取字符的ASCII

int ord ( string string )

str()——取ASCII码对应的字符

string chr ( int ascii )

trim()——去掉串首串尾的空格

string trim ( string str)

ltrim()——去掉串首的空格

string ltrim ( string str)

rtrim()——去掉串尾的空格

string rtrim ( string str)

explode()——将字符串拆分成数组

array explode ( string separator, string string)

此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。

如果 separator 为空字符串(""),explode() 将返回 FALSE。如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组。

. explode() 示例

<?

// 示例 1

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";

$pieces = explode(" ", $pizza);//注意这里用空格作为分隔符,而不是空字符串

echo $pieces[0]; // piece1

echo $pieces[1]; // piece2

?>

 

implode()——将数组元素联成字符串

string implode ( string glue, array pieces )

<?

$array = array('lastname', 'email', 'phone');

$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

?> 

 

Ÿ 时间日期函数库

date()——格式化一个本地时间/日期

string date ( string format )

表 常用格式字符串(format)

format

说明

返回值例子

Y

4 位数字年份

例如:1999 2003

m

2位数字月份

01 12

d

2位数字,月份中的第几天

01 31

H

2位数字小时,24 小时格式

00 23

i

2位数字分钟

00 59

s

2位数字

00 59

 

<?

// 假设现在的服务器时间是: 2001310日,5:16:18 pm

$today = date("Ymd");  // 20010310

$time = date("H:i:s"); // 17:16:18

$todaytime1=date(YmdH:i:s);// 2001031017:16:18

$todaytime2=date(Y-m-dH:i:s);// 2001-03-1017:16:18

$todaytime3=date(Ymd日,H:i:s秒”);// 20010310日,17:16:18

?> 

date()具有类似功能的函数是getdate(),可供参考使用。

Ÿ HTTP 相关函数库

header(string)函数

向浏览器发出头信息。

头信息 (header) 是服务器以 HTTP 协议输出HTML到浏览器前所送出的字串,在头信息与 HTML 文件之间尚需空一行分隔。

函数 header()函数需要在输出流中增加头信息,但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如HTML)的输出。

如果你的PHP程序中需要输出 HTML(如要使用echo等输出什么东西时 )前,也需要使用header()函数,那么,要先用header()函数输出所有的头信息,否则会出错。

可能会返回的错误消息:

Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。

 

头信息参数string的形式:常见的头信息有下面三种之一,并只能出现一次。

Location: URL(掌握)

Content-Type: xxxx/yyyy

Status: nnn xxxxxx

 

header(Location:URL)

作用:服务器直接向浏览器发送一个网络地址为URL的页面。

举例:

<?

Header("Location: http://www.dzu.edu.cn");

exit;

?>

作用类似于JavaScriptwindow.location=URL,但后者是浏览器向URL中的服务器请求这个URL,该服务器受到这个请求后,将该服务器上地址为URL的页面返回给浏览器,整个过程是请求-响应(两段),前者仅响应(一段)。

Ÿ 数学函数库

floor -- 向下取整

语法格式:float floor ( float value )

返回不大于 value 的下一个整数,将 value 的小数部分舍去取整。floor() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

floor() 例子

<?

echo floor(4.3);   // 4

echo floor(9.999); // 9

?> 

ceil -- 向上取整

语法格式:float ceil ( float value )

返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

ceil() 例子

<?

echo ceil(4.3);    // 5

echo ceil(9.999);  // 10

?> 

2)用户自定义函数

定义的语法格式

<?

function function_name($arg_1, $arg_2, ..., $arg_n)

{

    echo "Example function.\n";

    return $retval;

}

?> 

尽量在被调用之前定义

可放在包含文件中,用包含文件即可实现定义。

10.session的应用

1session的概念

1)使用session的意义:

HTTP是一种无状态会话(请求/响应),没记性的协议。每次会话结束,所有的数据都将不复存在。例如你又从这页转到了别的页,HTTP也就忘记了你刚才的状态。如何使它记住个别客户(浏览器)的状态,PHP提供了一种session变量,可实现持续状态的会话。

session变量可以让我们继续使用以前的页面数据,好像服务器已经记住了或者说跟踪了我。因此,可以在PHP程序文件之间传递数据(数值、字符串、数组和对象)。当用户在应用程序的页间进行跳转时,session变量不会释放(在设定的session存活期时间内,一般为180分钟,可自行在php.ini设定session.cache_expire的值)。

由此可见,session变量存储的是个别浏览器端专用的数据。当用户浏览Web站点时,使用session变量可以为每一个用户保存指定的数据。任何存储在用户session变量中的数据可以在用户调用下一个页面时取得。

实际应用中,在身份认证、操作监控、客户消费偏好跟踪等许多需要持续会话的场合,应用广泛。

2)基本原理:

服务器使用唯一的session标志码字符串命名的小文件,来存储跟踪客户数据,每个客户一个文件,每个文件名均不相同,每个客户的数据均集中存储在他那个session变量文件中。每个客户的session变量存储在一个单独的以标志码命名的文本文件中,如sess_d8c46f13d7d346e53a621bb5e82eeb13(无扩展名,可用记事本打开)。

session文件的内容:四维数组

从上图可见,有关某一个客户的session变量都被集中到了一起,形成了一个四维数组。该数组中每个元素的下标(键名)就是变量名,其余三位分别是该元素的类型、长度、具体的值。

这些文件在服务器设定的目录下。

2session变量的使用

准备工作:

①必须建立或指定一个文件夹供PHP存放session变量文件。

该文件夹路径、名字任意(一般为tmp)。

如:d:\tmpd:\abc\pqr\xzy

②要告诉PHP这个存放session变量文件的路径:在PHP配置文件php.ini

设置session.save_path= d:/tmp或其他文件夹,注意这里用正斜线/,是Unix系统中目录的写法。

 

在程序中使用:通过专门的函数进行。

一般的顺序和使用的函数如下:

session_start——初始化 session

语法: boolean session_start();

本函数初始化一个新的session,若该客户数据已在 session 之中,则连上原session。本函数返回值均为 true

注意:在程序中,该函数的使用必须在任何向浏览器输出之前。

session_register——注册新的session变量

语法: boolean session_register(string name);

本函数增加一个变量到当前客户的session变量数组中。参数 name 即为欲加入的变数名。成功则返回 true 值。

 

③象使用一般PHP变量一样使用session变量,

echo $s_name.,你好!”等等。

 

④不使用时,基于安全的原因,应及时释放,最简洁的方法顺序如下:

首先,unset掉每个session变量元素

unset($s_name)unset ($_SESSION['varname'])

删除名为s_name的那个session变量。

或说,删除了键名为s_name的那个session数组中的元素。

本质:销毁变量的内存空间

注意:不要 unset($_SESSION),这样将会使 $_SESSION 不能发挥作用().

然后,destroysession文件

session_destroy()——删除session文件

语法: session_unset()

本质:删除变量的外部存储空间

 

例:x.php

<?

……

session_start();//初始化session,在这之前,不要向浏览器输出任何东西

session_register("s_name");//注册新的session变量s_name

$s_name=”孙寿龙”;//s_name赋值

……

Header("Location:y.php");//转到y.php页,注意:在此之间不能向浏览器输出任何东西

?>

 

y.php

<?

……

session_start();//初始化session,若当前客户session已存在,则读取其中的各个变量,以便下文使用

echo “当前用户是:”.$s_name;;//当前用户是:孙寿龙

……

unset($s_name);//销毁该元素所占内存(从内存中删除该元素)

session_destroy();//删除session文件

echo “当前用户是:”.$s_name;;//当前用户是:(空)

……

?>

 

第二节 PHP编程要点

1.流程控制结构

1)基本结构ifswitchwhileforbreakcontinueC语言,详细用法参见有关资料,此处略。

2exitdie

exit([string message]):输出消息message后终止脚本的执行。若省略message,则什么也不输出就终止了脚本的执行,这时,可以不带括号。

例如:用于调试,查看$a中的内容是否为空串,是则中断执行,同时输出消息

if($a=””)

  exit($a是空串!);

dieexit的别名,作用同exit

注意:exitdie都是用于控制语句流程的关键字,不是函数,因此不具备返回值的能力。

3)包含文件

require(“要包含的文件”)

include(“要包含的文件”)

两者具有相同的目的:包括并运行指定文件,类似于C程序中包含头文件的作用。

若要包含的文件找不到,include() 产生警告后继续执行,而 require() 则会报错并停止。因此,要想在丢失文件时停止处理页面,那就需要用 require()

通常使用require()

注意

require()include()都是语言结构,用于流程控制的,不是函数。

②由于它们包含进来的是文件(一般是多条代码的集合),为保证主程序的逻辑流程正确,在条件语句中使用必须将其放在语句组中(花括号中)。

例:基本的 require() 例子

<?

require(database_open.php);//database_open.php专门用于连接,打开数据库

……

require(database_close.php);//database_close.php专门用于关闭与数据库的连接

?> 

2. PHP嵌入HTMLJavaScript

使用四种不同的PHP语言标记符,嵌入PHP代码。

其中两种:<?php ?> <script language="php"> </script> 总是可用的。

另两种是

短标记:<? ?> php.ini 配置文件的指令 short_open_tag=on时可用。

ASP 风格标记<% %>,在 php.ini 配置文件的指令 asp_tags =on时可用。

例子:

1<?php echo '若要服务于XMLXHTML应用,请采用这种标记符'; ?>

2<script language="php">

        echo '有些编辑器如frontpage不支持这种标记格式';

    </script>

3<? echo '这是最简练的标记格式'; ?>

4<% echo '这是ASP风格的标记格式'; %>

注意:

Ÿ PHP代码与PHP语言开始标记符和结束标记符之间,至少应有一个空格或回车,以便PHP语言解释器能正确区分它们。

Ÿ 如果将 PHP 嵌入到 XML XHTML 中则需要使用 <?php ?> 以保持符合标准。

Ÿ 在以下情况应避免使用短标记:开发需要发行的程序或者库,或者在用户不能控制的服务器上开发。因为目标服务器可能不支持短标记。为了代码的移植及发行,确保不要使用短标记。

Ÿ 凡嵌有PHP代码的程序文件,应具有Apache能正确识别的PHP文件扩展名(在Apache配置文件中可查),以便Apache能将其提交给PHP去解释执行。

Ÿ 本课程采用短标记:<? ?>

 

例子:PHP嵌入HTMLJavaScript

PHP程序通过数据库查询成绩,查询结果存放到一个数组$cj中,这个数组的情况如下:

2维,即2列,分别是:学号,成绩

5个元素,即5

整个数组表示成二维表格形式是:

下标

学号

成绩

0

1

1

1

2

2

2

3

3

3

4

4

4

5

5

现在要求输出这个查询结果为网页。

解:采用PHP嵌入HTML的方法

 

<?

//查询数据库,将查询结果保存到数组$cj

//以上过程代码略

//为演示方便,用下面直接赋值的方式代替以上过程

$cj=array(0=>array("1","1"),

          1=>array("2","2"),

          2=>array("3","3"),

          3=>array("4","4"),

          4=>array("5","5"),

);

?>

<html>

<head>

<title>hello,world</title>

</head>

<body>

<center>查询结果</center>

<table border=1 align=center>

  <tr><td>学号</td><td>成绩</td></tr>

  <? for($i=0;$i<count($cj);$i++){?>

    <tr><td><? echo $cj[$i][0];?></td><td><? echo $cj[$i][0];?></td></tr>

  <? }?>

</table>

</body>

</html>

保存成PHP文件,从浏览器请求的结果为:

思考:

1)数据量的问题。假如从数据库查询的结果不止5个呢?例如是1000个,若采用手工编写HTML代码生成表格的方法,显然很费事。

2)数据处理频度问题。假如每天有500用户查询,且每次查询时间不确定,若采用手工编写HTML代码生成表格的方法,显然更费事,费神。

而采用PHP程序输出表格,无上述2点限制,只要服务器在运行。

3.PHP输出HTMLJavaScript

HTMLJavaScript书写的客户端代码都是文本符号,可用PHP输出他们。

上例可改成:

<?

//查询数据库,将查询结果保存到数组$cj

//以上过程代码略

//为演示方便,用下面直接赋值的方式代替

$cj=array(0=>array("1","1"),

          1=>array("2","2"),

          2=>array("3","3"),

          3=>array("4","4"),

          4=>array("5","5"),

);

echo "<html>";

echo "<head>";

echo "<title>PHP嵌入HTML/PHP动态输出</title>";

echo "</head>";

echo "<body>";

echo "<center>查询结果</center>";

echo "<table border=1 align=center>";

echo "<tr><td>学号</td><td>成绩</td></tr>";

for($i=0;$i<count($cj);$i++)

  echo "<tr><td>".$cj[$i][0]."</td><td>".$cj[$i][0]."</td></tr>";

echo "</table>";

echo "</body>";

echo "</html>";

?>

效果同上例。

再例:输出JavaScript的例子

<?

//用户验证程序

//将用户提交的帐号和密码

//与数据库中的用户帐号和密码比对

//一致,则令$logon_flag=1

//否则,令$logon=0

//以上过程代码略

 

if($logon_flag==0)

  {  echo "<script language='javascript'>";

     echo "alert('对不起,帐号或密码错误!');";

     echo "history.back();";

     echo "</script>";

  }

if($logon_flag==1)

  {

     session_start();

     session_register("s_name");

     $s_name=$username;// $username

        //进入系统

    Header("Location:index1.htm");

  }

?>

 

4.自服务程序

B/S程序多采取客户端程序和服务器程序分离的形式,也可以将二者程序文件合成一个程序。将请求和响应合成的程序,可称自服务程序。

 

例:

<?

if($a=="")

  echo '$a 是空的';

if($a!="")

  echo '$a='.$a;

?>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>无标题文档</title>

</head>

 

<body>

<form name="form1" method="post" action="<? echo $PHP_SELF;?>">

  请输入$a<input name="a" type="text">

  <input type="submit" name="Submit" value="提交">

</form>

</body>

</html>

说明:

1)上例中,实现合成的关键就是通过定义表单的action指向本文件来实现。

2)上例中,头6行用于接收处理客户端数据。这些代码可放置到后面的<body></body>中,也可放到该程序的末尾部分。

3)这种客户端程序和服务器程序二合一的写法,仅适合代码量不大的情况。若合成后的程序代码冗长,还是分开的好,以提高可读性。

第三节 实验二 PHP语法实验

实验目的:锻炼使用PHP编程的基本能力

实验要求:掌握PHP基本语法;会进行客户端与服务器的混合编程

实验环境:

实验室已经安装好如下实验环境

操作系统:Windows98

Web服务器:Apache 1.3.14 安装路径:c:\Apache 默认发布文档路径:c:\Apache\htdocs

PHPPHP 4.0.4 安装路径:c:\php

脚本编辑器:Macromedia Dreamweaver MX中文版、记事本或UltraEdit10简体中文版

实验内容:

PHP语法:本章实例程序(见讲义)

 

实验方法:

1)编写程序:录入或下载本章实例程序或附加试验程序,保存到发布文档目录

2)阅读程序:结合讲义等资料,阅读理解这些程序,也可根据自己需要修改这些程序

3)观摩效果:在浏览器中通过HTTP协议方式请求这些程序文件(而不是在我的电脑或资源管理器中打开)

做法:http://localhost/要访问的文件,回车

 


第四章 MySQL数据库

第一节 MySQL的基本使用

1.数据库基础知识

数据库(DataBase):是现代数据处理的主要技术。

单个数据库可理解为多个表的集合。

数据库的类型:按数据间的关系,数据库可分为关系型、层次型、树状型。最常用的是关系型数据库。

数据库管理系统(DBMSDataBase Management System):是种软件,操作数据库的人机接口,对维护数据的安全性、完整性起重要作用。

2.MySQL简介

MySQL 是一个精巧、快速、多线程、多用户、安全和强壮的SQL数据库管理系统。

MySQL 主要目标是快速、健壮和易用。

MySQL的开发者,T.C.X公司:自1996年以来,我们一直都在使用MySQL,其中包含超过 40 个数据库,10,000个表,其中500多个表超过7百万行,这大约有100 个吉字节(GB)的关键应用数据。

MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。

由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐,特别是与ApachePHP结合,为建立基于数据库的动态网站提供了强大动力。

Unix OS/2 平台,MySQL是免费的;但对微软平台,你在30 天的试用期后必须获得一个MySQL 许可证。

对初学者而言,它的易用性更是显而易见。

MySQL 主页提供有关MySQL的最新信息。http://www.mysql.com/

3.MySQL的命令操作

MySQL数据库管理系统,采用C/S结构,由一个服务器程序mysqld.exeNT平台下为mysqld-nt.exe)和很多不同的客户程序和库组成。

mysql.exe:客户命令监控/解释程序(环境)。

在这些客户程序中,mysql.exe是最常用的一个。它相当于MS-DOS操作系统的命令解释程序command.com,作用是对用户发出的命令进行语法检查,检查无误,向服务器提交这些命令请求,接受和向用户返回服务器执行的结果反馈信息;检查中若发现用户发出的命令不合法,则拒绝向服务器提交命令,同时返回出错信息。

mysql.exe是在MS-DOS或命令提示符下使用的一种客户端工具,通过命令的方式操纵服务器。

MySQL数据库管理系统中的C/S结构

注意:mysql.exe可以安装在远程主机上,不一定必须和服务程序在一起。

以下说明的前提:安装了MySQL,启动了服务程序。若这部分工作没有做,参考第一章第三节实验中有关内容现行完成准备工作。

1)登录和注销

登录:通过客户端程序mysql.exe与服务器程序建立信任连接。

建立连接时,需要提供客户机名,用户名,密码等参数,经服务器验证通过后,会返回成功建立连接的信息,表明连接成功。

 

启动客户端程序mysql.exe:在命令提示符或MS-DOS下,进入d:\mysql\bin,键入命令mysql回车。

若出现类似如下结果:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 26 to server version: 3.23.43

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

则表明连接成功。

mysql命令的完整形式是:

mysql h servername u username p

参数说明:

-h  指明主机,省略此参数,则默认为 localhost

localhostMySQL服务器,在服务器看来,它所在的机器就是localhost,即本地机。

-u  指明用户名(账号)

-p  使用密码

上面键入的命令mysql后面不带任何参数,这是因为MySQL安装完毕后,系统数据库mysql中的权限表user中,存在默认的空帐号、无密码的超级用户,因此可以从远程主机使用mysql.exe匿名访问服务器主机。

 

注销:即断开当前与服务器的连接,键入exit回车即可。

 

注意:

“命令+参数;”是命令语句行的一般形式。

mysql.exe环境下,使用的命令不区分大小写。

命令的末尾必须带语句结束符——分号,以便让mysql.exe正确区分、解释、执行一个完整的语句。

 

2)数据库操作

Ÿ 创建数据库

基本句法:CREATE DATABASE db_name;

db_name是要创建的数据库的名字。

该语句执行成功后,会在服务器的MySQL数据目录(即MySQL安装目录下的data目录)下面创建一个名为db_name的目录。

Ÿ 查看有哪些数据库

基本句法:SHOW DATABASES;

Ÿ 打开数据库(选定数据库)

基本句法:USE db_name;

若要对表进行查询,修改,删除等操作,必须先打开数据库。

Ÿ 删除数据库

基本句法:DROP DATABASE [IF EXISTS] db_name;

DROP DATABASE删除数据库中的所有表和数据库。要小心地使用这个命令。

DROP DATABASE返回从数据库目录被删除的文件的数目。通常,这3倍于表的数量,因为每张表对应于一个“.myd”文件、一个“.myi”文件和一个“.frm”文件。

文件

作用

tbl_name.frm

表定义(表格)文件

tbl_name.MYD

数据文件

tbl_name.MYI

索引文件

3)表操作

Ÿ 创建表

基本句法:CREATE TABLE table_name(1定义,列2定义,…,列n定义);

Ÿ 查看有哪些表

基本句法:SHOW TABLES;

Ÿ 查看表结构

DESCRIBE table_name;

Ÿ 查看表中数据

SELECT FROM table_name [WhERE 条件子句]  [GROUP 分组子句]  [ORDER 条件子句]

Ÿ 修改表中数据

UPDATE table_name SET =新值 [WhERE 条件子句

Ÿ 删除表中数据

DELETE FROM table_name [WhERE 条件子句

3)权限操作

进行权限操作的帐户必须有进行此类操作的权限。

 

GRANT 权限列表 ON db_name. table_name TO "username"@ "host" [IDENTIFIED BY "password"]  [WITH GRANT OPTION ];

MySQL默认的超级用户帐号有root、空,且密码都为空。这使得别有用心的人很容易从网络上用mysql.exe连接进入,进行破坏活动。

为提高安全性,应在安装完后,迅速更改帐号密码或权限等。

每次更改完毕,必须使用flush privileges;语句通知服务器启用最新更改的帐号的权限验证用户。

 

给用户username(若不存在就新创建一个)从主机host以密码password访问数据库db_name中的表table_name的权限(ALL PRIVILEGESSELECTUPDATEDELETEDROPCREATEALTERFILEGRANT等)。

赋予ALL PRIVILEGES权限的用户,在其作用域(如某数据库之某表:db_name.table_name)内,是超级用户。

权限列表中,权限之间用逗号分隔。

可用符号“*”通配db_nametable_name,表示所有数据库或所有表。

可用符号“%”通配host,表示除本地机(localhost,服务器所在机器)外的所有主机。

如:

GRANT SELECT , INSERT , UPDATE , DELETE ON `test`. * TO "aaa"@"%" IDENTIFIED BY "aaa";

FLUSH PRIVILEGES ;

上两句的意思:授予用户aaa对数据库test内所有表的SELECT , INSERT , UPDATE , DELETE权限,允许他使用密码aaa,能从本地机localhost以外的所有主机登录服务器。

GRANT SELECT , INSERT , UPDATE , DELETE ON `test`. * TO "aaa"@"localhost" IDENTIFIED BY "aaa";

FLUSH PRIVILEGES ;

上两句的意思:授予用户aaa对数据库test内所有表的SELECT , INSERT , UPDATE , DELETE权限,允许他使用密码aaa,只能从本地机localhost登录服务器。

 

SET PASSWORD FOR "username"@ "host" = PASSWORD(password) 

以加密形式,更改用户username的密码

 

REVOKE ALL PRIVILEGES ON * . * FROM "username"@ "host";

收回用户username从主机host访问服务器上所有数据库中所有表的所有权限。

 

FLUSH PRIVILEGES;

刷新权限列表,通知服务器,启用最新权限,达到使更改后的权限起作用的目的。

4.MySQL的图形化客户端工具软件

为方便程序员或数据库系统管理员(DBA)对MySQL的操作,可采用一些图形化客户端工具软件。常用的有phpMyAdminEMSMySQLManager等。二者使用方法大同小异,这里只介绍phpMyAdmin

phpMyAdmin是一款使用PHP语言编制的基于Web使用的MySQL客户端工具软件。它功能比较丰富,在广大MySQL爱好者中得到了普遍赞誉。

安装

该软件安装包在教学网站提供下载。

将软件包解压,放到服务器的documentroot下,如果你设置的默认文档为index.php,则键入http://服务器地址/phpMyAdmin所在目录,回车即可出现phpMyAdmin的用户登录界面。

如果初次安装好MySQL,可采用默认超级用户的帐号和密码登录:

在用户名中输入帐号(如root),在密码框中输入密码(空,什么也不输入),回车或单击确定按钮,就会进入系统。

进入系统后,在Language下拉框中选择适合中国人的系统显示所用的字符集:Chinese Simplified(zh),然后就会出现中文界面:

单击左边的主目录,界面同上,可完成一些系统级操作,如权限管理,数据库管理,导出数据,更改密码,重新登录(登出)等。

左边主目录下边的数据库下拉框,提供了当前用户所能使用的全部数据库,可选择后进行相关操作。

具体操作,根据中文界面提示,自行学习掌握,这里不再描述。

第二节 用PHP操纵MySQL

前面我们介绍了通过客户端工具,如mysql.exephpMyAdmin,这些都是系统管理员或者程序员使用的,方便他们管理数据库或开发工作。但是,在应用系统中,对于普通用户,基于安全的考虑,我们不能允许他们这么做。一般的做法是通过编制程序,让用户通过程序,来操纵数据库,这样可以根据需要灵活地控制用户对数据库的操作:既能满足实现他们存取数据的应用需求,又能最大限度地。本课程中,将介绍使用PHP语言编制程序,让用户在网络上,通过这种程序来将他们的数据保存到数据库中,或实现修改、删除等对数据库的操作。

1.PHP数据类型:资源型

概念:一个资源是一个特殊变量,保存了到外部资源的一个引用。资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,一般用整数来标识。 这个句柄,好像一根管道,将编程语言与其引用的资源如数据库连接起来,二者的交互,在管道中进行,管道或句柄的代号,即一个正整数标识,就是资源型数据。

资源的释放:

在一个PHP程序的末尾,资源使用的所有外部资源都会被系统自动释放。如有需要,也可以使用某些释放资源的函数来显式地释放资源所占内存。

资源的建立:

同资源的释放类似,资源是通过专门的函数来建立和使用的。

2.PHP中用于操纵MySQL数据库的函数

PHP将对MySQL数据库的操作,如连接,断开,查询,修改,删除等,都封装成了函数,有些教材中也叫接口。

这些函数属于PHP手册中的“MySQL函数库”,常用的有以下几个:

Ÿ mysql_error

返回上一个 MySQL 操作产生的文本错误信息。

语法格式:

string mysql_error ( [resource link_identifier] )

返回上一个 MySQL 函数的错误文本,如果没有出错则返回 ''(空字符串)。如果没有指定连接资源号,则使用上一个成功打开的连接从 MySQL 服务器提取错误信息。

Ÿ mysql_errno

返回上一个 MySQL 操作中的错误信息的数字代码。

语法格式:

int mysql_errno ( [resource link_identifier] )

返回上一个 MySQL 函数的错误代码,如果没有出错则返回 0(零)。

注意以上两个函数仅返回最近一次 MySQL 函数的执行(不包括 mysql_error() mysql_errno())的错误文本或代码,因此如果要使用它们,确保在调用另一个 MySQL 函数之前检查它们的值。

Ÿ mysql_connect

打开一个到 MySQL 服务器的连接

语法格式:

mysql_connect($servername,$username,$password)

如果成功则返回一个 MySQL 连接标识,一般为资源型数据,失败则返回 FALSE

函数中参数的解释:

$servername:指明MySQL数据库所在的服务器主机名称,可用IP表示

$username:访问该服务器主机的帐号名称

$password:访问该服务器的密码

注意:

①不提供参数时使用以下默认值:

$servername=””(相当于$servername= 'localhost'

$username =””

$password =””

$servername参数可以包括端口号,如 "servername:port"

②可以在函数名前加上 @ 来抑制失败时产生的错误信息。

③一旦脚本结束,到服务器的连接就会被关闭,这点与PHP每到页末就释放简单变量和客户端变量相同。若要显式(强制)地释放该资源,可用 mysql_close()函数。应养成用完连接,及时释放连接的好习惯。

Ÿ mysql_close

语法格式:

bool mysql_close ( [resource link_identifier] )

如果成功则返回 TRUE,失败则返回 FALSE

mysql_close() 关闭指定的连接标识所关联的到 MySQL 服务器的连接。如果没有指定 link_identifier,则关闭上一个打开的连接。

通常不需要使用 mysql_close(),因为由mysql_connect打开的连接会在脚本执行完毕后自动关闭。但若在脚本中间用完后,提倡使用此函数及时连接资源,以提高效率。

例子 建立和关闭MySQL 连接例子

<?

    $server_link = mysql_connect("localhost", "root", "")//$server_link是资源型变量

                 or die("Can not connect: to server" . mysql_error());

    print ("Connected successfully");

    mysql_close($server_link);

?> 

Ÿ mysql_select_db("test",$server_link)

选择一个MySQL 数据库,使其成为当前数据库。一个数据库成为当前数据库,那么当前所有的操作都是针对它的。

语法格式:

bool mysql_select_db ( string database_name [, resource link_identifier] )

如果成功则返回 TRUE,失败则返回 FALSE

mysql_select_db() 设定与指定的连接标识符所关联的服务器上的当前数据库。如果没有指定连接标识符,则使用上一个打开的连接。如果没有打开的连接,本函数将无参数调用 mysql_connect() 来尝试打开一个并使用之。

 

例子 mysql_select_db() 例子

<?

$lnk = mysql_connect('localhost', 'mysql_user', 'mysql_password')

      or die("Can not connect: to server");

 

// 将数据库abc设置为当前数据库

mysql_select_db('abc', $server_link) or die ('Can\'t use abc : ' . mysql_error());

 

?> 

 

Ÿ mysql_query

发送一个 MySQL 查询到当前数据库,由当前数据库执行之。

语法格式:

resource mysql_query ( string query [, resource link_identifier] )

mysql_query() 向与指定的连接标识符关联的服务器中的当前数据库发送一条查询,由当前数据库执行之。

 

如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。

 

: 查询字符串不应以分号结束。

 

查询结果会被缓存。

查询结果:

mysql_query() 仅对 SELECTSHOWEXPLAIN DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。

 

以下查询语法上有错,因此 mysql_query() 失败并返回 FALSE

<

$result = mysql_query("SELECT * WHERE 1=1")

    or die("Invalid query: " . mysql_error());

?> 

 

以下查询当 my_col 并不是表 my_tbl 中的列时语义上有错,因此 mysql_query() 失败并返回 FALSE

<?

$result = mysql_query("SELECT my_col FROM my_tbl")

    or die("Invalid query: " . mysql_error());

?> 

 

如果没有权限访问查询语句中引用的表时,mysql_query() 也会返回 FALSE

 

查询结果的查看:

查看SELECT语句的查询结果的行数,调用 mysql_num_rows()

查看DELETEINSERTREPLACE UPDATE语句影响的行数,调用 mysql_affected_rows()

 

仅对 SELECTSHOWDESCRIBE EXPLAIN 语句 mysql_query() 才会返回一个新的结果标识符,可以将其传递给 mysql_fetch_array() 和其它处理结果表的函数。

 

处理完结果集后可以通过调用 mysql_free_result() 来释放与之关联的资源,尽管脚本执行完毕后会自动释放内存。

Ÿ mysql_num_rows

取得结果集中行的数目

语法格式:

int mysql_num_rows ( resource result )

mysql_num_rows() 返回结果集中行的数目。此命令仅对 SELECT 语句有效。要取得被 INSERTUPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()

例子 mysql_num_rows() 例子

 

<?

$server_link = mysql_connect("localhost", "mysql_user", "mysql_password");

mysql_select_db("db1", $link);

 

$result = mysql_query("SELECT * FROM table1", $server_link);

$num_rows = mysql_num_rows($result);

 

echo "$num_rows Rows\n";

?> 

Ÿ mysql_affected_rows

取得前一次 MySQL 操作所影响的记录行数

语法格式:

int mysql_affected_rows ( [resource link_identifier] )

取得最近一次与 link_identifier 关联的 INSERTUPDATE DELETE 查询所影响的记录行数。

例子 mysql_affected_rows() 例子

<?

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

if (!$link) {

    die('Could not connect: ' . mysql_error());

}

mysql_select_db('mydb');

 

/* 本例返回被删除记录的准确数目 */

mysql_query('DELETE FROM mytable WHERE id < 10');

printf("Records deleted: %d\n", mysql_affected_rows());

 

/* 对于非真值的 WHERE 子句,应返回 0 */

mysql_query('DELETE FROM mytable WHERE 0');

printf("Records deleted: %d\n", mysql_affected_rows());

?> 

 

上例的输出类似于:

 

Records deleted: 10

Records deleted: 0

 

例子 使用事务处理的 mysql_affected_rows() 例子

<?

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

if (!$link) {

    die('Could not connect: ' . mysql_error());

}

mysql_select_db('mydb');

 

/* Update records */

mysql_query("UPDATE mytable SET used=1 WHERE id < 10");

printf ("Updated records: %d\n", mysql_affected_rows());

mysql_query("COMMIT");

?> 

上例的输出类似于:

Updated Records: 10

事务处理:如果使用事务处理(transactions),需要在 INSERTUPDATE DELETE 查询后调用 mysql_affected_rows() 函数,而不是在 COMMIT 命令之后。

Ÿ mysql_fetch_array

从结果集中取得一行作为关联数组,或数字数组,或二者兼有。

语法格式:

array mysql_fetch_array ( resource result [, int result_type] )

返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE

例子 2. mysql_fetch_array 使用 MYSQL_NUM

<?

  mysql_connect("localhost", "mysql_user", "mysql_password") or

      die("Could not connect: to server" . mysql_error());

  mysql_select_db("mydb");

  $result = mysql_query("SELECT id, name FROM mytable");

  while ($row = mysql_fetch_array($result)) {

      printf ("ID: %s  Name: %s", $row[0], $row[1]);

      //或者:printf ("ID: %s  Name: %s", $row[id], $row[name]);

   }

  mysql_free_result($result);

?> 

Ÿ mysql_free_result

释放资源变量所占内存。

语法格式:

bool mysql_free_result ( resource result )

mysql_free_result() 将释放所有与结果标识符 result 所关联的内存。

mysql_free_result() 仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被自动释放。

如果成功则返回 TRUE,失败则返回 FALSE

3. PHP操纵MySQL实例

1)准备示例数据

使用mysql.exephpMyAdmin

test数据库中建立表abc

abc的结构如下:

列名

类型

a

varchar(10)

b

varchar(10)

c

varchar(10)

 

在表abc中插入示例数据:

a的数据

b中的数据

c的数据

a1

b1

c1

a2

b2

c2

a3

b3

c3

 

2)准备示例程序abc.php,存放在发布文档目录d:\www下,其内容为:

<?

 //连接数据库

$hostname="";

$username="";

$password="";

 

//连接服务器

//$server_link为资源型变量

$server_link=@mysql_connect($hostname,$username,$password) or die ("连接服务器失败!程序中断执行!");

if($server_link) echo "与服务器的连接成功!<br>";

 

//打开数据库

//$db_link为资源型变量

$db_link=@mysql_select_db("test",$server_link) or die ("连接数据库失败!程序中断执行!");

//dieexit的别名,它们的作用是强制中断程序执行

//若程序在这里终止执行,则上面的资源型变量所占内存资源将自动回收(释放资源型变量)

 

//查询表,并将查询结果存入数组(遍历记录集,将记录集中的数据转到数组)

$sql="select * from abc";

//$result为资源型变量

$result=mysql_query($sql,$server_link);

$i=0;

while($temp_array =mysql_fetch_array($result)) {

$abc_array[$i][0]=$temp_array ["a"];

  $abc_array [$i][1]=$temp_array ["b"];

$abc_array [$i][2]=$temp_array ["c"];

$i++;

}

 

//释放记录集,这是显式地关闭资源,若程序终止执行,该关闭将自动进行

mysql_free_result($result);

//释放服务器连接,这也是显式地使用关闭函数回收资源变量

mysql_close($server_link) or die(“关闭服务器连接失败”);

 

//将数组中的数据输出到浏览器(以表格形式)

?>

<table border=1>

<tr><td>a列数据</td><td>b列数据</td><td>c列数据</td></tr>

<?

for($i=0;$i<count($abc_array);$i++){

?>

<tr>

<td><? echo $abc_array[$i][0];?></td>

<td><? echo $abc_array[$i][1];?></td>

<td><? echo $abc_array[$i][2];?></td>

</tr>

<?

}

?>

测试步骤

在浏览器地址栏输入:http://你的机器IP地址/mysqltest.php,回车,显示如下图所示,则使用PHPMySQL数据库中成功取出了数据,表明PHP MySQL能够协同工作了。

4.MySQL的常用列类型

在设计数据库表时,必须考虑数据类型。MySQL支持大量的列类型,常用的可分为3类:数字类型、日期和时间类型以及字符串(字符)类型。这里简明介绍常用的列类型,更多列类型的详细说明请参考手册。

约定:

M :指出最大的显示尺寸。最大的合法的显示尺寸是 255

D :适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2

方括号([”和“])指明其中的参数可选。

注意,如果带上参数ZEROFILLMySQL将为该列自动地增加UNSIGNED属性。

1)数字类型

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

微整型,一个很小的整数。有符号的范围是-128127,无符号的范围是0255。 存储时占用一个字节。

INT[(M)] [UNSIGNED] [ZEROFILL]

整型,一个正常大小整数。有符号的范围是-21474836482147483647,无符号的范围是04294967295

存储时占用4个字节。

FLOAT[(M,D)] [ZEROFILL]

实型,一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38-1.175494351E-380 1.175494351E-383.402823466E+38M是显示宽度而D是小数的位数。

存储时占用4个字节。

2)日期时间类型

DATE

一个日期。支持的范围是'1000-01-01''9999-12-31'MySQL'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。

存储时占用3个字节。

DATETIME

一个日期和时间组合。支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'MySQL'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。

存储时占用8个字节。

3)字符类型

CHAR(M)

一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。CHARCHARACTER的一个缩写。

存储时占用M个字节。

VARCHAR(M)

一个变长字符串。注意:当值被存储时,尾部的空格被删除。M的范围是1 255个字符。 VARCHAR值以大小写不区分的方式排序和比较,除非给出BINARY关键词值。VARCHARCHARACTER VARYING一个缩写。

存储时占用L+1 字节, 在此L <= M1 <= M <= 255

 

CHARVARCHAR列只接受它定义长度内的字符串,超过部分不接收。

CHARVARCHAR类型的存储方式不同:

CHAR列存储所定义的固定长度的字符串。当CHAR值被存储时,用空格在右边填补到指定的长度。当CHAR值被检索时,这些空格被删去。

CHAR相反,VARCHAR列只存储所需的字符,外加一个字节记录长度,长度不足的地方不用空格填补

下表显示了两种类型的列的不同,通过演示存储变长字符串值到CHAR(4)VARCHAR(4)列:

CHAR(4)

存储需求

VARCHAR(4)

存储需求

''

' '

4 个字节

''

1 字节

'ab'

'ab '

4 个字节

'ab'

3 个字节

'abcd'

'abcd'

4 个字节

'abcd'

5 个字节

'abcdefgh'

'abcd'

4 个字节

'abcd'

5 个字节

长度小于4VARCHAR被改变为CHAR

如果在一个表中的任何列有可变长度,结果是整个行是变长的。因此, 如果一张表包含任何变长的列(VARCHARTEXTBLOB),所有大于3个字符的CHAR列被改变为VARCHAR列。这在任何方面都不影响列的使用;在MySQL中,VARCHAR只是存储字符的一个不同方法。MySQL实施这种改变,是因为它节省空间并且使表操作更快捷。

TINYTEXT

一个TEXT列,最大长度为255(2^8-1)个字符。

TEXT

一个TEXT列,最大长度为65535(2^16-1)个字符。

列类型

需要的存储量

CHAR(M)

M字节,1 <= M <= 255

VARCHAR(M)

L+1 字节, 在此L <= M1 <= M <= 255

TINYTEXT

L+1 字节, 在此L< 2 ^ 8

TEXT

L+2 字节, 在此L< 2 ^ 16

VARCHARTEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度(L),加上1个字节以记录字符串的长度。对于字符串'abcd'L4而存储要求是5个字节。

TEXT类型需要1234个字节来记录列值的长度,这取决于类型的最大可能长度。

5.用在查询中的运算符和函数

PHP等程序设计语言一样,MySQL等许多DBMS都有自己的数据类型(即列类型),运算符,语句结构,关键字,以及函数。其中广泛用于SELECTWHERE子句中的函数,对程序员简化查询语句的构造,提高查询计算的效率,起着非常重要的作用。这些函数将一些复杂的查询计算操作用函数封装起来,由MySQL自己执行计算,仅将结果返回给PHP

这些函数,涵盖了数学运算,字符串处理,逻辑运算,日期时间运算,比较运算,语句流程控制,分组汇总,排序等许多方面的处理,下面介绍常用到的一些函数。

为简便起见,用->表示执行查询后MySQL返回的结果。

1)强制运算()

括号。使用它们来强制在一个表达式的计算顺序。

mysql> select 1+2*3;

        -> 7

mysql> select (1+2)*3;

        -> 9

2)算术运算

+ 加法

mysql> select 3+5;

        -> 8

以此类推:

- 减法

* 乘法

/ 除法

被零除产生一个NULL结果:

mysql> select 102/(1-1);

        -> NULL

3)逻辑运算

所有的逻辑函数返回1TRUE)或0FALSE)。 NULL被认为是假值。

NOT ! )逻辑非

OR ||)逻辑或

AND&&)逻辑与

4)比较运算符

比较操作得出值1TRUE)、0FALSE)或NULL等结果。这些函数工作运用在数字和字符串上。

= 等于

<>不等于

!= 不等于

<= 小于或等于

< 小于

>= 大于或等于

> 大于

mysql> select 2 > 2;

        -> 0

IS NULL 是否为空

IS NOT NULL 是否不为空

mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL:

        -> 0 0 1

expr BETWEEN min AND max

如果expr对大于或等于minexpr是小于或等于maxBETWEEN返回1,否则它返回0

mysql> select 1 BETWEEN 2 AND 3;

        -> 0

mysql> select 2 BETWEEN 2 AND '3';

        -> 1

expr IN (value,...)

如果expr是在IN表中的任何值,返回1,否则返回0。如果所有的值是常数,那么所有的值根据expr类型被计算和排序,然后项目的搜索是用二进制的搜索完成。这意味着如果IN值表全部由常数组成,IN是很快的。如果expr是一个大小写敏感的字符串表达式,字符串比较以大小写敏感方式执行。

mysql> select 2 IN (0,3,5,'wefwf');

        -> 0

mysql> select 'wefwf' IN (0,3,5,'wefwf');

        -> 1

expr NOT IN (value,...)

NOT (expr IN (value,...))相同。

 

ISNULL(expr)

如果exprNULLISNULL()返回1,否则它返回0

mysql> select ISNULL(1+1);

        -> 0

mysql> select ISNULL(1/0);

        -> 1

 

注意,使用=NULL的值比较总为假!

 

5)字符串比较函数

通常,如果在字符串比较中的任何表达式是区分大小写的,比较以大小写敏感的方式执行。

expr LIKE pat tern[ESCAPE 'escape-char']

expr与模式字符串pattern进行模式匹配。返回1TRUE)或0FALSE)。用LIKE,你可以在模式中使用下列2个①%  匹配任何数目的字符,甚至零个字符

_  精确匹配一个字符

mysql> select 'David!' LIKE 'David_';

        -> 1

mysql> select 'David!' LIKE '%D%v%';

        -> 1

 

为了测试一个通配符的文字实例,用转义字符的加在字符前面。如果你不指定ESCAPE字符,假定为“\”:

 

\%  匹配%字符

\_  匹配_字符

 

mysql> select 'David!' LIKE 'David\_';

        -> 0

mysql> select 'David_' LIKE 'David\_';

        -> 1

 

为了指定一个不同的转义字符,使用ESCAPE子句:

mysql> select 'David_' LIKE 'David|_' ESCAPE '|';

        -> 1

 

LIKE允许用在数字的表达式上!(这是MySQLANSI SQL LIKE的一个扩充。)

 

mysql> select 10 LIKE '1%';

        -> 1

 

expr NOT LIKE pattern [ESCAPE 'escape-char']

NOT (expr LIKE pattern[ESCAPE 'escape-char'])相同。

6)控制流函数

IF(expr1,expr2,expr3)

如果expr1TRUE(expr1<>0expr1<>NULL),那么IF()返回expr2,否则它返回expr3IF()返回一个数字或字符串值,取决于它被使用的上下文。

mysql> select IF(1>2,2,3);

        -> 3

mysql> select IF(1<2,'yes','no');

        -> 'yes'

mysql> select IF(strcmp('test','test1'),'yes','no');

        -> 'no'

expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,应该使用一个比较操作来做。

mysql> select IF(0.1,1,0);

        -> 0

mysql> select IF(0.1<>0,1,0);

        -> 1

在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。

mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;

       -> "one"

mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;

       -> "true"

mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;

       -> NULL

7)数学函数

所有的数学函数在一个出错的情况下返回NULL

ABS(X)

返回X的绝对值。

SIGN(X)

返回参数的符号,为-101,取决于X是否是负数、零或正数。

MOD(N,M)

%

(类似C中的%操作符)。返回NM除的余数。

mysql> select MOD(29,9);

        -> 2

FLOOR(X)

X向下取整。

mysql> select FLOOR(1.23);

        -> 1

mysql> select FLOOR(-1.23);

        -> -2

CEILING(X)

X向上取整。

mysql> select CEILING(1.23);

        -> 2

mysql> select CEILING(-1.23);

        -> -1

ROUND(X)

返回参数X的四舍五入的一个整数。

mysql> select ROUND(-1.23);

        -> -1

mysql> select ROUND(-1.58);

        -> -2

mysql> select ROUND(1.58);

        -> 2

ROUND(X,D)

返回参数X的四舍五入的有D位小数的一个数字。如果D0,结果将没有小数点或小数部分。

mysql> select ROUND(1.298, 1);

        -> 1.3

mysql> select ROUND(1.298, 0);

        -> 1

RAND()

RAND(N)

返回在范围01.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

mysql> select RAND();

        -> 0.5925

mysql> select RAND(20);

        -> 0.1811

mysql> select RAND(20);

        -> 0.1811

mysql> select RAND();

        -> 0.2079

mysql> select RAND();

        -> 0.7888

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。

LEAST(X,Y,...)

22个以上的参数,返回最小(最小值)的参数。参数使用下列规则进行比较:

如果返回值被使用在一个INT上下文,或所有的参数都是整数值,他们作为整数比较。

如果返回值被使用在一个FLOAT上下文,或所有的参数是实数值,他们作为实数比较。

如果任何参数是一个大小敏感的字符串,参数作为大小写敏感的字符串被比较。

在其他的情况下,参数作为大小写无关的字符串被比较。

mysql> select LEAST(2,0);

        -> 0

mysql> select LEAST(34.0,3.0,5.0,767.0);

        -> 3.0

mysql> select LEAST("B","A","C");

        -> "A"

MySQL 3.22.5以前的版本,你可以使用MIN()而不是LEAST

GREATEST(X,Y,...)

返回最大(最大值)的参数。参数使用与LEAST一样的规则进行比较。

mysql> select GREATEST(2,0);

        -> 2

mysql> select GREATEST(34.0,3.0,5.0,767.0);

        -> 767.0

mysql> select GREATEST("B","A","C");

        -> "C"

MySQL 3.22.5 以前的版本, 你能使用MAX()而不是GREATEST. 

8)字符串函数

对于针对字符串位置的操作,第一个位置被标记为1

MySQL根据上下文自动变换数字为字符串,并且反过来也如此:

mysql> SELECT 1+"1";

        -> 2

CONCAT(str1,str2,...)

返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。

mysql> select CONCAT('My', 'S', 'QL');

        -> 'MySQL'

mysql> select CONCAT('My', NULL, 'QL');

        -> NULL

mysql> select CONCAT(14.3);

        -> '14.3'

mysql> SELECT CONCAT(2,' test');

        -> '2 test'

 

LEFT(str,len)

返回字符串str的最左面len个字符。

mysql> select LEFT('foobarbar', 5);

        -> 'fooba'

RIGHT(str,len)

返回字符串str的最右面len个字符。

mysql> select RIGHT('foobarbar', 4);

        -> 'rbar'

SUBSTRING(str,pos,len)

MID(str,pos,len)

从字符串str返回一个len个字符的子串,从位置pos开始。

mysql> select SUBSTRING('123456789123456',5,6);

        -> '567891'

LTRIM(str)

返回删除了其前置空格的字符串str

mysql> select LTRIM('  barbar');

        -> 'barbar'

RTRIM(str)

返回删除了其尾部空格的字符串str

mysql> select RTRIM('barbar   ');

        -> 'barbar'

TRIM(str)

返回去处了首尾空格的字符串str

mysql> select TRIM('  bar   ');

        -> 'bar'

SPACE(N)

返回由N个空格字符组成的一个字符串。

mysql> select SPACE(6);

        -> '      '

REPEAT(str,count)

返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果strcountNULL,返回NULL

mysql> select REPEAT('MySQL', 3);

        -> 'MySQLMySQLMySQL'

LCASE(str)

LOWER(str)

返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。

mysql> select LCASE('ABCDEFG');

        -> 'abcdefg'

UCASE(str)

UPPER(str)

返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。

mysql> select UCASE(' abcdefg ');

        -> ' ABCDEFG '

 

LOAD_FILE(file_name)

读入文件并且作为一个字符串返回文件内容。文件必须在服务器上,你必须指定到文件的完整路径名,而且你必须有file权限。文件必须所有内容都是可读的并且小于max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出,函数返回NULL

mysql> UPDATE table_name

           SET blob_column=LOAD_FILE("/tmp/picture")

           WHERE id=1;

9)日期和时间函数

NOW()

SYSDATE()

CURRENT_TIMESTAMP

'YYYY-MM-DD HH:MM:SS'YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。

mysql> select NOW();

        -> '1997-12-15 23:50:26'

mysql> select NOW() + 0;

        -> 19971215235026

CURDATE()

CURRENT_DATE

'YYYY-MM-DD'YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。

mysql> select CURDATE();

        -> '1997-12-15'

mysql> select CURDATE() + 0;

        -> 19971215

CURTIME()

CURRENT_TIME

'HH:MM:SS'HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。

mysql> select CURTIME();

        -> '23:50:26'

mysql> select CURTIME() + 0;

        -> 235026

        -> 10

10)分组计算函数

这些函数,常常是与GROUP BY子句一起使用的函数,作用是对聚合在组内的行,进行计算。

如果在不包含GROUP BY子句的一个语句中使用聚合函数,它等价于聚合所有行。

COUNT(expr)

返回由一个SELECT语句检索出来的行的非NULL值的数目。

mysql> select student.student_name,COUNT(*)

           from student,course

           where student.student_id=course.student_id

           GROUP BY student_name;

COUNT(*)在它返回的检索出来的行数目上有些不同,不管他们是否包含NULL值。如果SELECT从一个表检索,或没有检索出其他列并且没有WHERE子句,COUNT(*)被优化以便快速地返回。例如:

mysql> select COUNT(*) from student;

COUNT(DISTINCT expr,[expr...])

返回一个无重复值的数目。

mysql> select COUNT(DISTINCT results) from student;

MySQL中,你可以通过给出一个表达式列表以得到不同的表达式组合的数目。

AVG(expr)

返回expr的平均值。

mysql> select student_name, AVG(test_score)

           from student

           GROUP BY student_name;

MIN(expr)

MAX(expr)

返回expr的最小或最大值。MIN()MAX()可以有一个字符串参数;在这种的情况下,他们返回最小或最大的字符串值。

mysql> select student_name, MIN(test_score), MAX(test_score)

           from student

           GROUP BY student_name;

SUM(expr)

返回expr的和。注意,如果返回的集合没有行,它返回NULL

第三节 实验四 MySQL实验

1.MySQL基本命令练习

(1)准备数据

MS-DOS或命令提示符下,进入MySQL安装目录\bin

键入命令mysql回车,连接成功后键入以下简单命令,在test数据库中建立测试表abc,并插入示例数据。

具体步骤和相应命令如下:

use test;(回车)[说明:打开名为test的数据库]

Database changed MySQL服务器返回的结果)

create table abc(a varchar(10),b varchar(10),c varchar(10)); (回车)[说明:在test数据库中建立测试表abc]

Query OK, 0 rows affected (0.05 sec)  MySQL服务器返回的结果)

desc abc; (回车)[说明:显示表abc的结构]

(下面为MySQL服务器返回的结果)

+-------+-------------+------+-----+---------+---------+---------+

| Field | Type        | Null | Key |  Default    | Extra  |

+-------+-------------+------+-----+---------+-------+------------+

| a     | varchar(10) | YES  |     | NULL    |       |

| b     | varchar(10) | YES  |     | NULL    |       |

| c     | varchar(10) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+---------+----------+

3 rows in set (0.06 sec)

select * from abc;  (回车)[说明:查询表abc中的数据]

Empty set (0.11 sec)          [说明:表abc中无数据]

insert into abc values('a1','b1','c1'); (回车)[说明:在表abc中插入第一行数据]

Query OK, 1 row affected (0.05 sec)

insert into abc values('a2','b2','c2'); (回车)[说明:在表abc中插入第二行数据]

Query OK, 1 row affected (0.05 sec)

insert into abc values('a3','b3','c3'); (回车)[说明:在表abc中插入第三行数据]

Query OK, 1 row affected (0.05 sec)

select * from abc;

(下面为MySQL服务器返回的结果表明,已经成功地在abc表中插入了三行数据)

+------+------+------+

| a    | b    | c    |

+------+------+------+

| a1   | b1   | c1   |

| a2   | b2   | c2   |

| a3   | b3   | c3   |

+------+------+------+

3 rows in set (0.00 sec)

2)准备示例程序abc.php,存放在发布文档目录d:\www下,其内容为:

<?

 //连接数据库

$hostname="";

$username="";

$password="";

 

//连接服务器

//$server_link为资源型变量

$server_link=@mysql_connect($hostname,$username,$password) or die ("连接服务器失败!程序中断执行!");

if($server_link) echo "与服务器的连接成功!<br>";

 

//打开数据库

//$db_link为资源型变量

$db_link=@mysql_select_db("test",$server_link) or die ("连接数据库失败!程序中断执行!");

//dieexit的别名,它们的作用是强制中断程序执行

//若程序在这里终止执行,则上面的资源型变量所占内存资源将自动回收(释放资源型变量)

 

//查询表,并将查询结果存入数组(遍历记录集,将记录集中的数据转到数组)

$sql="select * from abc";

//$result为资源型变量

$result=mysql_query($sql,$server_link);

$i=0;//行计数器

while($temp_array =mysql_fetch_array($result)) {//$temp_array为临时数组

$abc_array[$i][0]=$temp_array ["a"];//$abc_array为记录查询结果的数组

  $abc_array [$i][1]=$temp_array ["b"];

$abc_array [$i][2]=$temp_array ["c"];

$i++;

}

//释放记录集,这是显式地关闭资源,若程序终止执行,该关闭将自动进行

mysql_free_result($result);

//释放服务器连接,这也是显式地使用关闭函数回收资源变量

mysql_close($server_link) or die(“关闭服务器连接失败”);

 

//将数组$abc_array中的数据输出到浏览器(以表格形式)

?>

<table border=1>

<tr><td>a列数据</td><td>b列数据</td><td>c列数据</td></tr>

<?

for($i=0;$i<count($abc_array);$i++){

?>

<tr>

<td><? echo $abc_array[$i][0];?></td>

<td><? echo $abc_array[$i][1];?></td>

<td><? echo $abc_array[$i][2];?></td>

</tr>

<?

}

?>

程序重点说明

本程序中的while循环部分:

测试步骤

在浏览器地址栏输入:http://你的机器IP地址/mysqltest.php,回车,显示如下图所示,则使用PHPMySQL数据库中成功取出了数据,表明PHP MySQL能够协同工作了。

2.使用phpMyAdmin

安装好phpMyAdmin(若没安装;具体安装方法见第二节)

通过phpMyAdmin

删除数据库test

建立上面的数据库test

在数据库test中建立上面所述结构的表abc

在表abc中插入上面所述的数据

运行上面的PHP程序,查看结果


第五章 Web软件开发

本章以一个新闻发布系统的实现为实例,介绍使用PHP,进行Web软件开发的一般过程和方法。

本章内容也是前四章内容的综合运用。

第一节 系统分析和系统设计

1.用户需求

经过对用户的调查,并与用户协商,一致确定最终的需求,表述如下:

系统名称:ABC新闻发布系统

系统功能:

1)前台功能——最终客户,用于浏览新闻。

1)浏览最新新闻标题:显示10条最新新闻的标题;只列出允许发布到前台的新闻标题。

发布:允许让最终客户在前台看到。

2)浏览更多新闻标题:每页显示25条新闻标题,总数超过25条新闻时,分页显示

3)浏览新闻全文:单击1)、2)中新闻标题后可查看到新闻的具体内容:标题,作者,发布时间(年月日时分秒),内容

2)后台管理——新闻管理人员,用于管理新闻

1)人员管理:

人员——使用本后台进行新闻管理的人。

人员信息——帐号,密码,姓名,联系方式,权限

其中,权限:登录系统,增加人员,修改人员,添加新稿,修改稿件,审核稿件,业务查询。

功能:

①人员验证:

任何人员进入后台管理系统,必须经过验证,验证的凭据是帐号和密码,必须与系统中的用户名与密码一致。

②人员信息的增加

③人员信息的修改

2)稿件管理:

编辑稿件:

稿件录入:录入新闻稿件信息。新增稿件录完成,提交至服务器,等待审核通过后发布。

稿件修改:对未发布或暂存的新闻稿件,可修改。修改稿提交前,必须再次检查是否已经被发布,若已发布,则服务器拒绝接受提交。

稿件删除:对未发布的稿件,如暂存稿件,可进行删除操作。

审核稿件:对提交待发的新闻稿件,决定发布还是退回。

说明:稿件的状态,有:提交待发,暂存,发布,退回4种。

3)业务记录

8种业务操作:登录系统,增加人员,修改人员,添加新稿,修改稿件,审核稿件,业务查询,退出后台,这均要自动记录到系统中去,记录的信息包括:

姓名,操作机器,操作时间,业务操作,操作稿件

4)业务查询

根据用户输入的查询信息,查询出符合条件的业务记录。

2.系统分析与设计

分析以上用户需求,设计形成便于技术人员理解的专业技术描述。

本例主要从数据和功能两个方面来分析和设计一个系统。

从技术人员的角度来说,就是从数据库和程序两个方面,来分析和设计一个系统。

1)数据库的分析与设计

1)分析用户数据,形成概念设计,转化为关系模式,从而完成逻辑设计

方法:采用实体-联系(E-R)方法

两个基本实体:新闻和人员

分别转化为关系

关系一:新闻(标题,时间,作者,状态,内容)

关系二:人员(帐号,密码,姓名,联系方式,权限)

关系三:操作记录(姓名,操作机器,操作时间,操作类型,操作稿件)

以上三个关系,是用户需求的原型表述,还不够规范,不便于直接应用于系统的设计。

 

为此,下面对上面的关系,根据规范化理论,采用模式分解方法,进行规范化:

关系一:新闻(标题,时间,作者,状态,内容)

其中,状态属性值∈{提交待发,暂存,发布,退回}

规范化后,分解为两个关系:

①新闻(新闻代码,标题,时间,人员代码,状态代码,内容)

②新闻状态(状态代码,状态名称)

状态代码

状态名称

1

提交待发

2

暂存

3

发布

4

退回

关系二:人员(帐号,密码,姓名,联系方式,权限)

其中,权限属性值∈{登录,增加人员,修改人员,添加稿件,修改稿件,审核稿件}

规范化后,分解为两个关系:

③权限(权限代码,权限名称)

权限代码

权限名称

1

登录系统

2

增加人员

3

修改人员

4

添加稿件

5

修改稿件

6

审核稿件

7

业务查询

④人员(人员代码,帐号,密码,姓名,联系方式,权限代码串)

其中,权限代码串是权限代码的组合,表示权限组合。组合中,每种权限代码只出现一次。

关系三:操作记录(姓名,操作机器,操作时间,操作类型,操作稿件)

其中,每次仅限一种操作,这样,操作类型信息可用权限信息来代替,故关系规范化后,分解为两个关系:

⑤操作记录(记录代码,人员代码,操作机器IP,操作时间,新闻代码,权限代码)

③权限(权限代码,权限名称)

上述关系①②③④⑤之间的联系,如下图所示:

上图采用Microsoft Viso画成。

箭头指向表示外键(FKForeign Key)参照(参考解释的意思)。

PKPrimary Key,主键。

2)数据库的物理设计与实现

包括字段,表,数据库名称,用户和权限等内容的方案设计。

命名约定:字段,表,数据库的命名采用汉语拼音首字母。

方案设计的依据:概念设计和逻辑设计的成果:上述5个关系模式。

方案设计的步骤:自底向上,具体如下:

第一步:字段设计——确定所有字段的名称、类型和宽度。

第二步:表设计——确定数据表的名称,主键等。

第三步:确定数据库名称。

第四步:确定用户和权限方案。

第五步:实现——在具体的DBMS中实现上面四步的设计方案。

下面逐一进行:

n 第一步:字段设计

方法:

确定哪些属性参加字段设计:把所有关系中的属性集中列表,重复的字段只列一次,表中最终的这些属性需要设计其相应的字段。把它们集中到一起进行设计的目的是:避免重复设计。

字段的命名:将每个属性转化成字段。根据命名约定确定字段的名称,

字段的类型和宽度:根据实际需要确定类型和宽度,在满足应用需求的前提下,尽量减少存储宽度。

字段设计结果:字段名称、类型和宽度

序号

属性名

字段名

类型

宽度(西文字符)

1

新闻代码

xwdm

整型,无符号,自动编号

9

2

标题

bt

变长字符型

50

3

时间

sj

日期时间型

DBMS自定)

4

人员代码

rydm

微整型,无符号,自动编号

2

5

状态代码

ztdm

微整型,无符号,自动编号

1

6

内容

nr

文本型

DBMS自定)

7

状态名称

ztmc

变长字符型

8

8

帐号

zh

变长字符型

16

9

密码

mm

变长字符型

16

10

姓名

xm

变长字符型

8

11

联系方式

lxfs

变长字符型

20

12

权限代码串

qxdmc

变长字符型

7

13

权限代码

qxdm

微整型,无符号,自动编号

1

14

权限名称

qxmc

变长字符型

8

15

记录代码

jldm

整型,无符号,自动编号

9

16

操作机器IP

czjq_ip

变长字符型

15

17

操作时间

czsj

日期时间型

DBMS自定)

n 第二步:表设计——确定数据表的名称,表中包括的字段,字段中的主键、外键等

方法:

确定表名:遵照命名约定,将关系名转化为表名。

确定表中的字段:根据原关系中的属性,选择相应的字段。

确定主键和外键。

表的设计

序号

关系名

表名

表中字段

主键

外键

1

新闻

xw

xwdm,bt,sj,rydm,ztdm,nr

xwdm

rydm,ztdm

2

新闻状态

xwzt

ztdm,ztmc

ztdm

 

3

人员

ry

rydm,zh,mm,xm,lxfs,qxdmc

rydm

qxdmc

4

权限

qx

qxdm,qxmc

qxdm

 

5

操作记录

czjl

jldm,rydm,czjq_ip,czsj,xwdm,qxdm

jldm

rydm,xwdm,qxdm

n 第三步:确定数据库名称

xwxt(新闻系统)

n 第四步:确定用户和权限方案

用户和权限设计

序号

用户帐号

用户密码

登录主机

用户权限

说明

1

root

自行设定

自行设定

全局全部权限

超级用户

2

user_xwxt

user_xwxt

localhost

%

仅对数据库xwxt内所有表具有SELECTUPDATEDELETEINSERT权限

受限用户,程序访问数据库用

localhost:服务器所在机器。

%:除localhost以外的任何一台机器。

n 第五步:实现——在具体的DBMS中实现上面四步的设计方案

选定的DBMS:我们选择MySQL为实现上述物理方案设计的DBMS

以超级用户身份,通过phpMyAdmin,快速实现上述四步设定的方案。

具体步骤:自上而下

第一步:创建数据库xwxt

第二步:依次创建5个表,完成每个表中的字段设计,主键、外键设计。

注意:凡是外键,不必设计成自动编号型(auto_increment)。

第三步:创建用户user_xwxt,设定其密码为:user_xwxt,设定其权限为:对数据库xwxt内所有表具有全部权限,无全局权限。关于超级用户root,若已存在,则不必创建。

这三步的实现,用MySQL的脚本命令描述如下:

CREATE DATABASE `xwxt`;

USE `xwxt`;

CREATE TABLE `xw` (

`xwdm` INT( 9 ) UNSIGNED NOT NULL AUTO_INCREMENT ,

`bt` VARCHAR( 50 ) NOT NULL ,

`sj` DATETIME NOT NULL ,

`rydm` TINYINT( 2 ) UNSIGNED NOT NULL ,

`ztdm` TINYINT( 1 ) UNSIGNED NOT NULL ,

`nr` TEXT NOT NULL ,

PRIMARY KEY ( `xwdm` )

);

CREATE TABLE `xwzt` (

`ztdm` TINYINT( 1 ) UNSIGNED NOT NULL AUTO_INCREMENT ,

`ztmc` VARCHAR( 8 ) NOT NULL ,

PRIMARY KEY ( `ztdm` )

);

CREATE TABLE `ry` (

`rydm` TINYINT( 2 ) UNSIGNED NOT NULL AUTO_INCREMENT ,

`zh` VARCHAR( 16 ) NOT NULL ,

`mm` VARCHAR( 16 ) NOT NULL ,

`xm` VARCHAR( 8 ) NOT NULL ,

`lxfs` VARCHAR( 20 ) NOT NULL ,

`qxdmc` VARCHAR( 7) NOT NULL ,

PRIMARY KEY ( `rydm` )

);

CREATE TABLE `qx` (

`qxdm` TINYINT( 1 ) UNSIGNED NOT NULL AUTO_INCREMENT ,

`qxmc` VARCHAR( 8 ) NOT NULL ,

PRIMARY KEY ( `qxdm` )

);

CREATE TABLE `czjl` (

`jldm` INT( 9) UNSIGNED NOT NULL AUTO_INCREMENT ,

`rydm` TINYINT( 2 ) UNSIGNED NOT NULL ,

`czjq_ip` VARCHAR( 15 ) NOT NULL ,

`czsj` DATETIME NOT NULL ,

`xwdm` INT( 9 ) UNSIGNED NOT NULL ,

`qxdm` TINYINT(1 ) UNSIGNED NOT NULL ,

PRIMARY KEY ( `jldm` )

);

GRANT SELECT , INSERT , UPDATE , DELETE ON `xwxt`. * TO "user_xwxt"@"%" IDENTIFIED BY "user_xwxt";

FLUSH PRIVILEGES ;

GRANT SELECT , INSERT , UPDATE , DELETE ON `xwxt`. * TO "user_xwxt"@"localhost" IDENTIFIED BY "user_xwxt";

FLUSH PRIVILEGES ;

将这些脚本命令存成.脚本文件(默认是.sql文件,也可以是.txt文件),使用客户端工具mysql.exephpMyAdmin执行脚本文件,可在MySQL中迅速完成物理设计的实现。

2)功能的分析与设计

1)功能模块设计

确定功能模块的程序组成,及模块间调用关系。

序号

模块编号

功能模块名称

程序名

1

q1

最新新闻

q1.php浏览最新新闻标题,前台首页

2

q2

所有新闻

q2.php浏览所有新闻标题

3

q3

查看新闻

q3.php浏览某条新闻全文,是q1q2的公共调用模块

4

h1

登录后台

h1.php登录信息输入界面→h1_chuli.php登录信息验证程序

5

h

后台首页

h.php,链接h2h3h4h5h6

6

h2

增加人员

h2.php新人信息输入界面→h2_chuli.php新人信息处理程序

7

h3

修改人员

h3.php人员修改信息输入界面→h3_chuli.php人员修改处理程序

8

h4

添加稿件

h4.php添加稿件界面→h4_chuli.php添加稿件处理程序

9

h5

修改稿件

h5.php修改稿件界面→h5_chuli.php修改稿件处理程序

10

h6

审核稿件

h6.php审核稿件界面→h6_chuli.php审核稿件处理程序

11

h7

业务查询

h8.php查询信息录入界面→h8_chuli.php查询程序

12

h8

退出后台

h9.php销毁所有当前操作人员信息,安全退出后台,回到前台

13

h9

业务记录

h9.php业务记录,是h1_chuli.phph2_chuli.phph3_chuli.phph4_chuli.phph5_chuli.phph6_chuli.phph7_chuli.phph8.php的公共调用模块。该模块无界面。

14

g1

连接服务器

g1.php

15

g2

关闭连接

g2.php

 

2)模块间关系图示

3)文件部署

将程序文件、图片文件、SQL脚本文件等,建立各自的文件夹,分门别类地存放于Web发布文档目录下。

文件夹的名称按照见名知义的原则命名。

文件夹命名的一般做法:

文件夹

用途

backup

备份资料

image

存放网页、程序引用的图片文件

inc

存放公用程序、自定义函数等

inc/js

存放公用JavaScript程序脚本文件

script

存放程序脚本文件

script/q

存放所有前台程序

script/h

存放所有后台程序

设计结果如图所示:(abc为发布文档根目录)

4)程序设计

根据程序功能设计的要求,以及程序之间的调用关系,对程序进行具体设计。

n g1.php连接服务器

本程序供其它程序调用,无界面。

本程序算法比较简单,直接用编码表示为:

<?

$hostname="";//相当于localhost

$username="user_xwxt";

$password="user_xwxt";

$server_link=@mysql_connect($hostname,$username,$password) or die ("连接服务器失败");

$db_link=@mysql_select_db("xwxt",$server_link) or die ("连接数据库失败");

?>

n g2.php关闭与服务器的连接

本程序供其它程序调用,无界面。

本程序算法比较简单,直接用编码表示为:

<?

$db_close=@mysql_close($server_link) or die("关闭与服务器的连接失败");

?>

n q1.php最新新闻:

①界面设计

其中:

标题链接指向q3.php?xwdm=当前标题对应的新闻代码xwdm值,打开链接的窗口是新窗口

“全部新闻”链接到q2.php

“登录后台”链接到h1.php

②动态构造新闻标题列表的算法

调用g1.php,连接数据库

查询已发布的10条新闻的xwdmbtsj,按sj倒序排序

将查询结果装入数组

调用g2.php,关闭连接

遍历数组,以表格形式输出标题

标题链接指向q3.php?xwdm=数组当前行存有xwdm的元素的值,打开链接的窗口是新窗口

n q2所有新闻:

①界面设计

标题链接指向q3.php?xwdm=当前标题对应的新闻代码xwdm值,打开链接的窗口是新窗口

“最新新闻”链接到q1.php

首页,上一页,下一页,尾页——的链接由程序根据当前页位置决定

②算法表述

约定:

用变量$page存储当前页码:$page为空则令$page=0,表示当前为第1页;$page=n则表示当前为第(n+1)页。

用变量$pagesize存储每页显示的记录数:本例中规定$pagesize=25

 

$page为空则令$page=0

调用g1.php,连接数据库

 

取得属于当前页中的新闻代码xwdm,标题bt

查询已发布新闻的xwdmbtsj,按sj倒序排序,从结果集中的第$page*$pagesize行开始取,最多取$pagesize行。

将取得的这些行中的xwdmbt装入数组$xw

 

取得已发布的新闻记录总数$total_records

调用g2.php,关闭连接

 

计算总页数$page_count

$total_records==0,则$page_count0

$total_records<$pagesize,则$page_count=1

$total_records%$pagesize>0,则$page_count=向上取整($total_records/$pagesize)

$total_records%$pagesize==0,则$page_count= $total_records/$pagesize

构造导航条信息$pageinfo(界面中倒数第二行):

$pageinfo=”共”. $total_records.”条新闻  第”.($page+1).”页  共”.$page_count.”页”

下面确定:“首页”,“上一页”,“下一页”,“尾页”的链接的情况

若有链接,链接到什么地方,同时传递什么样的参数及参数值:

链接到本页即$PHP_SELF,同时传递参数page,其值根据所链接的文字而定:

参数page=0,当链接文字为“首页”(也可省略传递参数)

参数page=$page-1,当链接文字为“上一页”

参数page=$page+1,当链接文字为“下一页”

参数page=$page_count-1,当链接文字为“尾页”

      下面确定何时应具有链接:

$page==0时,当前页是首页,故“首页”,“上一页”不应具有链接

$page>0时,当前页不是首页,故“首页”,“上一页”应具有链接

$page<$page_count-1时,当前页未到达尾页,故“下一页”,“尾页”应具有链接

$page==$page_count-1时,当前页已是尾页,故“下一页”,“尾页”不应具有链接

$pageinfo=$pageinfo.根据上述规则动态确定链接的首页,上一页,下一页,尾页

 

上述计算工作完成后,下面将计算结果输出到界面:

遍历数组$xw,以表格形式输出其中的标题bt

标题链接指向q3.php?xwdm=数组$xw当前行存有xwdm的元素的值,打开链接的窗口是新窗口

输出导航条信息$pageinfo

n q3查看新闻:

①界面设计

②算法表述

算法的目标是输出界面上的动态信息:

根据接收到的新闻代码,查出该条新闻的标题,作者,时间,内容信息

将查出的这些信息输出到界面的相应位置

n h1登录后台:

h1.php登录信息输入界面设计:

其中,第一个文本框名为zh,第二个名为mm;第一个按钮是提交表单型按钮,第二个是重置表单型按钮。

表单动作指向h1_chuli.php,传递数据的方法是POST

算法表述:

算法的目标是,提交表单时,检查帐号和密码,若有一个为空则不允许提交。

用客户端语言JavaScript实现

 

h1_chuli.php登录信息验证程序:

算法表述:

在人员表ry中查找与接收到的帐号和密码匹配的记录

找到,则

检查是否有登录权限,有,则

跟踪记录该用户的人员代码rydm,姓名,权限

调用业务记录模块h9,记录当前用户的登录操作

转到台总界面模块h

否则

    告诉用户权限不足,退出系统,返回到登录界面

否则,告诉用户帐号或密码错误,返回登录界面