本章重点
为什么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 = TeamSIZE=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
最后你应会看见网页上