  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
[Zend权威认证试题讲解]第三章 Web开发中的PHP
没有互联网,PHP开发者将生活的非常艰苦。事实上,很多人甚至怀疑,如果没有互联网的飞速发展导致的轻量级开发需求大增,PHP还能否存在。
% S& ?6 {. M: u' g' ]与网站开发打交道时,熟悉HTML和HTTP相关的知识非常重要。此外,本章习题还考察用会话来维持多个访问请求的知识。
( c! i6 s6 B# t一旦你开始应用PHP这门语言,Web开发将是和你接触最紧密的开发。因此,你必须掌握相关的概念以确保你能够通过本章测试,这点非常重要。
: T( r" S6 W; n5 E0 s) {$ K" C/ z l+ w& T' J* }0 |
. a* b$ S& p4 {3 t( i- g6 q. }
问题8 c" Y8 n" u4 r$ H1 X2 K
$ b# R; y% e' R
1.如何访问会话变量(session)?9 c! z1 k& h. P1 Q- L7 S
3 z3 _3 ]6 {% [+ ?
A.通过$_GET
8 t5 X W/ f5 X1 b( KB.通过$_POST" ~4 c s6 S, P
C.通过$_REQUEST2 W9 M' i; ~/ E- D8 C' ~" A# C
D.通过全局变量
% j5 m! a% ~+ w- xE.以上都不对' t( E {3 g* z- w; A
0 T- y& M; [/ a( h/ q* p" W
$ L: D+ U+ p7 X. I2.哪个函数能让服务器输出如下header?
+ P3 q+ n, i$ X( l- Z
$ X5 B% @$ w1 eset-Cookie: foo=bar;/ V, c, t7 _9 ^$ D: P
# R5 i5 Z( G+ @ u" G答案:_______________$ N& `! E! T: C f/ D, k
7 m7 J: d5 Q# V" H' m7 V
# Y$ ~, @8 F7 W x- A; m3.在忽略浏览器bug的正常情况下,如何用一个与先前设置的域名(domain)不同的新域名来访问某个cookie?! Z2 G% c! @2 s
2 @( p* P6 [6 w6 D% g: }A.通过HTTP_REMOTE_COOKIE访问
0 @+ q& ^' W! `1 W" s6 N6 kB.不可能
e) j) D, k( FC.在调用setcookie()时设置一个不同的域名
9 t: F+ ^, W' T( x, [D.向浏览器发送额外的请求2 \) O5 h3 p" L/ j
E.使用Javascript,把cookie包含在URL中发送$ @( d7 ^& ?7 s% H9 N
- {7 P/ p& a4 w$ D$ s! q; E0 W5 H! H" W. h5 {/ M
4.index.php脚本如何访问表单元素email的值?(双选) @" {5 S! Y( P
* g3 p6 M+ l2 ~4 K4 K3 b! U
<form action="index.php" method="post">2 R% C" I) ^- ^* _
<input type="text" name="email"/>
: g7 O K! c' n) |: o: i</form>
. W; s% [3 {! e! Q" W$ z; e" c2 x5 w, L( X
A.$_GET[‘email’]
j c6 D6 \# m, p" DB.$_POST[‘email’]8 _/ t. E2 V9 h
C.$_SESSION[‘text’]4 C/ W: _( @8 M9 r. ^
D.$_REQUEST[‘email’]
! q2 l, b# X* D" t$ H vE.$_POST[‘text’]* T$ G+ ^$ w3 {. J1 V
. _2 i' A8 F9 w9 }
6 u+ I+ O" ~7 u8 y) a: y
5.以下脚本将如何影响$s字符串?(双选)-
- <?php
- $s = '<p>Hello</p>';
- $ss = htmlentities ($s);
- echo $s;
- ?>
复制代码 A.尖括号<>会被转换成HTML标记,因此字符串将变长
8 ?7 W; S1 X- ~B.没有变化
2 ^$ s- j% g! ^+ G9 w! s+ N3 _C.在浏览器上打印该字符串时,尖括号是可见的! U5 L& g4 z5 h+ ~
D.在浏览器上打印该字符串时,尖括号及其内容将被识别为HTML标签,因此不可见% @$ e# q+ W& t3 |' W5 b
E.由于调用了htmlentities(),字符串会被销毁+ O) j8 y; p, Q- X8 O- {/ F/ _
1 w4 i# m* i( h# r. L
2 f2 ]) [! h" u7 p6 G/ S4 _; _ K! H2 ]6.如果不给cookie设置过期时间会怎么样?+ }% f8 r4 o& W6 u2 d6 Q' `- B
{+ r' o' p) e! b$ X- X' o& k7 iA.立刻过期. M. Q3 }( a. H* A4 M: c( W) e. f
B.永不过期
# H9 O2 X. l; H4 v; ~# a2 bC.cookie无法设置
Y2 T, b1 K' Q* n* w4 zD.在浏览器会话结束时过期
1 ]+ U* W% e& j2 |- l% yE.只在脚本没有产生服务器端session的情况下过期
w, x7 S& Q! Q, r% B) z+ j+ x5 b9 F3 D; m w$ G4 O/ F8 B0 y
! G6 J* K# K2 _( g7.思考如下代码:如果用户在两个文本域中分别输入“php”和“great”,脚本输出什么?-
- <form action="index.php" method="post">
- <input type="text" name="element[]">
- <input type="text" name="element[]">
- </form>
- <?php
- echo $_GET['element'];
- ?>
复制代码 A.什么都没有
$ k7 y) @8 }( M' CB.Array& ?; A. W+ t8 x, t% [
C.一个提示' ^0 h1 f) ^& j* C
D.phpgreat
! T; Q8 h1 t; J* Q" g- C/ IE.greatphp
* R5 G0 ?9 _0 _/ l; V9 j
2 [: s/ T: z7 s$ O4 y
0 {, b l6 E' `' l% t8.在HTTPS下,URL和查询字串(query string)是如何从浏览器传到Web服务器上的?
# {/ @% ~, v2 m3 g2 Y$ b; _
9 B$ y& ]- c/ q: W3 j" WA.这两个是明文传输,之后的信息加密传输" r) _ b1 y3 U, U7 O! L, A
B.加密传输
5 o; e0 S" H8 D* o+ dC.URL明文传输,查询字串加密传输2 F$ b- @4 u0 V! N
D.URL加密传输,查询字串明文传输' i7 N. f R% w: D
E.为确保加密,查询字串将转换为header,夹在POST信息中传输" l8 g2 o# M: z1 @
% p! L& O' Y: g* u; T0 P: m% i" Y7 X5 G: x9 C
9.当把一个有两个同名元素的表单提交给PHP脚本时会发生什么?% ~8 C2 a) M5 S) d( @+ G$ c
+ M# g- z5 M4 m* U! z5 A2 x: RA.它们组成一个数组,存储在超级全局变量数组中
}5 V, F% w! ~0 V. `. Z9 cB.第二个元素的值加上第一个元素的值后,存储在超级全局变量数组中
6 q. J U: _. `+ w7 k$ C bC.第二个元素将覆盖第一个元素( R8 p1 Y8 d; E& c% i# X
D.第二个元素将自动被重命名. |3 m/ o1 f) O; K6 i- l
E.PHP输出一个警告; B$ h+ Q* j/ P9 W
& [, C* x: F- }6 {$ I. Q6 ^: C/ v; E- k: n3 d
10.如何把数组存储在cookie里?* v/ \! p$ P5 I4 Y
' E9 R4 g2 K4 Q0 |4 i$ i! G% I7 w
A.给cookie名添加一对方括号[]
) y$ e O7 \& u, E2 vB.使用implode函数+ d5 @) P% v( W6 e+ @0 @7 k& t
C.不可能,因为有容量限制
' d: m& B+ Z$ f; ^& b$ w3 oD.使用serialize函数5 p# i+ n3 [8 }& p* x- l$ ~
E.给cookie名添加ARRAY关键词
& m' h0 e1 t+ z( O/ v* r! g4 V" t" S4 g2 P# u# h9 `
4 l' q! d1 S; V1 B; }, j
11.以下脚本输出什么?-
- <?php
- ob_start();
- for ($i = 0; $i < 10; $i++) {
- echo $i;
- }
- $output = ob_get_contents();
- ob_end_clean();
- echo $ouput;
- ?>
复制代码 A.123456789105 F1 ^6 X, q2 L8 N/ A/ V$ M, v" X: p8 B
B.1234567890
5 U- ^* @' C0 B& w0 [C.0123456789
- s1 } G& x$ fD.什么都没有
9 x7 U! G( \+ M. dE.一个提示8 ~: P" B5 \2 F: H# V
6 c- {7 R8 R. D% n
- _5 x: L# i; @12.默认情况下,PHP把会话(session)数据存储在______里。. ]- M X) l8 W1 s. D- P7 `9 C
' W2 I) k; X" h6 a" E, a- g$ uA.文件系统
& R* }) G# Y. z0 `2 HB.数据库5 D; O7 _5 u) N2 x
C.虚拟内容) y! A* }: j X1 f# S; a
D.共享内存
8 i0 }& R8 M" g: Y- S, r3 O. tE.以上都不是
2 p9 V4 `/ }" E. ^" I e K
2 y* \8 I" \! j$ P( c
4 O7 X; {" _6 [& R4 n13.你在向某台特定的电脑中写入带有效期的cookie时总是会失败,而这在其他电脑上都正常。在检查了客户端操作系统传回的时间后,你发现这台电脑上的时间和web服务器上的时间基本相同。而且这台电脑在访问大部分其他网站时都没有问题。请问这会是什么原因导致的?(双选)
- V, N) [6 Q2 W' e8 x) i- T* O3 g9 M
A.浏览器的程序出问题了2 l: [, H* H& k% l* z) e' s
B.客户端的时区设置不正确
. n7 U" W3 O5 OC.用户的杀毒软件阻止了所有安全的cookie5 c2 F% {5 A1 [1 |% t; ^8 f
D.浏览器被设置为阻止任何cookie
8 C1 y8 h E2 Y: x# b3 ^E.cookie里使用了非法的字符
$ L9 B& k) x% ^6 D# W0 u7 l
S- k. W/ M8 H7 L0 ?7 R v4 d! |0 G* Y Z5 ` N
14.假设浏览器没有重启,那么在最后一次访问后的多久,会话(session)才会过期并被回收?. X& {% t8 b& U, f, P& a% |0 k
0 R& I- _: {7 ~% TA.1440秒后
/ S$ W' y8 |6 a7 V/ N! k2 \B.在session.gc_maxlifetime设置的时间过了后. g2 t* e8 o2 n' ^
C.除非手动删除,否则永不过期) P" ^8 z' C1 A# q
D.除非浏览器重启,否则永不过期$ N! m0 z, r% f6 J9 m. b5 d- D
E.以上都不对# ?/ O5 L/ D$ A7 _5 I1 u0 q4 s2 o
& M/ O0 N2 w2 Z' c6 A* o4 r
2 [/ a; c Y4 K15.哪个函数能把换行转换成HTML标签<br />?2 z ~+ d3 v1 l1 B& A1 B4 q1 ^
2 o8 Q+ A+ r& B# h$ i ^答案:____________6 ~' K5 z1 L$ ^& d% V0 L
G1 D6 e/ o1 m( d
8 S- A( l ^- C$ o7 X: W5 q4 X0 o0 M' ~6 D9 r- P( q
答案速查
! q* ^# g9 n7 p3 ~1:E2 v8 r7 }0 }+ k3 K. N# o' J
2:setcookie/setrawcookie
3 Q- w& m% E2 j% J0 |% [$ J. N) ?3:B( L O( L* `+ h
4:BD
5 i" g+ j. X' I' |9 E$ E5:BD
6 F/ I: I# X% [5 L6 [3 V6:D! g' m# G5 U; p) Q8 M
7:A6 ]0 Y6 S) s" ~1 n1 B
8:B1 z; v% A7 S( e# B& w/ ]0 N8 P
9:C: A; p9 Y5 H2 r# N6 V
10:B
( W8 E9 K+ |% x. ]3 g8 c11:E
9 A8 U. c) n# g3 n3 \$ t% P12:A
6 f# Q( B$ X6 j5 P" f13:BD t/ ^- T! u3 f* _
14:B! R- K2 T, j) }% ], m) W
15:nl2br
! @# ?/ G9 b: ^' I5 F/ D; M" K$ \/ F
0 h8 u$ T$ ?( G
3 c) _5 H: S! A
答案详解
0 O$ Z0 A* Y' w% |) ^/ p/ `; _2 T! p# t
1.尽管在register_globals被设置为on时,可以通过全局变量来访问session,但在较新版本的PHP中,为了避免造成安全隐患,php.ini文件已经把register_globals设置为off了。因此答案是E。4 `6 X! r3 B9 M5 k5 \
* `0 N3 J( y" I- L4 ?
2.虽然header函数在这里也能用,但这题显然是在说setcookie或setrawcookie函数。, _& D9 E& y6 L& P; y e! l
5 P1 Y) i+ d7 U$ L7 Q% ^
3.答案是B。浏览器不允许来自某个域名的HTTP事务更改另一个域名下的cookie,否则这将造成严重的的安全问题。8 F% t. M3 d+ s8 }8 i6 K
: ` [3 p% d# l) m8 S1 e) ?4.既然表单采用post方式传输,那么脚本将只可能从$_POST和$_REQUEST两个超级全局变量数组中取到值。元素名称(email)是键名,因此答案是B和D。注意,由于可能导致潜在的安全问题,这里不鼓励使用$_REQUEST。
# a. _1 v: Y" @" [
- A3 `4 P8 `4 ?7 u- \ Z/ V1 D8 X$ O/ B5.本题考验你对HTML编码的认识以及代码查错能力。变量$s在被函数htmlentities()处理过后,结果返回给了变量$ss,而$s自己并没有被改变。因此答案是B和D。你可能觉得自己被戏弄了,但是记住,发现这样的小错误是捉虫能力中很重要的一部分。
' s. |, k. D/ K3 i" T! ]9 ?5 {5 h0 A' ?4 V6 e4 S1 N5 r$ s% ?
6.如果没有设置过期时间,cookie将在用户会话结束时自动过期。cookie不需要服务器端会话的支持,因此答案是D。
1 K9 R' M& c7 b6 k) X& W$ w: F- i* b2 q# F2 J5 ]9 `
7.表单使用post方式传输,所以无论在文本框中输入什么,其值都会传给$_POST超级全局变量,这里的$_GET数组没有值。答案是A。: H( j* R+ `/ C2 D ~6 V" Q# H
6 o" g# T' h: t! i# @% h8.HTTPS传输发生时,浏览器与服务端立刻完成加密机制的握手,之后的数据都是加密传输而不是明文传输——包括URL,查询字串。而在HTTP传输中,它们都是明文传输的,因此答案是B。
, ?7 H" v7 q- P9 P" v
9 ~! z( n3 ~2 I8 X5 M9.对于收到的查询字串和POST信息,PHP只是简单的把元素添加进对应的超级变量数组中。结果就是如果有两个元素同名,前一个会被后一个覆盖。答案是C。% x3 T; q7 N4 B4 L# H: R
) q( T& m, Y5 E* ~8 P$ j& B# ]* z10.只有B永远正确。虽然你可以用implode函数把数组转化成字符串,然后存在数组里,但却无法保证日后一定能用serialize()把这个字符串还原成数组。浏览器对单个cookie有容量限制,因此在cookie里存储数组不是个好主意。但事情也并非永远是这样,你仍然可以存储一些比较小的数组。
/ l: B8 e* r6 C0 X# l
+ m& r1 G. U! E, x2 I11.这又是一个考验debug能力的题。注意到了吗,在脚本的末尾,echo语句中的$output变量拼错了!脚本不会输出任何东西,答案是E。: x4 j* Y9 G/ l6 Z9 a8 Y9 O# P2 R
+ ]% m- f" t8 J- i' o
12.答案是文件系统(A)。默认情况下,PHP把所有会话信息存储在/tmp文件夹中;在没有这个文件夹的操作系统中(比如Windows),必须在php.ini中给session.save_path设置一个合适的位置(如c:\Temp)。% P! C5 R9 O0 q9 G3 Q* j3 y( Z& Y
7 ^, ?; q& ` m/ p, T- z2 C
13.B和D是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的cookie(不过有可能会阻止所有的cookie)。你首先应当检查浏览器是否被设置为阻止所有cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源——给cookie设置有效期时用得是GMT时间。可能会出现cookie在写入时就立刻过期,从而无法被脚本接收的情况。
" B7 T" ]% v6 m" E& @" C3 D& w2 {( }' i( B) X9 r7 U9 k1 ^ S
14.session.gc_maxlifetime设置的是用户最后一次请求到session被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦session被回收,你将无法对此session进行访问。巧合的是,session.gc_maxlifetime的默认设置正好是1440秒,但这个数字是可以被系统管理员调整的。所以答案应该是B。0 w. a" t4 b+ g |2 K
: \* @. `; `0 @! x7 c u. \15.函数nl2br能实现这个功能。 |
|