作为构建动态网页的一种语言,PHP提供了一种简化的方法来构造复杂而功能强大的 与 Web 相关的程序。Erik用一个原始的、现实世界的网站示例逐步说明了 PHP 的基本原理。本系列文章分为两部分,第 1 部分介绍了 PHP的基本概念,并分析了一个应用程序示例,Webzine。Webzine 包括内容提供者可输入文章文本的一个编辑页,以及用来将该内容展示给全世界的一个前端。
如果您是初次接触PHP,您可能会惊喜地发现在实践中它是多么易于使用。本文旨在使您对 PHP的工作方式留下一个好的印象; 随后您就可以确定它是否适合您。
1.有关PHP的经验
本系列文章分为两部分,第1部分说明这个应用程序是如何工作的(不包含在您的系统上安装PHP)。您将有机会试用主索引页,并窥视一下部分组件在幕后是如何工作的。如果这是您唯一的动力,则请一定要查看下一篇,在那一部分将深入探讨有关主索引页的其他内容。(第 2部分还将用几个程序示例讨论编辑组件。您可以下载源代码并将您自己的想法付诸实施。)
如果您了解 HTML 并熟悉任何一种类似 C 语言的语言(尤其是Perl),则您理解下面的示例应该不成问题。 即使您没有太多使用过类似C的语言,您仍然能够理解这些示例。但您确实需要了解 HTML的基本知识。
这个 PHP 应用程序样例是一个生成阅读器的Webzine,它带有一个简单的发送模块(代码不超过3K)。该模块显示一个主题列表。
在每个主题标题下是一系列按逆时间顺序排列的文章摘要。用户通过单击标题就可以看到整篇文章。还有一个稍复杂一点的编辑模块,它允许任何读者成为作者并提交他/她自己的内容。作者必须选择一个类别,并输入文章的标题、简单的摘要和故事的全文。如果愿意,您可以输入一个图像文件的URL 并单击“预览”按钮来检验是否一切已经就绪。作者的输入要经过验证--甚至要经过安全检查,这种安全检查将把除少数安全的标记以外的所有标记转换为非活动格式,从而防止危险或恶意的HTML 编码被执行。例如,字符串 将变为。这种转换实际上使标记无效。
2.一项专用的 PHP 技术
在研究Webzine的实际代码之前,让我们首先考虑一个简单的示例,这个示例很好地说明了PHP 的特征。PHP的语法允许您任意将HTML语句与PHP语句混合在一起。这意味着HTML语句可以出现在循环、if/else语句、函数等上下文中。我在Webzine程序中利用了这一特性,但下面的代码样例用一种更简单的方法使它变得更简洁。
假定我们有两个数组,$names和$days,它们包含一年中各个月的信息,于是$days[0]= 31和$names[0]="January",$days[1]等于28和$names[1]等于"February",等等。下面这项技术用来创建包含天数和月名的一个表:
清单 1:创建包含天数和月名的一个表
<table border=2>
<tr><th>Name</th><th>Days</th></tr>
<?php
for($i=0; $i<12; $i++) { // 循环开始。
?>
<tr><td><?php echo($names[$i]) ?></td>
<td><?php echo($days[$i]) ?></td></tr>
<?php
} // 循环结束。
?>
</table>
为明确起见,上面的PHP语句用红色显示;HTML语句用黑色显示。请注意,专用标记 从HTML切换到 PHP,而 ?> 切换回 HTML。
要注意的一点是:您可以切换到 PHP,开始一个for循环(或 if/else,或switch,或其他语句),然后退回到HTML,现在您正在输入的 HTML命令将成为循环结构的一部分,所以它们随循环一起重复。您可以根据需要(例如,如我在上面所做的那样,发出echo 语句以将变量输出到网页中)进入或退出 PHP 模式。然后,当您退回PHP 并输入一个结束花括号时,正如您所料,循环结束。
实际表的外观如下所示:
Name Days
January 31
February 28
March 31
April 30
May 31
June 30
July 31
August 31
September 30
October 31
November 30
December 31
如果这种行为令人迷惑,则可以这样来考虑它:PHP解释器将用echo 语句替换HTML模式中的每一行,以将该行送入输出流中。如果 echo语句出现在 if/else 结构中,则它将是有条件执行的。如果它出现在一个循环结构中(如上所示),则它将重复执行。
3.应用程序概述
Webzine驱动程序,index.php3,有三个主要的组件:主题菜单、故事列表和完整的故事表示。如果读者选定的主题没有任何故事,也会显示一些缺省的文本。编辑页更复杂。它包含一个表单、一个反馈消息和一个确认消息,表单用来接受用户的输入,反馈消息来通知作者需要纠正的问题,确认消息用来向作者显示他们所提交的内容。它还知道如何验证所提交的故事,进行必要的更改以确保内容中不包含任何未经认可的HTML,将故事保存在一个故事文件中,并更新这个故事相应的菜单文件。
该应用程序有三种数据文件:Category.txt包含一个简单的主题列表,故事就是在这里组织的。每个主题与一个主题菜单文件相关联。第一个主题必须是"Main",并与主题菜单文件 Main.txt 相关联。如果第二个主题是 "TheArts",则它与名为 TheArts.txt的主题菜单文件相关联。在菜单文件中,每个故事的信息单独占一行:一个故事编号、一个标题、一个类别、一个简单的摘要,以及一个可选的图像URL。最后,故事文件包含一个故事的实际正文。文件 s1.txt将包含第一个提交的故事,s2.txt包含第二个提交的故事,依此类推。如果您知道一个故事的编号(比如说 26号),则它的文件名很容易确定 (s26.txt)。
4.试用 Webzine!
在您仔细研究这个应用程序之前,请首先试用它。试用 Webzine驱动程序。它的左侧是一个主题列表,右侧是一个故事列表。您可以选择一个主题,或者选择"Main"来查看所有故事。首先出现的是最近的故事列表,第一组故事中如果有图像,同时也会显示这些图像。当您单击一个故事的标题时,就是出现一个包含该故事的完整正文的一个页面。
试用编辑页(您也可以从Webzine 中试用它)。它提供一个表单,允许您提交一个故事。向 Webzine提交内容时,请注重大众的观念和好的品味。如果您录入程序不喜欢的内容,将显示一条错误消息。一旦故事被接受,您就可以返回Webzine 来查看它在读者面前是什么样子。
现在您已经试用了应用程序,请继续阅读后面的部分以了解它的创建过程。
4.Webzine 驱动程序
传递参数
index.php3 页允许传递参数,如下所示: index.php3?topic=TradeShow&story=33
对于上面的调用,下面的变量赋值将在调用index.php3之前自动进行:
$topic = "TradeShow";
$story = 33;
如果您忽略这些参数,则$topic和$story变量将不存在。您可以显式地对它们进行检测,或在您引用它们时让PHP返回缺省的空值。
注:如果这个特性在您的系统上不起作用,请查看 php.ini文件,确保 register_globals = On。
网页标题
让我们首先查看许多PHP应用程序中的一项常用技术;将某些种类的信息存入程序开头的变量赋值语句中。这样易于以后的维护和更新。
清单 2:变量赋值
同样,请注意 PHP 的边界标记: 使您从 HTML模式进入 PHP 模式,而 ?> 切换回 HTML 模式。您可以来回切换任意次。某些操作在 HTML模式下较容易实现,而另外一些操作在PHP模式下较容易实现。您所做的全部事情就是在程序开头定义两个变量,然后进入HTML 模式。当需要使用某个变量时,就退回 PHP 模式,并发出一条echo语句将该变量的值直接写入网页正文中。
<?php
$title = "PHP Demo Webzine";
$slogan = "Illustrating the coolness of PHP since September 2000";
?>
<html>
<head>
<title><?php echo($title) ?></title>
</head>
<body>
<h1><?php echo($title) ?></h1>
<p><i><?php echo($slogan) ?></i></p>
类别菜单
Category.txt文件只是主题名的一个列表,每个主题名单独占一行。例如,如果该文件只包含三项:
Main
Politics
Technology
您将获得三个主题菜单文件:Main.txt、Politics.txt和Technology.txt。一旦选定 "Main"主题,驱动程序就会出现,如下所示:
Main
Politics
Technology
HTML 源代码如下所示:
<table border=1>
<tr><td bgcolor="pink"><center>
<b> Main </b></center></td></tr>
<tr><td bgcolor="silver"><center>
<b>
<a href=http://www.sheup.com/?"index.php3?topic=Politics">Politics</a> </b></center></td></tr>
<tr><td bgcolor="silver"><center>
<b>
<a href=http://www.sheup.com/?"index.php3?topic=Technology">Technology</a> </b></center></td></tr>
</table>
下面是从将 Category.txt 编译为上面所示的 HTML 代码片断的 PHP
源代码中摘录出来的相关代码片断。首先,将文件 Category.txt
读入一个数组 $cats:
<?php
$cats = file("category.txt");
$elems = count($cats);
?>
file 函数只是将文件复制到一个数组中。所以$cats[0] 等于 "Main",$cats[1] 等于"Politics" ,$cats[2] 等于"Technology"。file 函数使导入一个小 ASCII文本文件变得非常容易,但不要将它用于很大的文件。count函数统计数组中的元素个数,所以在本例中 $elems 应