返回列表 发帖

[Zend权威认证试题讲解]第三章 Web开发中的PHP

没有互联网,PHP开发者将生活的非常艰苦。事实上,很多人甚至怀疑,如果没有互联网的飞速发展导致的轻量级开发需求大增,PHP还能否存在。
0 R. U0 t1 V: f( C1 w  G与网站开发打交道时,熟悉HTML和HTTP相关的知识非常重要。此外,本章习题还考察用会话来维持多个访问请求的知识。+ H  S' @0 t0 C, S, y- x6 _
一旦你开始应用PHP这门语言,Web开发将是和你接触最紧密的开发。因此,你必须掌握相关的概念以确保你能够通过本章测试,这点非常重要。* L6 {6 Y, P" {0 c

5 p5 T" t5 ]) k# g
% n6 j# R6 V, q" {; d$ `# H问题6 @3 a" `) R. l2 \3 M$ a- f
" Z) w9 {, c; R
1.如何访问会话变量(session)?. P! [  \" c: U4 ^, G6 _6 G2 \
- S$ b! c5 P' i, P' a
A.通过$_GET  B  z! s" g. o7 h* A  z" w
B.通过$_POST3 Q% j! D  W: O, n
C.通过$_REQUEST
0 T; a! |" b: f  M. q3 j! @D.通过全局变量
2 p  h: A4 q2 d4 I0 [E.以上都不对- e4 A% R* ]0 T& K; n, Q+ }) Y
5 M* Q% P) y: O2 S* r! ~

0 {3 I# S# T- g' r% _% B: K# Z8 [2.哪个函数能让服务器输出如下header?
. v, }1 p% x1 o3 ]9 L, ?
/ V* \6 q' W' q5 Eset-Cookie: foo=bar;9 j3 @8 @& k9 b# d( N

1 a/ ]4 }/ H$ w, D* @  S答案:_______________
' p( ~, r$ b2 r4 F0 Q! q! P8 Z4 g7 u2 y3 q
, ?# M, T! o- |4 F- a
3.在忽略浏览器bug的正常情况下,如何用一个与先前设置的域名(domain)不同的新域名来访问某个cookie?
6 c4 l8 J* N! t8 F
7 @; Y% B& r/ S' e3 a% S$ \A.通过HTTP_REMOTE_COOKIE访问
$ A6 ?, u' Z& g* _6 @/ {B.不可能
) U+ g, C" p) ^% L7 [9 zC.在调用setcookie()时设置一个不同的域名
4 u1 w( k) r/ B- ?D.向浏览器发送额外的请求& F) A! v2 H' x7 d, \
E.使用Javascript,把cookie包含在URL中发送) ]5 V, u1 f# O# S, I" L

. _1 [( Y* f! u7 ^2 ~+ _8 M- ?7 L" n3 |& h; J6 B5 l3 T2 @
4.index.php脚本如何访问表单元素email的值?(双选)4 b/ C  o) E" F6 l9 p( X0 _* a  y
- @8 n" X4 V; e3 y0 E
<form action="index.php" method="post">6 Y4 U# L3 F' e% G
<input type="text" name="email"/>3 n- r5 D4 I# q% e8 T; M7 c
</form>
" B9 `& u. o) ^
$ l/ _) `  Q3 ?. E! JA.$_GET[‘email’]
: m; X+ t' S9 S6 R9 d* pB.$_POST[‘email’]( @  ?2 @4 L( F5 U
C.$_SESSION[‘text’]
) @4 Q* \$ S  p2 ^: ?% l' tD.$_REQUEST[‘email’]
0 K' B4 m$ {3 n: i# [) ]1 W" UE.$_POST[‘text’]) d% u1 z$ |( H  p

* o1 H4 d0 S4 Z3 {; P
- j9 @) a: x+ ]' |2 W% b5.以下脚本将如何影响$s字符串?(双选)

  1. <?php
  2. $s = '<p>Hello</p>';
  3. $ss = htmlentities ($s);
  4. echo $s;
  5. ?>
复制代码
A.尖括号<>会被转换成HTML标记,因此字符串将变长
3 L) ?- d2 j6 V2 b$ LB.没有变化# ?3 @! [8 T" N* f
C.在浏览器上打印该字符串时,尖括号是可见的  P2 U- n; P- C/ F3 V& ?, S- _
D.在浏览器上打印该字符串时,尖括号及其内容将被识别为HTML标签,因此不可见
+ _2 a5 L9 L  {# F* T( q6 g  @0 ?E.由于调用了htmlentities(),字符串会被销毁
% ~9 ~$ v% \8 z+ _% }+ V" r! A& {) z. U- l) I" ?
; v( G* b; P# W' \2 X; z' n
6.如果不给cookie设置过期时间会怎么样?! F0 i' s- l9 ]7 i

& t, T5 ?. L* |* R+ Y& m# |. a  NA.立刻过期7 l0 x2 R; _2 M+ E0 v4 ^+ c
B.永不过期& [! r! N4 v5 H' @1 O# D
C.cookie无法设置0 [7 ^3 |) j$ K
D.在浏览器会话结束时过期) C1 r, y' V' r7 T+ [2 }# D& }
E.只在脚本没有产生服务器端session的情况下过期, x; X; g! `% J' X! `) e

