如果你是网络开发和维护人员,对ASP应该相当熟悉了。自从微软推出ASP技术后,由于其
在建立动态网站方面的强大功能,很快得到了广泛的应用。但由于众所周知的原因,ASP只能用于
微软自己的操作系统和服务器系统。目前基于UNIX的网络系统仍然占据大多数;而LINUX操
作系统由于其免费提供和开放源代码很受欢迎,其市场占有率迅速上升,据说已达到了17%左右;
APACHE服务器始终是网络站点的主流服务器软件。PHP的出现和逐渐完善,对基于
UNIX/LINUX系统的网络开发人员来说,无疑是个好消息:我们不用再只能羡慕ASP的
易用性而遗憾PERL/C的复杂性了!
一PHP特点概述
PHP全称为Personal Home Page,于1995开始发行使用,到1998年成为一个成熟的软
件产品。目前最新的版本为4.0,而常用的版本为3.0。PHP是用C语言编写而成,可运行于
UNIX/LINUX和WIN9X/NT下。
PHP,是一种跨平台的服务器端嵌入式脚本技术。PHP页面是一种文本文件,
是在普通HTML页面文件中嵌入PHP脚本语句,由服务器解释和翻译成普通的HTML文
件,然后传送给客户端浏览器,这一点和ASP一样。
PHP大量借用了C、JAVA、和PERL语言的语法,并加入了各种PHP自
己的特征,使WEB开发者能够写出快速的动态页面。
PHP脚本语句段以“<?”为开始,以“?>”为结束。“<?”和“?>”之间的脚本
语句由服务器软件调用PHP脚本解释引擎解释后替换为普通的HTML脚本。
笔者认为,PHP最强大也最有代表性的特点在于它的数据库层,它内置了对很多
数据库的支持,而不再需要特殊扩充,使得编写基于数据库的网页变得非常简单。目前所支持的数据库
有Oracle、Adabas D、Sybase、FilePro、mSQL、Velocis、MySQL、Informix、Solid、dBase、
ODBC、Unix、dbm、PostgreSQL、MS SQL SERVER等。针对每个数据库都有一组函数用于数据库访问和操
作,如对dBase数据库有dbase_create、dbase_open、dbase_close、dbase_pack、dbase_add_record、
dbase_delete_record、dbase_get_record、dbase_numfields、dbase_numrecords等函数,对MySQL有
mysql_close、mysql_connect、mysql_create_db、mysql_data_seek、mysql_dbname、mysql_db_query
等函数。
同时,PHP还提供了一组图像函数,可以动态生成gif格式的图像数据流并输出到
客户端。
此外,PHP还提供了对Socket、EMail、PDF文件、HIS(Hyperwave Information
Server)、IMAP、LDAP(Lightweight Directory Access Protocol)、文件上载、NIS等功能的支持。
二搭建PHP应用系统平台
PHP可以运行于UNIX/LINUX+APACHE服务器系统或WIN9X+PWS服务器系统或WINNT+IIS服务器系统。
下面以PWIN98+PWS4.0为例,搭建一个PHP学习和开发环境。
(一)下载PHP3 For WIN9X/NT
到http://www.php.net,选择downloads,然后选择Download the PHP source code and Windows
distribution,选择一个下载的站点,然后选择 3.0.11 Win32 binary 就可以了。如果觉得麻烦,就
用http://www.php.net/distributions/php-3.0.11-win32.zip吧。下载文件名为php-3.0.11-win32.zip,
大小为1.68M。
(二)安装PHP3 For WIN9X/NT
安装PHP3 For WIN9X/NT很简单,只要将php-3.0.11-win32.zip解压缩到一个目录中即可。在下面的
讨论中,假设PHP3安装在C:\Program Files\PHP3目录中。
(三)配置PHP3 For WIN9X/NT
配置PHP3 For WIN9X/NT,就是要修改系统设置,使PWS4.0能利用PHP3脚本解释引擎解释PHP页面。
1、把C:\Program Files\PHP3目录里的文件php3-dist.ini拷到windows98安装目录(如C:\PWIN98)
下,并改名为php3.ini。
2、编辑php3.ini文件
编辑php3.ini文件,将“Paths and Directories”下的“Extension_dir”项改为“Extension_dir
=C:\Program Files\PHP3”;将“browscap”下的“browscap”项改为“browscap=C:\PWIN98\SYSTEMinetsrv\browscap.ini”(PWS4.0安装目录下文件);在注册表的HKEY_LOCAL_MACHINE\SystemCurrentControlSet\Services\W3Svc\Parameters\ScriptMap的主键下,增加一个字符串值,其名称为
“.php3”(PHP3文件的扩展名),其值为“C:\Program Files\PHP3\php.exe %s %s”。
这样,在重新启动PWS服务器软件后,PWS4.0就可以利用PHP3脚本解释引擎解释PHP页面了。
三PHP脚本语法简介
在PHP3文件中,PHP脚本语句段以“<?”为开始,以“?>”为结束,用“<?”和“?>”括起来的部分就
是PHP程序段。
PHP语法和C、Perl的语法很相似,并主要来源于C语言,如控制流语句与C几乎完全一样、变量之间的
运算符与C的类似、函数定义和调用与C的类似等。
PHP的变量名前面必须有一个$号,如$Var1、$Var2。PHP的变量作用域规定也类似于C,即缺省认为主函
数中的变量是全局变量,而函数中的变量都是局部变量。
在PHP中,echo和printf函数用来向HTML页面中输出HTML内容,其中echo输出无格式字符串,printf输
出格式化的字符串。如echo("<br>这个一个PHP页面<hr>")和printf("%s,%d",str1,int1)。
如果熟悉C语言语法,学习PHP脚本语法应该不会太难。
四建立自己的简单PHP页面
所谓的PHP页面就是在普通的HTML页面文件中插入一些特殊的脚本语言并以扩展名PHP保
存后的页面文件,所以可以很容易地建立一个自己的简单的PHP页面。
下面是一个简单的PHP页面文件( test01.php3),应该不难理解。
<!-- test01.php3 -->
<html>
<head>
<title>一个简单的PHP3页面</title>
</head>
<body>
<p><h1>
<? echo("PHP脚本解释引擎已经开始为您工作了!<hr>"); ?>
<h1>下面应出现4行语句,字体大小从4到7</h1>
<? for($i = 4;$i<=7;$i++){ ?>
<br><font size = <? printf("%d",$i) ?>>这行语句的字体大小为
<? printf("%d",$i);} ?></font>
</p>
</body>
</html>
其中,语句 <? printf("%d",$i); ?> 是将变量 i 的值输出到HTML文件中。
由上可见,可以先制作一个普通的HTML页面文件,然后在需要的地方插入PHP脚本语言即可.
关键是熟练应用PHP脚本语句.
该页面虽然简单,却可以帮助熟悉和理解PHP语法.可以用浏览器查看运行效果,再用其查看源代
码的功能看一下源代码,可以看对PHP页面解释后的HTML文件.注意必须用http的方式访问PHP页面,
不能象HTML页面文件那样双击文件名以文件方式浏览.如在笔者的计算机上的访问方式为
http://wangfajun/test01.php3,因为PHP页面需要PWS等服务器软件进行解释。
四获取用户请求信息
要制作动态站点页面,获取用户请求信息是必不可少的。PHP页面可以利用这些信息作为某些应用
(如商业订单信息)的依据,并对申请者的申请要求作出反馈。
在ASP页面中,可以利用其内建对象Request获取访问者的申请信息。而在PHP页面中,可以以读取
数组的方式获取访问者的申请信息如表单信息(Form Field)、查询信息(QueryString)等。请求页
面中以POST方式发送的请求信息可以以$HTTP_POST_VARS["ItemName"]的方式获取,以GET方式发送的请
求信息可以以$HTTP_GET_VARS["ItemName"]的方式获取,Cookies信息可以以$HTTP_COOKIE_VARS[
"ItemName"]的方式获取。一般表单信息是以POST方式发送的,可以以$HTTP_POST_VARS["ItemName"]的
方式获取;查询信息是以GET方式发送的,可以以$HTTP_GET_VARS["ItemName"]的方式获取。
(一)由一个HTML或PHP3页面请求另一个PHP3页面处理
在下面的这个例子中,读者会员资格注册申请页面要求申请者填写其姓名全称、身份证号码、
EMail地址。在收到读者申请后通知其注册成功。
先做一个读者会员资格注册申请页面,可以是HTML页面或PHP页面.这应该不成问题.
<!-- apply.htm -->
<html>
<head>
<title>读者会员资格注册申请</title>
</head>
<body>
<H2>读者会员资格注册申请</H2>
<form method="post" action="test02.php3">
<p>
姓名全称: <input name="FullName" SIZE="20" value="姓名全称">
<p>
身份证号码: <input name="UniversalID" SIZE="15" value="888888888888888">
<p>
电子邮箱: <input name="Email" value="mailbox@yourcompany.com">
<p><input type=submit value="提交申请"><input type=reset value="重新填写">
</form>
</body>
</html>
在申请页面中,所有的申请数据均填写在Form元素中,并且在Form的Action中指定处理
申请的页面为test02.php3。当收到申请时,对应项目的数据可以由$HTTP_POST_VARS["项目名称"]
来获得,其中"项目名称"为Form元素的名称,如"姓名全称"对应"FullName" ,如"身份证号码"对
应"UniversalID" 。现在利用这些信息来制作一个注册成功的通知页面test02.php3。
<!-- test02.php3 -->
<html>
<head>
<title>读者会员资格注册申请成功</title>
</head>
<body>
<p align="center"><H2><font color="green">读者会员资格注册申请成功
</font></H2>
<p>亲爱的<? printf("%s",$HTTP_POST_VARS["FullName"]) ?>读者:<br>
我们已经收到你的申请,并接受你的申请.你已经成为我部正式读者会员.<br>
你的读者号为CN<? printf("%s",$HTTP_POST_VARS["UniversalID"]) ?>。我们将通过你的电子信箱
<? printf("%s",$HTTP_POST_VARS["Email"]) ?>来正式通知你.此后我部举行读者沙龙活动的时间
和地点也将通过该信箱通知你.
</body>
</html>
现在用浏览器打开申请页面apply.htm,填入对应数据后提交申请,查看反馈效果,再用浏览器
的查看源代码的功能看一下源代码,可以看对PHP页面解释后的HTML文件.
(二)由一个PHP3页面请求同一个PHP3页面处理
下面的另一个例子中,login.php3 提供了一个用户登录页面,要求用户输入登录帐号和密码,
然后再通过Form的Action属性将表格发送给自己进行处理.在 login.php3 中,将根据帐号和密码
是否为空来判断是输入页面还是反馈页面,并给予不同的提示,若未输入帐号或密码则提示“用户
登录,请输入用户帐号和密码",否则显示用户帐号和密码。
<!-- login.php3 -->
<html>
<head>
<title>用户登录</title>
</head>
<body>
<? file://帐号或密码为空,提示用户登录输入用户帐号和密码
if(Empty($HTTP_POST_VARS["CustomerID" ] ) ¦¦
Empty($HTTP_POST_VARS["Password" ] ))
{
?>
<p align=center><h2>用户登录,请输入用户帐号和密码</h2></p><hr>
<form method="post" action="login.php3">
<p>
用户帐号: <input name="CustomerID" value="">
<p>
用户密码: <input name="Password" value="">
<p><input type=submit value="开始登录"><input type=reset value="重新登录">
</form>
<?
}
else file://已输入用户帐号和密码,则显示用户帐号和密码
{
printf("<p><h2>用户%s登录成功,密码为%s。</h2></p>",$HTTP_POST_VARS[ "CustomerID" ],
$HTTP_POST_VARS[ "Password" ]);
}
?>
</body>
</html>
(三)在PHP3页面中获取查询参数信息
当用户以 xxxxx.php3?ParaName = ParaValue 的方式发出查询请求时,xxxxx.php3 可以
从$HTTP_GET_VARS[ "ParaName"] 中获取用户提交的查询参数ParaName的信息ParaValue,还可
以从count($HTTP_GET_VARS)得知用户请求参数的个数并进行相应的处理。
当用户以 query.php3?CustomerID=7777 的方式发出查询请求时,query.php3 可以从
$HTTP_GET_VARS[ "CustomerID" ] 中取得查询参数 CustomerID的值为 7777,
count($HTTP_GET_VARS) 为 1.
当用户以 query.php3?CustomerID=7777&Password=DogIsDog 的方式发出查询请求时
,query.php3 可以从$HTTP_GET_VARS[ "CustomerID" ] 中取得查询参数 CustomerID 的值为
7777,从$HTTP_GET_VARS[ "Password" ] 中取得查询参数 Password的值为 DogIsDog ,
count($HTTP_GET_VARS) 为 2。
下面的例子(query.php3)用于获取用户指定的查询参数,并显示出来反馈给用户。当以
query.php3?CustomerID=1111&StartDate=1999.01.01&EndDate=1999.06.30的方式发出请求时,
得到的结果为:
您指定了3个查询参数如下:
第1个参数CustomerID的值为:1111
第2个参数StartDate的值为:1999.01.01
第3个参数EndDate的值为:1999.06.30
<!-- query.php3 -->
<html>
<head>
<title>查询参数处理</title>
</head>
<body>
<?
$QueryCount = count($HTTP_GET_VARS);//查询参数个数
printf("<p><H2>您指定了%d个查询参数如下:</H2>",$QueryCount);//显示查询参数个数
file://列举各个查询参数及其值
for( $intIndex = 0 ;list( $key, $val ) = each( $HTTP_GET_VARS ); $intIndex++ )
{
printf("<p><H2>第%d个参数%s的值为:%s</H2>", $intIndex+1, $key, $val);
}
?>
</body>
</html>
(四)、获取用户的Cookies信息
Cookies 可以服务器和客户端之间双向传递,它记录了特定用户的某些信息.在PHP
中可利用$HTTP_COOKIE_VARS["CookieItemName"]获取用户的Cookies信息。下面语句可用来显
示用户的所有Cookies信息:
<?
$QueryCount = count($HTTP_COOKIE_VARS);//Cookie数目
printf("<p><H2>您有%d条Cookies信息如下:</H2>",$QueryCount);//显示Cookie数目
file://列举各个Cookie及其值
for( $intIndex = 0 ;list( $key, $val ) = each( $HTTP_COOKIE_VARS ); $intIndex++ )
{
printf("<p><H2>第%d条Cookie(%s)的值为:%s</H2>", $intIndex+1, $key, $val);
}
?>
(五)、获取服务器环境信息
在PHP中,服务器环境信息以一组全局变量的形式给出,以供PHP脚本程序访问。
常用的服务器环境变量信息有:
$GATEWAY_INTERFA
CE:网关界面如CGI/1.1
$HTTP_ACCEPT:客户端可接受的MIME类型列表如*/*
$HTTP_ACCEPT_LANGUAGE:服务器采用的语言,"en"表示英文,"zh-cn"表示简体中文
$HTTP_HOST:HTTP服务器名称
$HTTP_USER_AGENT:发出请求的客户浏览器类型,根据用户请求信息和browscap.ini来识别,
如Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
$LOCAL_ADDR:本机服务器名称
$PATH_TRANSLATED:脚本文件的文件全名(含实际路径),如
C:\Inetpub\wwwroot\php3\query.php3
$REMOTE_ADDR:发出请求的客户端机器的IP地址
$REMOTE_HOST:发出请求的客户端机器的名称
$REQUEST_METHOD:发出请求的方法(Post/Get/Head)
$SCRIPT_NAME:被调用的脚本文件的路径及文件名称如/php3/query.php3
$SERVER_NAME:服务器的名称或IP地址
$SERVER_PORT:HTTP服务端口号,一般为 80.
$HTTP_REFERER:客户端发出CGI程序请求的页面的URL
$SERVER_PROTOCOL:服务器软件所用的协议如HTTP/1.1
$SERVER_SOFTWARE:服务器软件的名称及版本如Microsoft-IIS/4.0
五向用户发送信息
可以利用PHP提供的函数很灵活地控制向客户端发送的信息的内容和方式.例如可以动态设置反馈
信息、设置客户的Cookie、页面重新定位等等。
(一)、利用 echo、printf等PHP函数控制发送的信息内容
函数 echo、printf 可以向发往客户端浏览器的HTML文件中直接输出内容。
在下面的例子中,selecolr.php3 要求用户输入一个颜色名称,用户确认后将用户申请发
往同一个页面selecolr.php3,然后用用户指定的颜色将颜色名称显示出来.
<!-- selecolr.php3 !>
<html>
<head>
<title>选择颜色</title>
</head>
<body>
<?
if( Empty( $HTTP_POST_VARS[ "ColorName" ] ) )
{//未输入颜色名称,提示输入颜色名称
echo("<H4>你只需选择颜色名称,我来显示</H4>");
?>
<form method="post" action="selecolr.php3">
<p>
颜色名称: <input name="ColorName" value="red">
<p><input type=submit value="显示吧"><input type=reset value="想重选">
</form>
<?
}
else//已输入颜色名称,用指定颜色来显示颜色名称
printf("<H2>你选择的颜色是<font color =%s>%s</font></H2>",
$HTTP_POST_VARS[ "ColorName" ],$HTTP_POST_VARS[ "ColorName" ]);
?>
</body>
</html>
(二)、利用 header 函数进行URL页面重新定位
假如由于业务上的原因,你的站点的域名或IP地址发生了变化,就象Borland变成了
Inprise一样,老顾客在用原来的域名访问时,可以用 header 函数直接将其引导到新的
站点上去;假如要求用户在访问本页面前必须先访问另外一个页面,也可用 header 函数
直接将其引导到应该去的页面上去,而不是发出用户无权访问该页面的信息.
值得注意的是,必须在向客户端发送任何信息前使用 header 函数,否则会引起错误.
一般应该在页面的第一条语句将用户引导另一个URL。
在下面的例子中,若用户调用本页面,则将其引导到另一个页面 selecolr.php3.
<?
file://页面重新定位到selecolr.php3,必须用exit结束页面处理过程
header("Location: selecolr.php3");exit;
?>
<!-- redirect.php3 !>
<html>
<head>
<title>重新定向</title>
</head>
<body>
<p> 你不可能进入到本页面,否则就是我的失败.
</body>
</html>
(三)、利用 header 函数改变页面内容解释方法
在HTML页面代码中,经常会看见下面一个句子
<meta http-equiv="Content-Type" content="text/html">
其中,它用于指定HTML页面被浏览器解释的方式。当 content="text/html"时,浏览器
将代码解释为普通HTML页面并显示给用户;当 content="text/plain" 时,浏览器将代码不加任
何解释地显示给用户;当 content = "image/jpeg"是传递图形文件; 当未指定时,ContentType
默认为 "text/html".在PHP页面中,可以用 header 函数改变 ContentType 的类型,即可以控制
浏览器解释HTML文本的方式,如 header("ContentType: image/gif") 表示页面返回结果为一个
GIF类型的图形。
(四)、利用 SetCookie 函数设置客户端Cookies
通过设置SetCookie函数可以增加、修改或删除客户端的Cookies。当要设置的Cookie不存在时,
将创建一个新的Cookie,其值为要设置的值;Cookie存在时,以新值代替原有的值。
值得注意的是,应在页面的Header发送之前设置Cookie。
在下面的例子中,cookie.php3 用来设置一个名称为 wfj 的Cookie的值.调用时将显示
上次设置的Cookie(wfj)的值。
<?
file://cookie.php3
$OldCookieValue=$HTTP_COOKIE_VARS[ "wfj" ];//上次设置的Cookie(wfj)的值
if (!(Empty( $HTTP_POST_VARS[ "CookieValue" ] )))
{//已输入Cookie(wfj)的值,则进行Cookie设置,显示设置成功消息
SetCookie( "wfj", $HTTP_POST_VARS[ "CookieValue" ] );
?>
<html>
<head>
<title>Cookie设置成功</title>
</head>
<body>
<?
printf("<p>Cookie(wfj) 已经由%s设置为
s",$OldCookieValue,$HTTP_POST_VARS[ "CookieValue" ]);
printf("<p>下次调用时你会看到的");
}
else//未输入Cookie(wfj)的值,则提示输入Cookie值
{
?>
<html>
<head>
<title>Cookie设置</title>
</head>
<body>
<?
printf("<p>Cookie(wfj) =%s",$OldCookieValue);
printf("<p><hr><H4>你只需设置Cookie,我来显示</H4>");
?>
<form method="post" action="cookie.php3">
<p>
Cookie设置: <input name="CookieValue" value="wangfajun">
<p><input type=submit value="设置吧"><input type=reset value="想重选">
</form>
<? } ?>
</body>
</html>
六服务器端脚本和客户端脚本混合编程
当使用<script></script>编写一段脚本程序时,如果没有指定Language=php,则认为其
中的脚本程序在客户端执行,此时可以在程序中混合使用服务器端主要脚本和客户端脚本,这
样就可以根据客户端的请求灵活地控制客户端脚本的执行,使对客户的反馈更具有个性化。
在混合使用时,服务器端脚本要以“<??>”的形式嵌入,以示区别.
下面就是一个服务器端脚本和客户端脚本混合编程的例子(csscript.php3).在该例子中,
将输出10条记录,并为每条记录定制不同的函数,使每个函数能在浏览器的状态栏显示不同的
内容,并在鼠标经过记录时发生。
<!-- csscript.php3 -->
<html>
<head>
<title>服务器端脚本和客户端脚本混合编程</title>
</head>
<body>
<H1>鼠标移到各记录上的【项目名称】上时,请注意状态条内容的变化</H1>
<table border = "1">
<tr><td>项目名称</td><td>状态条应出现的内容</td></tr>
<? for( $intIndex = 1; $intIndex <= 10; $intIndex++) { ?>
<tr>
<td onmouseover = "Status<? echo($intIndex) ?>()">
<?echo($intIndex)?></td>
<td>鼠标现在正指向项目<? echo($intIndex) ?></td>
</tr>
<script language = JavaScript>
<!--
function Status<? echo($intIndex) ?>()
{
window.status = "鼠标现在正指向项目<? echo($intIndex) ?>";
}
-->
</script>
<?}?>
</table>
</body>
</html>
七增加注释
在编程时添加注释是一个好的习惯.PHP 允许在页面代码中添加注释,具体的注释方法与C
语言注释语法相同,如可用双斜杠“//”作为注释符。
八利用 Include 来实现功能模块化
可以将常用的功能函数存于一个PHP文件,在其它PHP页中要用其中的功能时,将包含函数的
PHP文件包含在调用函数的PHP文件中.这时可使用 Include 函数。具体语法为:
include($FileName);
使用时应该注意:
1、应避免自包含,即 File1 包含 File1;在多个文件中有包含语句时,应避免间接自包含
即循环包含,如File1包含File2,File2包含File3,File3包含File1.
2、被包含的脚本语言的类型必须是PHP语言类型或<script></script>脚本语句段。
以上是学习和使用PHP创建动态、交互式站点的一些入门知识,有了这些基础知识,就可以发挥
以前自己积累的编程经验,自己动手学习和探索用PHP创建基于UNIX/LINUX网站系统的动态、交互式
站点的高级网络应用系统了。