获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第九章 - PHP与数据库

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。
) Q% s6 C: ]/ X2 xPHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。$ c! t) R+ @9 e& ?7 l. L6 N
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。
- h/ f9 k6 |5 x" T% V9 u; V: M8 E" j9 Q( \6 g9 k% N
9 ?6 I$ ]8 [  T& Y5 L. S$ S8 k
问题. Y3 I: N6 ^* O
  i7 U% m4 X  f% ~- d1 b
1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)$ R% z3 ~% f; o% @! V9 f

* m; a- t2 C. i: ASELECT * FROM MY_TABLE- a/ n+ x$ \  C$ r9 W) d2 B$ Z% H5 x( y
+ ?; J* ^" s: S. s$ `! u
A.如果可能,用把查询转换成存储例程
* ~! p5 a+ t" n" q, DB.如果程序允许,给查询指定返回记录的范围
% K3 Z& e, [8 }! c& ?  eC.如果可能,添加where条件
+ o3 k0 n) z' X7 U- a) k7 i4 aD.如果DBMS允许,把查询转换成视图8 E& q# J: j6 |2 T
E.如果DBMS允许,使用事先准备好的语句
0 Y' M! `: J+ B- m  t9 K! d
  J5 i5 N/ X' }$ Q. X) X
' r, |, a" P( b) P- f/ E2 r% p) ^2.可以用添加______条件的方式对查询返回的数据集进行过滤?7 F+ J+ A9 B: D: j4 I/ T  h# h0 y0 t
7 b+ o* j* |6 ]+ S* e
答案:____________9 b  l! X2 z( R/ ]4 t7 y- U

9 E: B6 u! M' w2 e! M
; M5 d) T$ V1 C% o2 [3.内关联(inner join)是用来做什么的?- h* y7 |3 M) u# w+ [! P
* T' v+ i/ s+ y+ v
A.把两个表通过相同字段关联入一张持久的表中& T8 T( f; `3 z& w0 b
B.创建基于两个表中相同相同行的结果集
2 m8 h4 U: N: W& V9 ^+ e# EC.创建基于一个表中的记录的数据集
8 O! [! K; B2 l# j7 k) b% Z& x4 i: H" ?D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
, k- b6 ^9 \0 j$ ]! u/ TE.以上都不对% u4 S6 y# Q% }; i, q
/ {9 A# B4 ^1 |$ P; k( p8 ~5 @
9 q$ I! s9 g  E
4.以下哪个DBMS没有PHP扩展库?
/ ]5 a* ~: i2 n! [5 M' K3 x/ r, |0 s: g9 U
A.MySQL
6 @7 l: I' f) x) j& T7 j3 [" MB.IBM DB/22 y- I% f% K& S; V+ y
C.PostgreSQL
. k( U1 y; \0 U; i: a" ND.Microsoft SQL Server- z# k9 F; K' e1 i, L8 E) f# c
E.以上都不对8 O8 r8 y$ q9 \  w3 F6 v1 |1 ~
9 \* Y3 Z  n7 A5 L; r/ {: [

- u; k( V% z$ n  H% x/ D: S: b5 R& p5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)
) s% \% T0 D+ T  m$ P, l3 k
8 @3 p: p& g( X4 ?$ I4 G) g) Z<?php
  I0 F2 a6 P9 c* L- o/ h4 G. p- x* Y# j$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
" g& W% t) N# s1 }: x?>% f6 b: J  s7 g! V. F. b% n& d7 A/ V
* D5 }  Y6 C( M4 _) d
A.MYTABLE表中的记录超过1条
! P& Z& f1 P' [; ~B.用户输入的数据需要经过适当的转义和过滤
& ]1 h1 O( r! j7 BC.调用该函数将产生一个包含了其他记录条数的记录
; W+ r# H& _2 ~& a$ ^$ o& x) JD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除
2 U$ |! _' ^+ O4 U* u$ |$ cE.查询语句中应该包含数据库名# j  d9 e1 z, y' A% G3 X, P' J
  _: y' c: p" N. B1 c$ H/ j( h

: d2 `/ Q3 ?# P- b5 y6.______语句能用来向已存在的表中添加新的记录。: n8 Y5 f& b. l1 w/ o( s6 T8 ]
+ o) v9 G( V; R6 E
答案:____________
" E2 x9 g+ w+ u0 J: L, r  A' K
8 O4 A2 I1 I9 V" V+ P6 S" Y! H
8 T- _- `/ d& C# P1 K2 O3 q7.以下哪个说法正确?
+ k1 E; G: E: n6 x. A9 a0 j& n0 w- k# f. ?
A.使用索引能加快插入数据的速度* r1 v, t8 r" m# g
B.良好的索引策略有助于防止跨站攻击
( h3 O5 W' u: Z- ]1 c& xC.应当根据数据库的实际应用按理设计索引8 s  t" N! q* h
D.删除一条记录将导致整个表的索引被破坏/ G+ w7 T6 U, ~
E.只有数字记录行需要索引4 U! y' y+ S$ P

4 S& w" M2 U, m# L+ c4 }
* ~" p+ `9 E) f% U0 h$ M3 i, N8.join能否被嵌套?) n) @) I! ]* P0 s8 c& R- o+ B" @
1 F* c/ N) h4 l( V/ w0 H
A.能0 ]* t( {) N' f+ D3 n: q4 f( S
B.不能5 H( ]$ S  N7 Q- E: p0 [2 Z& l

* \9 u( }3 d4 N6 ~7 D+ o) M8 x$ \- u+ ?
9.考虑如下数据表和查询。如何添加索引能提高查询速度?. Z: }6 H! {* ~! w% v7 a, y5 C

$ O8 P% ]9 p6 S1 T; n/ ]. zCREATE TABLE MYTABLE (
: [. R, K! C: y$ D  Y6 \0 WID INT,
2 Y1 x9 H" V" F, z8 J: zNAME VARCHAR (100),) [) l, x3 b3 u) L
ADDRESS1 VARCHAR (100),) X/ [" L! _, _5 s( R, X' r" k8 ~, u
ADDRESS2 VARCHAR (100),
3 K' r1 b' L) F& {, JZIPCODE VARCHAR (10),
  }. h/ v  @4 a: M1 [CITY VARCHAR (50),
  p* E2 ^! B5 S  J% n6 \PROVINCE VARCHAR (2)5 K. f6 f# c3 ~+ Q7 s5 M8 p. ]
)* V4 t' C  T5 v
SELECT ID, VARCHAR
  p7 a( x% H/ C- s5 VFROM MYTABLE5 z3 ^* P( X- x6 o0 a: O  ]
WHERE ID BETWEEN 0 AND 1009 J8 |- W* ]# R
ORDER BY NAME, ZIPCODE3 u1 B; c1 L' q* R

