当前位置:首页 > PHP学习宝典-第九章

PHP学习宝典-第九章

点击次数:1451  更新日期:2011-01-03
\n

网页间的信息传递

本章重点

为什么HTTP会生生不息地扩散?

GET参数

另一种使用GET风格式样的URL

处理窗体变量

PHP超数组

本章简单讲解一些有关在Web页面之间传递数据的内容。这样的一些信息不是PHP特有的,而是PHH/HTML或HTTP协议本身中很重要的部份。

HTTP是没有状态纪录的(stateless)

需要记住有关Web服务一项最重要的事情是,HTTP协议本身没有状态纪录的(stateless)。如果读者具有诗意的灵魂,可能就会说每个HTTP请求(request)孑然一身,没有家园,就像一个全然未知的……你知道这之类的说法。对缺乏诗意的我们,说白点就是指每个HTTP请求(每一次的请求和传送页面)独立于所有其它的内容、不知道客户端身份,而且也没有记忆。每个请求产生一件独立过程,完成一件档案服务、看似微小却重要的任务,然后自动消失(这样呼起来很无情,或许可以说成「回到可处理的状态中」)。

即使把网站设计成非常不严格的单向导航(页1引导到页2,页2引导到3等等),PTTP协助从来不知道也不关心某个人浏览的页2是否来自页1。因此,不可以把页1上的变量设定成透过HTML本身来导入该页。可以使用HTML显示窗体,用窗体输入一些信息,但是除非用一些别的方法把信息传送到另一页或另一个程序,否则一旦移到另一页,变量就消失了。

这是为什么导入像PHP这样的窗体处理技术的原因。PHP可以撷取从一页辗转传到另页的变量,能对它进行更进一步的动用。PHP函式正好非常擅长这种型态的数据传递函式,这样能更快、更容易地完成各种Web网站的任务。

HTML窗体是网站上用来由一个网页传递一些数据最有用的方法,有许多更持久的方式可以维护横跨许多网页的状态方法,例如cookie与session,我们会在第27章介绍这些功能。本章会着重在更基本的技术巧用来传递网页之间的信息,就是使用HTTP和GET与POST方法来进行动态产生网页以及处理数据。

ASP程序设计者看到这里可能要说「PHP真烂!」因为他们让为ASP的session变量是非常神奇的。这不是要截破谁的泡泡,而是微软正打算利用cookie来储存session变量,不过这样就打开了所有潜在问题的大门。

GET参数

GET方法把参数当成URI [Uniform Resource Indicator,一致资源指示器;也有人更习惯用URI (Uniform Resource Indicator,一致资源定位器)]查询字符串的一部份,从一个页面传递到另一个页面。当用于窗体处理时,GET用问号(?)当成分隔符号把变量名称和值附加给在ACTION属性中来反指定的URL,并把所有内容提交给提供处理的技术(在这个例子中是Web服务器)。

这是一个使用GET方法的HTML窗体范例(把档案存在team_select.html):

< HTML >

< HEAD >

< TITLE >A GET example, part 1< /TITLE >

< /HEAD >

< BODY >

< FOPM ACTION = http://localhost/baseball. php METHOD = “GET” >

< P >Root, root, root for the :< BR >

< SELECT NAME = “Team”SIZE=2 >

当使用者进行选择并按一下Submit按钮时,浏览器按照下面的顺序把这些元素接合、一起,中间不会有空格:

