第1章 PHP3 入门
什么是PHP3?
PHP3.0版本是一种服务器端HTML-嵌入式脚本描述语言。
PHP3能做什么?
也许PHP3最强大和最重要的特征是他的数据库集成层,使用它完成一个含有数据库功能的网页是不可置信的简单。目前支持下面所列的数据库。
Oracle
Adabas D
Sybase
FilePro
MSQL
Velocis
MySQL
Informix
Solid
dBase
ODBC
Unix dbm
PostgreSQL
PHP的简要历史
PHP从1994年秋天开始孕育,他的创始人是Rasmus Lerdorf。早期没有发布的版本是被他用在自己的网页上来跟踪有谁来参观过他的在线个人简历。被其他人使用的第一个版本是在1995年发布的,当时叫做Personal Home Page Tools。他包含了一个非常简单的语法分析引擎,只能理解一些指定的宏和一些Home Page后台的常见功能,如留言本,计数器和一些其他的素材。在1995年中期,重写了这个语法分析引擎并且命名为PHP/FI 2.0版本。FI来源于Rasmus所写的另一个可以接受Html表单数据的程序包。他组合了Personal Home Page Tools 脚本和Form Interpreter,并且加入了对mSQL的支持,于是PHP/FI 2.0诞生了。PHP/FI以惊人的速度发展,并且其他的人也开始对他的源码加以改进和修改。
很难给出任何精确的统计数字,但是据估计到1996年末至少有15,000个WEB站点在使用PHP/FI 2.0,到了1997年中,这个数字已经成长为50,000个,1997年中PHP的发展也已经有了一些变化,他已经从Rasmus的宠物项目变成了更加有组织的团体项目。语法分析引擎也由Zeev Suraski 和 Andi Gutmans进行了重新改写,这个引擎构成了PHP3的基础。PHP/FI中的大部分通用代码都经过改写后引入了PHP3中。
今天(1998年中),有许多商业的产品如C2's StrongHold web server和Red Hat Linux都开始支持PHP3或PHP/FI,根据由NetCraft提供的数字进行保守的推断,现在在世界各地大概有150,000个WEB站点在使用PHP或PHP/FI。从前景上看,在InterNet上这些站点远远比运行Netscape's flagship Enterprise server的要多。
使用PHP3进行HTTP认证
只有在PHP以Apache的模块方式运行的时候才可以使用HTTP认证的功能。在Apache的模块PHP脚本中,可以使用Header()函数向客户断浏览器发送一个”Authentication Required”的消息,使浏览器弹出一个用户名/密码(username/password)的输入窗口,当用户输入用户名和密码后,包含PHP脚本的URL将会被再次调用,使用分别代表用户名,密码,和确认方式的$PHP_AUTH_USER, $PHP_AUTH_PW,$PHP_AUTH_TYPE变量。现在只有”BASIC”的确认方式被支持。
在一个页面中强迫用户进行身份认证的代码段的例子如下:
Example 2-1. HTTP 认证举例:
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;
}
else {
echo "Hello $PHP_AUTH_USER.<P>";
echo "You entered $PHP_AUTH_PW as your password.<P>";
}
?>
除了简单的输出$PHP_AUTH_USER 和 $PHP_AUTH_PW变量的值以外,你还可以检查用户名和密码的合法性,也许是对数据库进行查询,也许是在dbm文件中搜索用户。
当心臭虫成堆的Internet Explorer浏览器,他对Hearders的顺序非常挑剔.所以采用在送出HTTP/1.0 401 header 请求之前送出WWW-Authenticate header请求是一个很好的解决方法。
为了阻止一些人写一些脚本来显示一个经过传统外部机制验证过的页面的密码,采用如下方式:如果这一页面使用外部验证机制,将不会生成PHP_AUTH变量.这样,$REMOTE_USER变量可以被用来表示已经被外部机制验证的用户.
注意,上面的方法并不能防止某些人在同一台服务器上利用无身份验证的URL偷取有身份鉴别的URL的密码。
无论Netscape还是IE,在接到服务器的401回复之后,都将清空本地浏览器窗口的身份验证缓存。这种做法可以有效的使用户登录退出,从而强迫他们再次输入他们的用户名和密码。一些人使用这个方式来实现“超时”注册,或者提供登录退出的按钮。
这种方法不是标准的HTTP基本身份鉴定所必须的,所以您可能从来都不依靠它。使用Lynx进行的测试并没有弄清楚401服务器回应的身份鉴定,所以如果使用“向前”或“向后”功能将打开源文件(只要信用需求还没有被改变)。
虽然已经指出这种语言不能工作在Microsoft的IIS服务器上,但是PHP语言CGI版本将受到IIS的限制。
使用PHP建立GIF
PHP并不仅仅可以用来建立HTML输出。它还可以用来制作GIF图形文件,甚至制作更简便的GIF图象流。要想这样做,您将需要使用GD函数库来编译PHP源文件。
Example 2-2. 使用PHP来创建GIF文件
<?php
Header("Content-type: image/gif");
$string=implode($argv," ");
$im = imagecreatefromgif("images/button1.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImageGif($im);
ImageDestroy($im);
?>
这个例子将被一个页面使用类似于:<img src="button.php3?text">的方法来调用。其中关于button.php3的脚本将把这一段文本覆盖在基本的图形上(在这里是“images/button1.gif”)然后输出结果图形。这是一个很简便的方法来防止每当用户希望改变按键的文本时候都重新画一次按钮图形。使用这种方法,他们将被动态的使用。
文件上载支持
PHP有能力接受任何RFC-1867适应浏览器(包括Netscape Navigator 3.0或以后的版本, Microsoft Internet Explorer 3.0(使用了补丁程序)或以后的版本)的文件上载。这个特性让用户可以上载文本和二进制文件。使用PHP 的身份鉴定和文件处理函数,您可以完全控制谁可以上载文件和被上载的文件可以做些什么。
可以采用类似下面的建立表单的方法来建立一个文件上载的屏幕。
Example 2-3.文件上载表单
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
其中“_URL_”指向一个PHP的HTML文件。MAX_FILE_SIZE隐藏领域必须先于文件输入领域,它的值是可以接受的最大的文件大小。该值的单位是字节。在该目标文件中,下列变数用来定义是否成功的上载了文件:
$userfile:在将要存放上载文件的服务器上的临时文件名字。
$userfile_name:在发送者系统中的初始文件名。
$userfile_size:按字节计算的上载文件的大小。
$userfile_type:多用途网际邮件扩充协议类型的文件,如果浏览器提供这种信息。一个例子是“image/gif”。
注释:在这里“userfile”部分是可以变化的,它可以取任何的名字只要在上载表单中类型仍然为“TYPE=file”即可。在上面的例子中,我们选择它的名字为“userfile”。
文件将被默认的存放在服务器默认的临时目录下。在PHP运行的环境下,可以改变环境变量TMPDIR来更改这个设置。设置时,请在PHP脚本没有运行的情况下使用一个PutEnv()函数。
接受上载文件的PHP脚本语言将贯彻何种逻辑结构是必须的来决定对上载的文件可以做些什么。例如,用户可以使用“$file_size”变量来发送任何或者太小或者太大的文件来尝试一下结果。可以使用“$file_type”变量来发送任何不符合的确定类型标准的文件。无论何中逻辑结构,您都需要在临时目录中删除这个文件,或者把它移走。
如果没有被改名字或移动,那么在请求的最后该文件将被从临时文件夹中删除。
请注意,在从客户端获得MIME的连接类型之后,“CERN httpd”软件似乎将剥离任何内容而以最初的白板形式出现。在这种场合,“CERN httpd”软件将不支持上载文件的特性。
HTTP cookie支持
PHP很明显的支持HTTP cookie。Cookie是一个在远程浏览器上存储数据和跟踪或鉴定返回的用户的结构。您可以使用函数setcookie()来设置cookie。Cookie是HTTP文件头的一部分,所以该Setcookie()函数必须在任何输出向浏览器发送前被调用。这种情况和函数Header()的限制是类似的。
任何从客户计算机发送到您那儿的cookie都将被自动的转化成一个类似于GET和POST方法数据的PHP变量。如果您希望给一个cookie指派多个值,只需要在该cookie的名字后面加上“[ ]”即可。关于更多的细节问题请参看setcookie()函数。
数据库支持
PHP支持大量本地模式和完全ODBC等不同类型的数据库,包括:
Adabas D
MySQL
dBase
Oracle
Empress
PostgreSQL
FilePro
Solid
Informix
Sybase
InterBase
Velocis
mSQL
Unix dbm
正则表达式格式
正则表达式在PHP中被用来处理复杂的文字串。支持正则表达式的函数有:
ereg()
ereg replace()
eregi replace()
split()
这些函数都将正则表达式作为他们的第一个参数。PHP使用POSIX扩展规则表达式(使用POSIX 1003.2)。要找到所有的关于POSIX扩展规则表达式的描述,请查看包括在PHP发行版本之内的regex man页面。
Example 2-4. Regular expression examples
ereg("abc",$string);
/* Returns true if "abc"
is found anywhere in $string. */
ereg("^abc",$string);
/* Returns true if "abc"
is found at the beginning of $string. */
ereg("abc$",$string);
/* Returns true if "abc"
is found at the end of $string. */
eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);
/* Returns true if client browser
is Netscape 2, 3 or MSIE 3. */
ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+ )",
$string,$regs);
/* Places three space separated words
into $regs[1], $regs[2] and $regs[3]. */
ereg_replace("^","<BR>",$string);
/* Put a <BR> tag at the beginning of $string. */
ereg_replace("$","<BR>",$string);
/* Put a <BR> tag at the end of $string. */
ereg_replace("\n","",$string);
/* Get rid of any carriage return
characters in $string. */
出错操作
在PHP中有四种类型的错误和警告。它们是:
通常函数错误:1
通常警告:2
分析错误:4
注释(警告用户,可以忽略该信息,但是这个问题可能给您的代码会带来一些错误):8
信息后面的四个数字是该信息类型的表示值,把它们加起来作为错误报告的级别。却省的报告级别是7(即1+2+4),或除了“注释”的其他组合。这个级别能够通过改变php3.ini文件中错误报告指示的方法来改变。它也可以在用户的httpd.conf文件中改变php3错误报告的方法来设置,或者在运行的时候使用脚本语言函数error reporting()来改变。
所有的PHP表达式都可以使用前缀“@”来调用,对于这种特殊的表达式将关闭错误报告。如果一个错误在运行这样一个表达式时发生了,而且“track error”特性被置为可用,那么用户可以在全局变