" }7 O3 j& Q2 n5 p2 PA.给ID添加索引
( z/ R+ j# z& z7 [B.给NAME和ADDRESS1添加索引2 F- B2 A+ S& U% [" [
C.给ID添加索引,然后给NAME和ZIPCODE分别添加索引# F7 p& W: o$ x, v$ v. d( ]
D.给ZIPCODE和NAME添加索引2 B7 K& U& O7 ^4 P+ ?4 {0 I$ ]
E.给ZIPCODE添加全文检索$ I; g" C% W0 I
6 |" y* G% ]& M" y. m3 w7 j5 ~
. b# j0 r" v' e- ]) o2 k) c
10.执行以下SQL语句后将发生什么?# G, T: u8 w, c" x6 n

& {& t0 A, g5 m) TBEGIN TRANSACTION
; `+ Q( ^) h- b* nDELETE FROM MYTABLE WHERE ID=1# v# Z% M8 P! y/ V8 p. W: @' D
DELETE FROM OTHERTABLE0 S( ]  v6 }$ V0 W  Q2 T% ~
ROLLBACK TRANSACTION2 i4 Z* w* Y5 N
# K% B) @' d. C8 Y/ w! ?8 T* H
A.OTHERTABLE中的内容将被删除
$ q# c) f" `6 l' ^3 Q) t+ cB.OTHERTABLE和MYTABLE中的内容都会被删除, K% u5 b/ d9 L+ [" W8 B3 {
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除
. `2 M2 {8 h" X) G1 {( p  SD.数据库对于执行这个语句的用户以外的起来用户来说,没有变化
* H. @4 {0 O+ j4 l4 ?- n# VE.数据库没用变化
- D% f. J/ b0 l6 C4 o
+ t' `3 [% e: F( P. C7 a9 h2 t) N1 r! W3 R4 }4 D6 r
11.DESC在这个查询中起什么作用?
$ R9 x* Z: L( j# ]5 @
- i# W) w' k! B2 y/ ISELECT *
# P- l: V9 e! L2 h5 I  LFROM MY_TABLE) Q8 w7 r# I+ W% K$ K% J( ~
WHERE ID > 0
# @1 X6 p' G4 T0 x* Q  J1 b( G# ^! h/ lORDER BY ID, NAME DESC) m, v, A- _& T" G

9 G7 K) N  k4 c5 c4 V: VA.返回的数据集倒序排列+ h# T$ K' k8 u2 W2 s8 z( `3 Y
B.ID相同的记录按NAME升序排列
  _. I0 ^" r3 B& v6 _  jC.ID相同的记录按NAME倒序排列2 x! w5 v4 `: k
D.返回的记录先按NAME排序,再安ID排序) L9 B) F, s9 D% ]
E.结果集中包含对NAME字段的描述
% r5 O% ], g1 Q, N: u( G' v5 s  k  K3 a& v3 V. ?1 [# v

  U0 F5 I8 P6 x. f; E( ~7 ^12.以下哪个不是SQL函数?6 h6 ?1 P# ?7 `0 I$ O! [. [

. g2 l7 c" ?1 p! s% T8 IA.AVG( r, Q7 [6 H! {
B.SUM6 ?  d* v" M0 S" J' T( h
C.MIN
7 q& _0 P5 ?. @3 d! c4 tD.MAX! @  s7 x' Z' o
E.CURRENT_DATE()
* w. X. T3 A' \% H) F1 U: K/ E/ c5 a) v
0 U2 K5 [7 C  [0 W% u$ L. F  x) d# Q3 }" o2 u+ x- Z9 g# v
13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?& b; C1 g1 y6 [0 W( x

7 h1 |; r) D$ o# Z. M* ZA.该字段必须有索引# |: ^& ]+ t1 q% q8 Q7 m
B.该字段必须包括在GROUP BY条件中% l$ F5 p  ]% P* P
C.该字段必须包含一个累积值
0 k7 H1 Z+ g7 b+ Z% ]/ G' TD.该字段必须是主键3 U) L* _2 [- j! d5 G9 H; p
E.该字段必须不能包含NULL值
* a9 s* N# r( L* j, n. h
8 l+ e% D! ]$ F. [$ N$ U  o
3 U1 ]! z1 x1 {) O' A- z; z! n* S( R14.以下查询输出什么?
$ E% \! l7 x2 p$ y- B* `% _6 \) p3 w% p. {, H9 ^1 Q
SELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE2! y( D* v+ P" w" E) |' M7 F
ON TABLE1.ID <> TABLE2.ID4 p3 K) q9 i3 O6 ?2 V. O
5 t4 x, u) T+ S0 v) }
A.TABLE1和TABLE2不相同的记录! P) E9 E/ N. N- a) @8 s) ]+ k
B.两个表中相同的记录
: z& `( r! R% |9 U% @2 K# A6 R! ]C.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数
5 D& R, _# ^" c2 E. @9 ?( r6 VD.两表中不同记录的条数2 a( e: @' X$ |, R
E.数字21 T- h9 h  J/ G) L

) J$ s8 v& j7 p2 x* p. B2 d0 m
8 G$ k% t9 j3 x/ O15.______能保证一组SQL语句不受干扰的运行?
  \1 j! c# V& @6 s* k. f# \9 P' t5 c2 P# q' z