在单字ACTION后面,括在引号中的URL(http://localhost/baseball.php)

问号(?)指示以下字符即会组成GET字符串

NAME变量、等号、以及配合的VALUE(Team = Cubbies)

「&」符号和下一对「NAME = VALUE」(Submit = Submit);只要服务器查询字符串的长度限制允许,这些使用&区隔的name – value组合可以被重复许多次。

这样会构成这样一个URL字符串:

(http://locahost/baseball .php ? Team = Cubbies&Submit = Select)

其中字符串成为新的请求传送到浏览器的地址空间。上面的窗体提交后,处理窗体的PHP script(baseball.php)将从请求字符串的尾端取得GET变量,并对这些变量进行相对应的操作,在下面这个例子中,是把两个值中的一个插入文字字符串中。

以下程序代码是PHP用来处理原先HTML窗体的窗体处理部分:

< HTML >

< HEAD >

< TITLE >A GET example ,part 2< /TITLE >

< STYLE TYPE = “text/css”>

< !–

BODY {font-size: 24pt;}

– >

< /STYLE >

< /HEAD >

< BODY >

< P >Go,

< ?php echo _GET[‘Team’];? >

!

< /BODY >

< /HTML >

最后你应会看见网页上呈现大字样的Go,Cubbies。

窗体处理中的GET方法有一个比POST方法好很多的优点:它建立了一个真正新的、完全不同的URL查询字符串。如此一来使用者就可以把这一页记为书签(当开发小组意志消沈时,看到这个就能鼓舞士气了)。从使用POST方法的表单取得到的结果是不能记成书签的。

然而,你可以用GET参数完成想要的功能不代表你应该使用,对于大多数表单处理程序,GET方法的缺点实在是太严重了,以致于最初的HTML 4.0正式规格不赞成使用它。这些缺点包括:

GET不适合用于登录(login),因为把使用者名称和密码当成存取过的面潜藏储存有用户端浏览器的记忆体中时,在萤幕是也是完全可看见的。

每个GET提交都被记录在Web服务器log中,资料集也包括在内。

因为GET会分配资料到服务器环境变数,所以URL的长度有受到限制。你可以想象使用GET时非常长的URL是长什么样子,不过事实上谁也不想用这种方法尝试传递三百字的HTML格式的文章。

初使的HTML正式规格中对查询的字符串长度的限制是255个字符,虽然后来放宽了对255个字符的限制,但是使用很长的字符串真的是自寻烦恼。

在进行过很多争论后,W3仍然恢复使用表单处理中的GET方法,主要是由于书签功能的因素。虽然GET方法仍然是表单处理的预设选取项,但我们还是建议你只把它用于没什么副带作用于的地方。把两个优点和两个缺点放在一起考虑思量一番,使用GET处理表单的最适合的用途其实应该是「搜寻方块(search box)」。除非迫不得已的原因才把GET方法用在非搜寻性的表单处理程序,不然你就使用POST方法替代。

一种更好的GET风格URL用法

虽然对表单处理GET方法已经被建议不采用了。但是和它相关的URL风格对于网站的导航还是非常有用的,尤其适用于动态广告的网站,例如那些经常用PHP建构的网站,因为附加了变数格式的URL,就非常适合以样版当基础的内容发展系统。

有如下例所示,假设你所经营的是一个关于太阳能汽车资料丰富的Web网站,而你已将冗长且一致格式的资料丰富与诱有页面存放如下:

suspension_design.html

windtunnel_testing.html

friction_braking.html

但是当网站规模增大时,如此简单的档案网站结构就要耗费很多时间进行管理,因为一些琐碎的变动都必须在每个页面上重复进行。如果这些页面的结构非常简单,就可以用PHP把网站转换为以样版基底的系统。

你可能决定用一个单一的样版来将每一个主题的文字档案区分(包括资讯、照片、意见,等等):

topic.php

suspension_design .inc

windtunnel_testing . inc

friction_braking . inc

或是你可能决定一个更大、更为特殊选择处理的样版档案:

vehicle_structure . php

tubular_frames . inc

mechanical_systems . php

friction_braking . inc

electrical_systems . php

solar_array . inc

racing . php

race _strategy . inc

一个简单的样版可能有如此例所示(因为我们未含括所需的 .inc文字档案,这个档案将无法实际运作):

< HTML >

< HEAD >

< TITLE >Solar – car topics< /TITLE >

< STYLE TYPE= “text/css” >

< !-

BODY{font:verdana;font – size:12pt}

– >

< /STYLE >

< /HEAD >

< BODY >

< TABLE BORDER = 0 CELLPADDING = 0 WIDTH = 100% >

< YR >

< !—Navbar,with Get-style URLs .– >

< TD BGCOLOR = “#4282B4” ALIGN = CENTER VALIGN=TOP WIDTH=25% >

< P >

< A HREF=“mechanical_syatems .php? Name = friction_braking”>< B >Friction braking< /B >< /A >

< BR >

< A HREF = “mechanical_syatems.php?Name = steering” >< B >Steering< /B >< /A >

< BR >

< A HREF = “mechanical_systems .php ? Name = Suspenion” >< B >Suspenion< /B >

< /A >

< BR >

< A HREF = “mechanical_systems .php ? Name =tires” >< B >Tires and wheels< /B >

< /A >

< BR >

< /P >

< /TD >

< !—Main body of content – - >

< TD BGCOLOR = “#FFFFFF” ALIGN = LEFT VALIGN=TOP WIDTH = 75% >

< ?php include(“_GET[‘Name’].inc”)? >

< /TD> < /TE >< /TABLE >

< /BODY >

< HTML >

请注意,当被按一下时导航列上的连接会被浏览器处理,就像是提交一个GET处理一样。

但是对于这个处理方案,仍然必须手动更改一部份程序码:以确保每个被包含进去的档案都是正确的HTML格式,每次给网站增添新页面时让导航列加入新的连接,以及其它类似的内容。尽可能按照一般常规把表单和内容分开,你可以选择使用资料库。若使用资料库,URL就会类似如下:

(http://localhost/topic .php ?topicID = 2)

它将指向某个处理资料库呼叫的PHP样版(使用数字变数而不是使用单字可以更快地查询资料库)。当给资料库新增新的主题时,该系统会帮导航列加入连结,所以不用手动就可以产生所有的Web页面(这里的「所有」一词是有些夸大了,但是的确可以省去人员与时间的多余劳力)。

POST参数

POST是目前相对好的表单处理方法,尤其适合需要不是一次使用完的情况(指定长期配合处理的一些资料或作用),例如在为资料库添加资讯的处理。当表单资料被传送到处理程序(在这里指PHP)时,被包含在表单本体内。提交的资料不同时,在URL中看不出什么变化。

POST方法有以下这些优点:

◎ 它比GET更安全,因为在URL查询字符串、服务器log中,或在萤幕上(如果采用了预防措施,例如总是使用HTML的password输入格式来表达密码栏位)看不到使用者输入的资讯。

◎ 对能被传递的资料的数量限制更宽松了(可到二千个元组,而不只是二百多个字符)。

不过POST也有一些缺点:

◎ 其结果不能被标记为书签。

◎ 这种方法和某些防火墙设定不兼容,为了安全上的考虑,防火墙会去掉某些表单资料。

在本书中我们一致使用POST方法来处理表单,尤其在使用写入档案或INSERT的SQL语法将资料填入系统时。我们只在网站的浏览与搜寻方块才会使用GET的方法,换句话说,使用时机分别为将资料写到资料储存位置以及显示网页,本章其余表单皆会使用POST方法。

同时使用GET和POST方法

你知道吗?PHP允许在同一页上同时使用GET和POST变数,因此可以自在地编写动态表单!

但是这样立刻引发一个问题:如果在GET 和POST阵列中(故意或由于其它原因)使用同样的变数名称会怎么样呢?如果你将你的php .ini档案内的register_globals指令设定为on的话,PHP把ENVIRONMENT、GET、POST、COOLIE与SERVER等变数存放在GLOBAL阵列中,如果产生冲突的话,它会根据你所设定的顺序来重新调整变数内容来解决,藉由你在php .ini内的变数_order选项设定。较后者会取代前者,所以如果你使用预设的“EGPCS”值的话,POST会取代GET,COOKIE会取代POST,你可以藉由在这个档案内适当调整字母的顺序来控制取代的顺序,或是甚至最好将register_globals关闭并使用PHP新的超全域阵列,我们会在以下部分介绍。

在PHP中的变数处理

PHP对于传递资料非常有效率是因为开发者决定使用一项很方便但(在理论上)有点复杂的设计。当使用GET或POST方法提交资料集时,PHP会自动担以看不见的方式为新页面上的变数地行指定。其它大多数的程序语言让程序设计者自己在页面上执行明确显生的指定处理;如果忘记指定或写错了,则资讯就不能传到处理代理程序中。相较之下,PHP更快、更简单,更能防呆。

但是由于这样的自动变数指定,你必须永远为每个INPUT控制项取一个好的NAME属性,其实NAME属性并不是HTML强制需要的,你的表单即使少了它仍可以运作正常,但是资料将会没有任何功用,因为这些HTML的NAME表单栏位属性将是表单处理程序的变数名称。

换句话说,以下的表单:

< FORM ACTION = “< ?php echo _SERVER[‘PHP_SELF’]; ? >” METHOD =“POST” >

< INPUT TYPE=“text”NAME=“email” >

< INPUT TYPE=“submit”NAME=“Submit” VALUE=“Send” >

< /FORM >

email文字栏位将会使得当表格传送时PHP产生变数为_OPET[ ‘email’](或是如果你使用旧式的阵列变数则为 HTTP_POST_VARS[ ‘email’],甚或是你将register_globals启动则为email),同样的,传送按钮会使得下一个网页产生_POST[‘submit’]变数,你在HTML表单所使用的名称将会成为你PHP表单处理的变数表单栏位。

另外一个产和生HTML表单必须记住的就是如果你希望表单在填写之前显示初始字样的话,你必须设定VALUE属性,这特别有用在两种类型的表单上:用来将资料输入资料库的表单,以及用来传送超过一次的表单,其中后者常常出现在表单需要在出现填入错误时重新显示表单的情形,例如,一个用来登录的表单会直到使用才输入有效的email地址或是其它相关资料才能送出。

例如,以下的表单(用来当作退休金试算表)被设计为当使用者填入资料时可以传送多次,每当你传送表单,你前一次所填入的次料会自动填入,请注意以下程序范例表单栏位的VALUE属性。

< HTML >

< HEAD >

< TITLE >A POST example:retirement savings worksheet< /TIELE >

< STYLE TYPE = “text.css” >

< !- -

BODY {font-size:14pt}

.heading {font-size:18pt; color:red}

–>

< /STYLE >

< /HEAD >

< ?php

//This test,along with the Submit button value in the form below,

//will check to see if the form is being rendered for the first time

//(in which case it will display with only the default annual gain

//filled in )

If (!IsSet(_POST[′Submit‵])||_POST[′Submit‵]!=′Calculate‵){

_POST[‘CurrentAge’] = “”;

_POST[‘RetieAge’]= “”;

_POST[‘Contrib’]= “”;

Total = 7;

}else{

AnnGain = _POST[‘AnnGain’];

Years = _POST[‘RetireAge’] – _POST[‘CurrentAge’];

YearCount = 0;

Total = _POST[‘Countrib’];

While(YearCount<= Years){

Total = round(Total *(1.0 + AnnGain/100)+_POST[‘Contrib’]);

YearCount = YearCount+1;

}

}

? >

< BODY >

< BIV ALIGN = CENTER ID = Divl class = heading >A retirement – savings calculator

< /DIV >

< P class = blurb >Fill in all the values(except “Nest Egg”)and see how much money you′ll have for your retirement under different scenarios.You can change the values and resubmit the form as many times as you like.You must fill in the two “Age”variables.The “Annual return” variable has a default inflation-adjusted value (7% = 8% growth minus 1% inflation)which you can change to reflect your greater optimism or pessimism.< /P >

< FORM ACTIIN = “” METHOD=“POST” >

< P >Your age now:< INPUT TYPE=“text” SIZE= 5 NAME=“CurrentAge”VALUE=“” >

< P >The age at which you plan to retire:< INPUT TYPE = “text”SIZE=6

NAME = “RetireAge”VALUE = “< ?php echo _POST[‘RetireAge’];? >” >

< P >Annual contribution:〈 INPUT TYPE=“text” SIZE=15 NAME=“Contrib“ VALUE=“ < ?php echo _POST[ˋContribˊ]; ? > “ >

< P > Annual return: < INPUT TYPE==“text”SIZE=15 NAME=”AnnGain ”VALUE= ”< ? php echo annGain; ? > ” > %

< BR >< BR >

< P >< B >NEST EGG< /B >:< ?php ECHO Total;? >

< P >< INPUT TYPE=“submit”NAME=“Submit”VALUE=“Calculate” >

< /FORM >

< /BODY >

< /HTML >


图9-1显示上述程式的结果.


图9-1:使用方法与VALUE属性的表单


强化表单与表单处理

如同你可以在上述程序所见,通常将HTML表单与表单处理程序放在同一个程序是简易的,这样的方式有许多优点,例如,你的登录网页将会在登录失败时显示错误讯息,如果你将表单处理程序分开的话,你可能还需额外藉由GET变数来重新转址,如果你强化表单运作的话,你可以更加简易的控制显示而不需使用如此的机制。

当你强化表单的时假,表单处理程序应该出现在表单显示之前,有人可能会让为因为先设计表单才处理程序所以应该将顺序颠倒,但是如果你按照这里的方式,你便会了解其间的逻辑,你必须使你能够先将变数名称取好并且在显示表单之前做选择,这对如果你在某些情形必须将使用者导向不同的网页,藉由使用header()函式,更重要的,因为这个决定必须在任何HTML输出显示在浏览器之前就变成了。

通常有两种方式来检查你是否第一次显示表单,或是是否它已经至少被传送过一次了,你可以如同我们上述程序方式使用Submit按钮,或是如果你要使用所有Submit按钮相同的传送讯息(例如“Submit”)则使用一个隐藏变数,后者方法是比较安全的,因为有些浏览器事实上在按下Enter键而不是传送按钮时并不会传送Submit内容。

使用表单的阵列变数

在目前所示的范例为止,每个表单栏位会产生一个字符串或整数型态的变数,这意谓的表单栏位与表单处理变数是一对一关系的,但是PHP仍然允许你传送一个阵列型态的变数?(如果你对阵列尚未熟练的话,请先阅读第十一章再接续这个部分)。

以下是一个产和生来自HTML表单栏位名称的阵列范例:

< ?php

/******************************************************

*“How geeky are you?”script,showing with screens.*

* Screen 1::quiz form .Screen 2 :results page. *

******************************************************/

//The header which appears in both cases

//——————————————-

header_str = <<< EOHEADER

< HTML >

< HEAD >

< STYLE TYPE=“text/css” >

< !–

BODY ,P, TD {color:black;font-family:verdana;font-size: 9 pt}

H1 {color:black;font-family:arial;font-size:12 pt }

– >

< /STYLE >

< /HEAD >

< BODY >

< TABLE BORDER = 0 CELLPADDING=10 WIDTH=100% >

< TR >

< TD BGCOLOR=“#F0F8FF”ALIGN=CENTER VALIGN=TOP WIDTH=150 >

< /TD >

< TD BGCOLOR=“#FFFFFF”ALIGN=LEFT VALIGN=TOP WIDTH=83% >

< table cellspacing =0cellpadding=20 border = 0 width=“530” >< tr >< td >

Valign=top >

EOHEADER;

//The footer which appears in both cases

//————————————–

footer_str = <<< EOFOOTER

< /td >< /tr >< /table >

< /TD >< /TR >< /TABLE >

< /BODY >

< /HTM L>

EOFOOTER;

//Scree 1: quiz form

//——————-

quiz_str = <<< EOQUIZ

< h2 >How geeky are you?< /h2 >

< form action = “geek_quiz.php”method = “POST” >

< br/ >< br/ >

0. Have you ever had a dream in which you were debugging?< br/ >

Yes < input type = “checkbox”name=“affirm[0]”value=“1”/ >

< br/ >< br/ >

1. Do you know the name of the company founded by Danny Hillis?< br/ >

Yes < input type=“checkbox”name=“affirm[1]”value=“1”/ >

2. Can you edit a file in both emacs and vi without recourse to any

documentation?< br/ >

Yes < input type=“checkbox”name=“affirm[2]”value=“1”/ >

< br/ >< br/ >

3. Is the computer you′re using at this moment hooked up to a KVM

Switch? < br / >

Yes < input type=“checkbox”name=“affirm[3]”value=“1”/ >

< br/ >< br/ >

4. Are you wearing a logowear T-shirt?< br/ >

Yes < input type=“checkbox”name=“affirm[4]”value=“1”/ >

< br/ >< br/ >

5. Have you ever written a chess program?< br/ >

Yes < input type=“checkbox”name=“affirm[5]”value=“1”/ >

< br/ >< br/ >

6.Have you ever set up an SMTP server?< br / >

Yes < input type=“checkbox”name=“affirm[6]”value=“1”/ >

< br/ >< br/ >

7.Have you ever discussed the merits of a commercial LISP

implementation?< br/ >

Yes < input type=“checkbox”name=“affirm[7]”value=“1”/ >

< br/ >< br/ >

8. Have you ever used the phrase “I can do that in two lines of code”in public?< br / >

Yes < input type=“checkbox”name=“affirm[8]”value=“1”/ >

< br/ >< br/ >

9. Have you ever refused an otherwise welcome sexual advance because

You were debugging?< br/ >

Yes < input type=“checkbox”name=“affirm[9]”value=“1”/ >

< br/ >< br/ >

< input type=“submit”name =“submit”value = “Evaluate” >< /form >

EOQUIZ;

//——————

//Now for some logic

//——————

echo header_str;

if(!isSet(_POST[‘submit’]))){

//First time, show the quiz form

echo quiz_str;

}elseif (_POST[‘submit’]==‘Evaluate’){

//Count up the yes answews

num_affirm =count(_POST[‘affirm’]);

//Come up with a 4 different blurbs

if(num_affirn>=0 && num_affirn<=3){

result_str = “< P >Why even pretend to be something you′re so clearly

not?< /p >
”;

} elseif (num_affirm>=4 && num_affirm< =6){

result_str =“< p >Come bake when you′ve learned more craft,

Grasshopper.< /p >
”;

}elseif(num_affirm >=7 && num_affirn< =8){

result_str=“< P >Pretty geeky,but not yet a Code God.< /P >
”;

}elseif (num_affirm >=9 && num_afirm< =10){

result_str = “< P >We′re not worthy to be in the presence of your bad

geeky self!< /P >
”;

}

echo result_str;

}

echo footer_str;

?>


图9-2显示上述程序的输出


图9-2: 一个显示阵列变数的表单


由于我们必须计数有几个Yes答案勾选了,所以将每个勾选框使用不相关变数名称要来计数是颇为麻烦,如同你可以在上述程序所示(第39行),使用阵列命名并呼叫count()函式是较简单的,在其它种种情况下使用阵列显得比使用一些文字需要较少的程序码。

如同你可以在HTML表单中看到,在HTML表单中产生的阵列变数是在名称后使用中括号,你也可以使用空白的中括号,使用我们上述程序所用内含整数的方式,亦或是在中括号内使用字符串,当你更加习惯阵列并且知道你需要何种阵列来运作,你就会更加清楚你所用这些方式的意交。

PHP的超全域阵列(Superglobal Arrays )

一个PHP4已经使用了颇久的功能就是逐渐使用新的超全域阵列来取你原本自支全域变数的方式,在你了解阵列之前使用超全域阵列是不容易的,如此我们建议你阅读第十一章之后在返回这部份内容。

在PHP4.1之前的美丽旧时光中,你可以撰写如下程序并预料会运作正常:

< ?php

if(isSet(submit)){

echo email;

}else{

? >

< FORM ACTION = “”METHOD = “POST” >

< INPUT TYPE = “text” NAME= “email” >

< INPUT TYPE =“submit”NAME=“submit”VALUE = “Send” >

< /FORM >

Php.ini的register_globals指令会使得所有GET、POST、COOKIE、ENVIRONMENT与SERVER变数都成为全域变数,使得预设可以使用名称就可以直接存取。

这在过去是有许多缺点的,第一,即使开发人员不希望发生,每个常常使用到的COOKIE变数将会意外的把POST相同变数名称取代;另外一方面,它会导致庞大无法区分的全域命名方式,而且更重要的是将变数交代由使用者输入是非常不安全的,PHP的使用世界已经有太多经验不足的程序员写下下列车员范例了:

< ?php

If (secretpssword = = ‘opensesame’){

allaccesspass = 1;

}

If(allaccesspass==1){

Include(‘/admin_index.html’);

}else{

Include(‘/doweknowyou.html’);

}

? >

不经由太多的思索,骇客们可以轻易的使用GET变数将allaccesspass设为1并呼叫网页就可经破解任何密码的检查了。

PHP小组,以他们无限的智慧,决定将原注册全域变数的方式淘汰,并且强制每个人必须用阵列的索引来使用变数(例如_POST[‘secretpassword’]),这已经在PHP 4开始运作了,这些阵列为http_get_vars、HTTP_POST_VARS等等,但是很少人会使用这种语法,因为事实上为增加一些安全性却需要许多额外的输入,所以PHP小组更将这些阵列重新命名为简短的方式:_GET、_POST、_COOKIE、_ENV与$_SERVER。

这些超全域阵列还有一些不错的特可以减轻一些麻烦:它们在任何地方都自动是全域的,例如这意谓在你在使用函式存取这些数值之前,你在也不需传递cookie内容到函内或是宣告_HTTP_COOKIE_VARS的全域阵列了,这可以帮助那些极力使用函式的人,而且也可以带给其它使用者方便。

在PHP 4.2版本之后,官方预设把register_globals关闭了,而旧风格的变数阵列已经淘汰,它将需要一阵子才能将整个PHP社群导正为新的超全域阵列方式,但我们乐意尽可能的尝试使用它们来竖立好的典范。

补充范例:热量燃烧计算机

本书从第九章到第十三章都会的个连贯的补允范例,让你将每一章串联学习。首先从一个简易的HTML表单及表单处理例程开始,这一连串的学习会让你经历字符串、阵列、数字与档案系统等函式的观念与应用。最后就会制作出一个简易的热量燃烧计算系统,让你计长出每天运动后所燃烧的卡路里,并将资料讯存在档案中。

在一开始,我们会很简单地使用PHP来将字符串POST变数从表单移到表单处理例程中,这个HTML表单的原始码档案名叫作workout_calc_var.html,如下所示:

< HTML >

< HEAD >

< STYLE TYPE = “text/css” >

< !–

BODY, P {color:black;font-family:verdana;font-size: 10 pt}

H1 {color:black;font-family:arial;font-size: 12 pt}

– >

< /STYLE >

< /HEAD >

< BODY >

< TABLE BORDER =0 CELLPADDING =10 WIDTH=100% >

< TR >

< TD BGCOLOR=“#F0F8FF”ALIGN=LEFT VALIGN=TOP WIDTH=83% >

< H1 >Workout calculator (passing a variable)< /H1 >

< P >Enter an exercise,and we′ll tell you how long you′d have to do it

< BR >to burn one pound of fat.< /P >

< FORM METHOD=“post”ACTION=“wc_handler_var.php” >

< INPUT TYPE=“text”SIZE=50 NAME=“exercise” >

< BR >< BR >

< INPUT TYPE=“submit”NAME=“submit”VALUE=“Burn,baby,burn!” >

< /FORM >

< /TD >

< /TR >

< /TABLE >

< /BODY >

< /HTML >



图9-3: 传送字串变数的简易表单


其对应的PHP表单处理例程档名则叫作wc_handler_var.php,原始码如下所示:

? > php

exercise=_POST[‘exercise’];

? >

< HTML >

< HEAD >

< STYLE TYPE=“text/css” >

< !–

BODY, P {color:black;font-family: verdana;font-size:10 pt}

H1 {color:black;font-family:arial;font-size:12 pt}

– >

< /STYLE >

< /HEAD >

< BODY >

< TABLE BORDER = 0 CELLPADDING=10 WIDTH=100% >

< TR >

< TD BGCOLOR = “#F0F8FF”ALIGN=CENTER VALIGN=TOP WIDTH=150 >

< /TD >

< TD BGCOLOR=“#FFFFFF”ALIGN=LEFT VALIGN=TOP WIDTH=83% >

< H1 >Workout calculator handler,part 1< /H1 >

< P >We′ve successfully passed the contents of thd text input field,< BR >

as a variable called “exercise”with a value of < B >< ? php echo exercise;

? >< /B >.< BR >

But before we can do anything interesting with it ,we need to learn

about strings.< /P >

< /TD >

< /TR >

< /TABLE >

< /BODY >

< /HTML >

图9-4为wc_handler_var.php成为执行后的书面。


图9-4:资料成功地从某一页面传送到另一个页面


在(第10章)中,我们会继续学习到取得传入的字符串及对它进行一些有兴趣的处理。


摘要

严格来说,HTTP协定是无状态纪录(stateless)。这是说HTML自己不能在Web网站的页面之间交换值。虽然可以使用URL传递的值。在第一代的Web开发中,使用的处理程序为Perl或C语言的CGI程序,但是如今Web开发者更喜欢PHP之类使用HTML内嵌程序语言,PHP也许是最容易,也最普通的表单处理程序。

用于传递资讯的主要有四种方法:GET、POST、cookie,或是session。使用GET主要是在建构复杂的URL字符串,用于动态网站的样版,它并不推荐用于表单中。POST才是推荐用于表单的方法。表单是由网页传递资讯到另一个网页的主要方式,我们在第27章介绍处理持续状态纪录的方法。


\n

出处:南方Linux

\n