|
什么是PHP?
PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页。当一个访问者打开主页时,服务端便执行PHP的命令并将执行结果发送至访问者的浏览器中,这类似于ASP和CoildFusion,然而PHP和他们不同之处在于PHP开放源码和跨越平台,PHP可以运行在 WINDOWS NT和多种版本的UNIX上。它不需要任何预先处理而快速反馈结果,它也不需要mod_perl的调整来使您的服务器的内存映象减小。PHP消耗的资源较少,当PHP作为Apache Web服务器一部分时,运行代码不需要调用外部二进制程序,服务器不需要承担任何额外的负担。
除了能够操作您的页面外,PHP还能发送HIIP的标题。您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析XML的任何事情。
有了PHP就无需特殊的开发环境和IDE,您可以以<?php 作为程序块的开始,可以以?>作为PHP代码块的结束,当然您也可以用带有<% %>的标记甚至用<SCRIPT LANGUAGE=“php”></script>的ASP的格式来配置PHP,PHP会在那些标志间处理所有的事情。
PHP的编程语言类似与C和Perl。在使用它们之前您没必要声明任何变量,而且建立数组和Hash是很简单的事情。PHP还有一些面向对象的特征,可以为组织和打包您的代码提供很好的帮助。
虽然PHP在Apache里能快速运行,但是在PHP网站里有一些用来对Microsoft IIS 和Netscape Enterprise Server无缝结合的指令集。如果您还没有copy PHP的话,您可以在 http://www.php.com 下载,您也可以使用操作手册,它里边包括了所有的关于PHP的功能和特性的说明。
基本需求
因为php的脚本可以嵌套在HTML文本中,所以您不需要一个特殊的编辑器来生成主页,您只需在能够支持PHP的服务端运行即可。然而,如果您运行的服务器是您本身的话,这也是很容易做到的。如果您的页面是依赖于一个ISP的话,那么您可以联系他们的支持人员要他们帮您安装PHP。
对于UNIX系统来说,您也许需要一些相关于它的基本操作,就象使用 make和C编辑器一样,在您的系统里有一个ANSI C编辑器和一个WEB 服务端。
在您安装和配置PHP的过程中您可以在PHP Web site(http://www.php.com) 获得所有的帮助信息。
PHP的基本语法分析
例如:
<?php
echo "Hello, World!";
?>
运行结果:
Hello, World!
当然您也可以用标志符$来声明变量,您可以将“Hello,World!” 写成如下形式:
<?php
$message = "Hello, World!";
echo $message;
?>
象字符和字符串的定义以及其它算术表达式您可以如下形式定义:
<?php
$greeting = “Hello ”;
$num = 3 + 2;
$num++;
echo “$greeting $num people!”;
?>
运行结果:
Hello 6 people!
PHP 有它的完整的算法和操作,并且它们正象您所期望的那样--尤其是如果您是一位C和C++的熟练手的话,有一句很好的话可以概括它:“当您遇到麻烦时,请试着去用它,相信它能解决。”
也好象Perl一样,字符或字符串可以被嵌套定义,如果您要双重引用字符或字符串的话,那么请用双引号,但如果是用单引号的话,那么只能单层定义字符或字符串了,如下例所示:
<?php
$name = ‘Susannah’;
$greeting_1 =“Hello, $name!”;
$greeting_2 = ‘Hello, $name!’;
echo “$greeting_1\n”;
echo “$greeting_2\n”;
?>
运行结果:
Hello, Susannah!
Hello, $name!
注意:\n是用来换行的标志符,就象在Perl或C里一样。不过,这只是在双重引用字符或字符串时才是如此。
变量
PHP 把环境变量当作规则变量一样的定义,这也包括在服务器端作为一个CGI程序(即使您把PHP当作一个模块在运行)中设置的环境变量。基于这个原因,主页 http://www.domain.com/farm/cattle/cow-cow.cow.html里包含了如下代码。
<?php
echo “[$REQUEST_URI]”;
?>
它将打印出 [/farm/cattle/cow-cow-cow.html]
数组
您可以用方括号[ ]定义单元数组或多元数组:
$fruit[0] = 'banana';
$fruit[1] = 'papaya';
$favorites['animal'] = 'turtle';
$favorites['monster'] = 'cookie';
如果您定义单元数组的话可以省略其方括号中的索引号,PHP指定对象为数组的最后的元素,如上边的$fruit数组的定义可以采用如下形式:
$fruit[] = 'banana';
$fruit[] = 'papaya';
您也可以如此定义多元数组,如下所示:
$people['David']['shirt'] = 'blue';
$people['David']['car'] = 'minivan';
$people['Adam']['shirt'] = 'white';
$people['Adam']['car'] = 'sedan';
还有一个快捷的建立数组的方法是array()
函数:
$fruit = array('banana','papaya');
$favorites = array('animal' => 'turtle',
'monster' => 'cookie);
或
$people = array ('David' => array('shirt' => 'blue',
'car' => 'minivan'),
'Adam' => array('shirt' => 'white',
'car' => 'sedan'));
而下面这种嵌入式的函数count() 的主要功能为计算出数组中的元素:
$fruit = array('banana','papaya');
print count($fruit);
打印结果为:
2
控制结构
您可以用象for或while这样的循环结构:
for ($i = 4; $i < 8; $i++) {
print“I have eaten $i bagels today.\n”; }
打印结果为:
I have eaten 4 bagels today.
I have eaten 5 bagels today.
I have eaten 6 bagels today.
I have eaten 7 bagels today.
那么您也可以写成如下形式:
$i = 4; while ($i < 8) {
print “I have eaten $i bagels today.\n”;
$i++;
}
您还可以用if和elseif:
if ($user_count > 200) {
print “The site is busy right now!”;
} elseif ($user_count > 100) {
print “The site is sort of active right now!”;
else {
print “The site is lonely - only $user_count user logged on.”;
}
这种对控制结构的处理方法您还可以用 switch, do...while, 和 ?: 来完成。
一个简单的例子
PHP的最便利的特性之一是它能自动把forms中的各种变量值加载成为PHP中的变量,这个使得form能快速处理。
那么,如果您递交一个如下所示的form
<INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris">
当您正在用PHP运行页面时,变量$name便有一个 Glen Morris值.
那么您可以打印如下:
echo "Hi $name!";
或者可以测试它的值:
if ($name == "Glen Morris") { echo "Please check your email."; }
这里还有一个好的用PHP来运行基本的form的方法,例如, 我们要用户完成一个简要的问卷,这里边有他们的姓名,email,和一些我们感兴趣的调查问题。那么,如何来做呢?
首先我们应该把我们的页面分成两种功能模块,那么就需要有两个独立的页面(一个是form,而另一个则是为了运行CGI脚本),这样,我们仅仅只是想有一个PHP页面来逻辑控制用户该做些什么。
显示Form
第一个显示form的函数:
<?php
function display_form() {
global $PHP_SELF;
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Name: <INPUT TYPE=TEXT NAME="name"><BR>
Favorite Cheese: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie
<INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar
<INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella
Favorite Times to Eat Cheese:
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">Noon
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">Dinner
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Late night
<INPUT TYPE=HIDDEN NAME="stage" VALUE="results">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>
上面的代码大多数都是HTML建立一个form所必须的代码,然而,这里边也有一个复杂点,下面我们将对它进行解释。
首先,谈谈变量$PHP_SELF,$PHP_SELF是一个便利的参数--它的值就是当前主页的URL,我们把form的目标设置为$PHP_SELF,因为我们想要这个页面能够运行此form。在通过用$PHP_SELF来代替主页实际的路径时,我们可以重命名和移动我们的脚本而不用去考虑在我们每次重用这些代码时很明确地设置主页的位置。顺便说一下,代码行global $PHP_SELF的意思是我们要定义全局变量$PHP_SELF,在函数里,变量有一个局部的范围,或者说比在函数外部的相同变量名有着不同的值,如果我们不是很明确地在PHP中指定我们要定义的全局变量$PHP_SELF的值,那我们就会发现$PHP_SELF是空值。
另外, 您会发现,即使在一个FUNCTION里,我们也能在PHP模式和HTML模式里来回切换。这是完全合法的!PHP能够忽略处理HTML的内容并自动寻找下一个PHP程序段。这比单纯在PHP模式里用“ECHO”语句来显示HTML内容要快的多!
如果您要查看复选按钮和查选框名,您可以看到当我们没有选择“times[]”时它的名字后面有一对括号,这是因为按钮仅仅让您选择一个正确答案, 所以这个 “cheese” 值是一个字符串。另一方面,查选框可以提供您多种选择,对于PHP来说保存所有的答案是将它们放在数组里,把[]添加在变量名后面,让PHP能读辨认出它是一个数组而不是一个标量。
最后,程序中有一个隐含变量叫“stage”,我们用 $stage告诉自己是否显示FORM或运行其结果。
运行FORM
请看这个函数process_form():
<?php
function process_form() {
global $name;
global $cheese;
global $times;
if ($cheese == 'brie') { $cheese_message = 'I love brie.'; }
elseif ($cheese == 'cheddar') { $cheese_message = 'Cheddar is awesome!'; }
else { $cheese_message = 'Fresh mozzarella is divine.'; }
$favorite_times = count($times);
if ($favorite_times <= 1) {
$times_message = 'You should eat cheese more often.';
} elseif ($favorite_times > 1 && $favorite_times < 4) {
$times_message = 'Those are good times to eat cheese.';
} else {
$times_message = 'You are eating too much cheese.';
}
echo "Hello $name.";
echo "$cheese_message $times_message";
}
?>
首先,我们要处理 $PHP_SELF,我们获取了窗体的全局变量,然后我们检测看程序响应时哪个cheese项被选择了。
接着,我们用count()方法得出我们所选的favorite times的次数。在这之前,我们必须检查每一个$cheese的可能的值,现在我们能够知道$favorite_times的比较范围,看来您很惊讶 && 在检测"$favorite_times > 1 && $favorite_times < 4"中的意思, 它相当与 "and." 所以, $favorite_times 必须要大于等于1和小于等于4来检测出结果。
在最后,我们可以打印出每人的姓名和他们各自的相关信息,当然,您可以做其它各种各样的事情,比如把这些信息保存在数据库或者查询信息库把这些信息结果做一个很漂亮的版面。
把Form 连接起来
现在我们已经完成了两个函数,我们还需要一些代码把它们给联系起来,将这些脚本添加一些逻辑规则,那么,我们可以这么做:
<?php
if (empty($stage)) { display_form(); }
else { process_form(); }
?>
最开始我们检测 $stage是否为空,在PHP中, 一个变量是否为空要看它是否没有被设定(意即,它从没有被指定任何值)或者说它的值为空 (就是说, 它被指定的值是一个空值,或者是一个空字符串‘ ’,或者说是
“0”),当人们第一次访问我们的页面时$stage 为空,那么我们显示form,否则我们运行form。
这就是用PHP处理form的全部过程了。
多窗体
当然,事情并不是尽善尽美的,但是如果您在您的一个页面里能完成多个FORM,为什么不能在多个页面中完成多个form呢?
不幸的是,HTTP并不能使我们在页和页之间传递数据,那是因为在协议的内部没有一个内部机制来定义一系列的概念,不过幸运的是在 PHP中有一些技巧和一些便利功能的可以帮助我们不用费力就可以突破这个限制,这一部份的关键的思想是我们要把前一页的所有的输入的信息存储起来作为下一页的FORM的隐藏变量,这是因为这段代码把我们在屏幕上输入的信息作为参数传递给下一个页面, 每一个form中都包含了前一个form的数据。这原理也许有一点费解, 但它应用的却是一个简单的方法--它也不必要求我们用到数据库和cookies. 不要惊讶这一点,我们可以扩展我们用过的$state变量来实现这种特性,这就是为什么我们要通过这些问题来介绍这种技巧了。
为了方便起见,我们重用前面提到过的例子,但这次,我们要用一些关于cheese的重要的东西来代替name。我们将把它们分为两个页面。
现在我们将用三个函数来代替前面的两个,另外,我们将把他们重命名以便反映出内容的变化, display_form() 现在命名为display_name()。
<?php
function display_name() {
global $PHP_SELF;
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Name: <INPUT TYPE=TEXT NAME="name"><BR>
<INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>
这段程序和前面的内容几乎是一样的,但是我们已经程序分开来并且改变了下面的函数的名字。
现在来看函数display_cheese()。
<?php
function display_cheese() {
global $PHP_SELF;
global $name;
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Favorite Cheese: <INPUT TYPE=RADIO NAME=“cheese” VALUE=“brie”>Very soft French Brie
<INPUT TYPE=RADIO NAME=“cheese” VALUE=“cheddar”>Farmhouse English Cheddar
<INPUT TYPE=RADIO NAME=“cheese” VALUE=“mozzarella”>Italian Buffalo Mozzarella
Favorite Times to Eat Cheese: <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning
<INPUT TYPE=CHECKBOX NAME=“times[]” VALUE=“n”>Noon
<INPUT TYPE=CHECKBOX NAME=“times[]” VALUE=“d”>Dinner
<INPUT TYPE=CHECKBOX NAME=“times[]” VALUE=“l”>Late night
<INPUT TYPE=HIDDEN NAME=“name” VALUE=“<?php echo htmlspecialchars($name); ?>”>
<INPUT TYPE=HIDDEN NAME=“stage” VALUE=“results”>
<INPUT TYPE=SUBMIT VALUE=“Thanks!”>
</FORM>
<?php
}
?>
同样,上面的代码看起来应该是比较熟悉了,但是我们还没有处理任何额外的问题,除了前面我们要打印的隐藏元素stage,$name 的名和值,还有前面的一些数据。不过,我们也没有直接地单纯地打印这些值,而是通过一个叫htmlspecialchars()的PHP函数在HTML中运行的。上面的程序其中有四个符号<, >, ", 和 &.除了作为标志外没有被做其它的应用。为了确定我们不会混淆,我们通过htmlspecialchars()函数运行$name。
现在,当新的form被建立时,我们就不会丢失任何信息了。实际上,我们将保持函数的名字和上面的相同,而且,我们将需要加一些新的代码到我们的逻辑显示页中。
<?php
if (empty($stage)) { display_name(); }
elseif ($stage == 'cheese') { display_cheese(); }
else { process_form(); }
?>
看到了吗?所有的我们做的东西都被包含在 一个elseif语句的两种状态中,这就是用$stage的好处了。如果我们想要增加页面,我们只需要写一个新的函数来显示我们想要显示和它在显示时被控制的东西了。
|