答案:____________2 c# N$ t9 u9 v8 a( L

( J2 Q( x2 g, ~9 h( i" M1 G
* i/ h4 ^  r" z; O
. _1 H; O) T  _6 _0 i$ o  U! k+ V9 y; l答案速查! \) a, s. p% [" P2 `
1:BC5 W% w2 l; t* _8 K4 s3 S# }
2:WHERE
8 @+ ~9 H* K) J0 y- g. }3:B; ~) t4 J1 x0 u$ M; k2 n7 O+ x
4:E
0 B6 B8 f6 ]# M3 y, Q5:BD
& e6 Q' b- ]$ u1 P$ u2 l6:INSERT
: F6 j7 k8 g. ?+ s* H# U7:C
9 b% e2 v! h1 ]- {9 _! x2 X8:A
+ ]* v- A/ D7 k+ c9:C
! N0 @8 ^% M# i9 X# S. J9 O10:E( X2 Z, N9 v& ?% A! n4 }
11:C
& |' G. ~& H! x6 [9 Z$ K12:E+ H8 M& J3 w! T' ?2 x1 c2 _0 O( Z
13:BC
) d3 G% `* {) ?/ _; s# n5 g14:C: V! r+ U( ^+ G5 N2 m* ]7 V
15:事务
2 @2 |" x. I7 S. R: c% x7 I: j9 q* ~( w! N, i2 n& K8 s

6 f* s' J+ z) x5 t& L' v9 |8 Y; T# |/ @3 K' L
答案详解
, G- l: K8 q' `. ?: A
% }' G3 P: A& _3 m$ n1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。7 |8 s6 k  H* i) v  R5 l1 u+ `' x
$ a# I' H7 _% \, J
2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。9 l4 o9 h' R" }$ Y& y3 Y* }2 D/ Z

: h+ q; c0 n" y  ]0 Q, Q1 e% p3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
5 I, o+ ^+ }6 O
9 D: v# y0 y, X/ o) N/ X4 _+ v4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。7 J: c. L  N' K, ^7 ~$ Y
$ `- v' ~7 x, L7 d3 O
5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。& s* V6 {5 ]) @  i! f# d- J$ i) c" I
6 V$ Z" S5 a  o( z$ c# c- b! W
6.答案显然是INSERT。# A: m8 W: g7 U& ?2 a1 B

  K) ~- S2 c; Z4 x7 S- j" v% Y7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。6 m" P1 h5 m4 @' N. c& M
: ?, Y! v4 i; \0 \, i
8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。: x+ x0 a! M" D. n1 P: w

3 h  k9 @$ E4 K# J9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
: I) H, s; `4 U- N6 v7 q; ^) X  Z7 z6 `4 j7 R2 c, c
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。
2 H  z; O( _1 ^" G8 J& A6 v& N5 z' t$ l8 V1 C2 ?; M: Z
11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。: {: c8 T- w. [- w- g

3 B) `9 O7 w6 `6 c4 R6 W! @12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
9 T* I3 f# n8 e: A% I5 T1 q: L- z) H4 n* X
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
# U* d2 o$ r4 N% N2 G) h- [2 o0 s4 J' Y& M7 }  v+ v0 `& [$ C; A* \* l4 z
14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
' \5 l& N2 H) [6 G4 j% N+ m3 P2 h5 L
15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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