5 c: d0 x! l# ]& v, A6 f) y% p$ Y7 L( z: }% G! p, W  j: ^: C. H
7.思考如下代码:如果用户在两个文本域中分别输入“php”和“great”,脚本输出什么?

  1. <form action="index.php" method="post">
  2. <input type="text" name="element[]">
  3. <input type="text" name="element[]">
  4. </form>
  5. <?php
  6. echo $_GET['element'];
  7. ?>
复制代码
A.什么都没有
% _- q+ t- e4 o9 K, yB.Array2 m$ x) N5 p% \9 h4 K3 p
C.一个提示) f8 d( d6 `6 c; z9 i: h3 r& r
D.phpgreat
' [, m8 D/ c! T/ O/ ^% U* oE.greatphp
- _0 h% U. l8 N) M, i+ A0 Q4 E9 W8 n0 T0 B

$ B% e7 p( K4 k; F2 t8.在HTTPS下,URL和查询字串(query string)是如何从浏览器传到Web服务器上的?3 [/ w1 \# g! A. |# r: J: ~- |

( i) U( n, k+ i: N" _, `3 z* MA.这两个是明文传输,之后的信息加密传输7 k" p7 v) c) X3 [' X
B.加密传输% u5 y* s1 ^' q& N
C.URL明文传输,查询字串加密传输
; V" }, Z* W  f- u- [" ID.URL加密传输,查询字串明文传输: ~1 h' v* k( x- n0 _  l- s
E.为确保加密,查询字串将转换为header,夹在POST信息中传输: b1 }2 ?2 N2 e' G

) |: Z: B. Y0 e. ?2 |; O- z8 J1 M& T6 S& N* I! J
9.当把一个有两个同名元素的表单提交给PHP脚本时会发生什么?
1 D: F1 Y, G2 }/ ~% p) a/ c7 {* c9 M& a. S4 J4 t1 @
A.它们组成一个数组,存储在超级全局变量数组中
  `/ y* e7 @4 u; D! f3 E" SB.第二个元素的值加上第一个元素的值后,存储在超级全局变量数组中
2 U( F! K4 s. I9 w+ }C.第二个元素将覆盖第一个元素
2 z/ w  C: V9 lD.第二个元素将自动被重命名
- M2 U  D, L, iE.PHP输出一个警告
" \( N! z. P. R7 M% Y, R5 Q: ?; X& v* u* B9 G

' a! J8 {, @4 t) E7 V* A7 I' u10.如何把数组存储在cookie里?
, ?4 |. }! o7 T" B9 _; t; [( r7 a# V- w" o( K! j
A.给cookie名添加一对方括号[]
% M* J; C" }7 j( k* NB.使用implode函数- z) ]* \3 i+ Q* p
C.不可能,因为有容量限制
6 y! y8 C2 H- p3 u0 q6 H8 I: ^D.使用serialize函数
/ [2 t) `0 @$ E+ Y6 fE.给cookie名添加ARRAY关键词
% [: R, M8 f7 p5 B, K- X
% n$ c% B( x" ~9 O: ?) [$ _6 M  d' N! x3 b) ^4 J5 G, p
11.以下脚本输出什么?

  1. <?php
  2. ob_start();
  3. for ($i = 0; $i < 10; $i++) {
  4.         echo $i;
  5. }
  6. $output = ob_get_contents();
  7. ob_end_clean();
  8. echo $ouput;
  9. ?>
复制代码
A.12345678910( P$ F" V) @" |. u
B.1234567890
) h  N, B1 W2 w0 r: YC.01234567896 T, S8 ?# o- j, N# ]! n
D.什么都没有% g9 Q3 W  |6 j0 A. q) f
E.一个提示
9 {( y& R$ p( v% t) Y6 l
1 d' m; g; C7 Z  e' s6 s
5 v( ^3 {, |+ i12.默认情况下,PHP把会话(session)数据存储在______里。; O$ ~1 N) H# d
1 e$ M- Y) _: b( J& K; p
A.文件系统5 l% y/ j' e3 U0 O* Q7 }2 C
B.数据库/ t/ p  Y+ g' A! a0 U& z$ x. J  F5 ~
C.虚拟内容# Y! B, l, d" m
D.共享内存8 U. |3 {0 G1 V* \
E.以上都不是4 O2 ^1 t/ L( D6 n
% j1 u* M9 {+ L7 m; W

8 A9 e7 @3 l; f) `: D, W13.你在向某台特定的电脑中写入带有效期的cookie时总是会失败,而这在其他电脑上都正常。在检查了客户端操作系统传回的时间后,你发现这台电脑上的时间和web服务器上的时间基本相同。而且这台电脑在访问大部分其他网站时都没有问题。请问这会是什么原因导致的?(双选)$ f; b) A4 O4 O9 s+ m- Q6 M

9 {+ i  S# D* P2 B( TA.浏览器的程序出问题了
) J4 g3 L- F5 {/ q/ A3 TB.客户端的时区设置不正确6 n5 G( Y, a& Y4 K
C.用户的杀毒软件阻止了所有安全的cookie
* E4 j7 S$ F) V) Y  c; G! bD.浏览器被设置为阻止任何cookie
! [5 e) H1 A- W2 [* hE.cookie里使用了非法的字符' H) E  }$ D% D

' K: |% Y, g1 q% @) O
# \: H# g6 Q0 O: t, N/ e14.假设浏览器没有重启,那么在最后一次访问后的多久,会话(session)才会过期并被回收?+ t; h% K" v+ R( v/ _, G

  l5 R& |# S! h0 i8 Y, bA.1440秒后
( p! V: i  G3 T# O- q' E8 |  WB.在session.gc_maxlifetime设置的时间过了后- x# L- x" I* l: q$ `+ d2 ?7 c9 S, `
C.除非手动删除,否则永不过期% Q$ h% G+ C5 {" s0 P9 q
D.除非浏览器重启,否则永不过期+ \- @6 [8 y' O0 t4 |  O
E.以上都不对" v6 F$ [# _- b: e4 M/ J
7 f( E" p* E* k9 C
& i: H! k+ n  z: {
15.哪个函数能把换行转换成HTML标签<br />?* w7 r- u2 N# D: c3 R2 k

: b$ E- C5 J4 K' d. u& ^答案:____________
6 ?+ d4 J1 g% q, x# j0 [
' P. q$ T* E2 \& C" `; r6 i3 I2 W' F

6 n8 @3 Q, w$ K! x& b答案速查# Z, `' c# o! ?* u  I* Z
1:E
3 O6 N0 k9 C, E! W6 k2:setcookie/setrawcookie
& @8 c8 C: H, h+ e9 w3:B
( B. m1 q3 N4 M4:BD
9 e# a( [4 G, v+ A, i8 _5:BD" m8 H) v( B6 X. W( R4 T
6:D( x6 |6 f, a+ L% b" U! e
7:A
8 c2 Y6 m5 N- g) y4 X/ ^8:B
7 z) `6 J; H+ B. _% _# E6 N9:C7 Z1 J! d! M7 U% x' K
10:B
5 ^1 {9 C+ s. i7 X( Y8 O11:E
  p' B% K4 [/ J12:A
! L& `- N. L( w/ Z! w13:BD
& X6 l3 A4 a! g  H6 e! q14:B4 P6 J! C- }+ B
15:nl2br
" y# j" r4 b% |5 d( W) k' @# K! o% P0 o  s
4 @% I6 c1 M# F  l
) W0 o- a' L' r
答案详解
9 s+ G$ o8 E! J8 R' b! B3 x8 Y* r$ l" C4 i9 ~
1.尽管在register_globals被设置为on时,可以通过全局变量来访问session,但在较新版本的PHP中,为了避免造成安全隐患,php.ini文件已经把register_globals设置为off了。因此答案是E。
% \7 {( [" s) B! _0 g! y& [* q. P1 `  W0 [, z2 G- j- L
2.虽然header函数在这里也能用,但这题显然是在说setcookie或setrawcookie函数。
" r* N' N8 j! Q8 F8 s! v& g/ [' w, A% u+ }% m5 u
3.答案是B。浏览器不允许来自某个域名的HTTP事务更改另一个域名下的cookie,否则这将造成严重的的安全问题。$ O0 K. K3 m3 F" z
( F5 b8 H3 g' W+ _4 L
4.既然表单采用post方式传输,那么脚本将只可能从$_POST和$_REQUEST两个超级全局变量数组中取到值。元素名称(email)是键名,因此答案是B和D。注意,由于可能导致潜在的安全问题,这里不鼓励使用$_REQUEST。6 R4 L5 h9 u: }0 S. D* [& g- K

; e$ g" s% F% C$ Q+ i: D2 Y5.本题考验你对HTML编码的认识以及代码查错能力。变量$s在被函数htmlentities()处理过后,结果返回给了变量$ss,而$s自己并没有被改变。因此答案是B和D。你可能觉得自己被戏弄了,但是记住,发现这样的小错误是捉虫能力中很重要的一部分。. n( j7 ?' ]3 x* v* A  u

) B+ [/ J  C: Z, C: t' C2 L6.如果没有设置过期时间,cookie将在用户会话结束时自动过期。cookie不需要服务器端会话的支持,因此答案是D。
" A! ?) P& ^0 x1 u6 L: G5 u# F* D/ c
- W8 ]& I0 |; G) `7.表单使用post方式传输,所以无论在文本框中输入什么,其值都会传给$_POST超级全局变量,这里的$_GET数组没有值。答案是A。
$ N+ f8 F& t  ~9 T" c3 d4 h$ l7 m  q: A5 k' p5 H  Z3 c
8.HTTPS传输发生时,浏览器与服务端立刻完成加密机制的握手,之后的数据都是加密传输而不是明文传输——包括URL,查询字串。而在HTTP传输中,它们都是明文传输的,因此答案是B。6 `8 H* g! {; s2 O

# Y# d. H  v" c4 W3 x  q9.对于收到的查询字串和POST信息,PHP只是简单的把元素添加进对应的超级变量数组中。结果就是如果有两个元素同名,前一个会被后一个覆盖。答案是C。
) v6 ~3 q+ k! @8 G3 ~4 P4 Z4 s2 W! R3 w$ z0 F" \! R" I
10.只有B永远正确。虽然你可以用implode函数把数组转化成字符串,然后存在数组里,但却无法保证日后一定能用serialize()把这个字符串还原成数组。浏览器对单个cookie有容量限制,因此在cookie里存储数组不是个好主意。但事情也并非永远是这样,你仍然可以存储一些比较小的数组。
, }  y4 d7 z0 E& j' b& z
7 G; A4 Y+ ]( t5 k: v+ X11.这又是一个考验debug能力的题。注意到了吗,在脚本的末尾,echo语句中的$output变量拼错了!脚本不会输出任何东西,答案是E。$ e( x' R; m8 X) N2 |5 o

1 w4 O: l: Z* L12.答案是文件系统(A)。默认情况下,PHP把所有会话信息存储在/tmp文件夹中;在没有这个文件夹的操作系统中(比如Windows),必须在php.ini中给session.save_path设置一个合适的位置(如c:\Temp)。- `* ]0 G6 A( C/ c. a- W' @8 P) n$ \
( i- u4 w$ q' z) U# r& `
13.B和D是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的cookie(不过有可能会阻止所有的cookie)。你首先应当检查浏览器是否被设置为阻止所有cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源——给cookie设置有效期时用得是GMT时间。可能会出现cookie在写入时就立刻过期,从而无法被脚本接收的情况。
' c# Y- Y# L) z9 J
3 M3 m) X- p& d14.session.gc_maxlifetime设置的是用户最后一次请求到session被回收之间的时间间隔。尽管数据文件并没有被真正删除,不过一旦session被回收,你将无法对此session进行访问。巧合的是,session.gc_maxlifetime的默认设置正好是1440秒,但这个数字是可以被系统管理员调整的。所以答案应该是B。
1 W2 X6 O4 I3 C. J" G' W" m
6 H1 _; K# }5 m15.函数nl2br能实现这个功能。

返回列表
【捌玖网络】已经运行: