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

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

如果你需要开发动态内容的网站,那么就肯定要用到数据库。尽管现代网站离不开数据库,但很多开发者对它的工作原理仍然知之甚少。3 N* Z! C5 p( Z+ D
PHP支持许多种类的数据库,可PHP认证只和PHP能力有关,所以本章的题目不会专门针对某个特定的数据库管理系统。另外,大多数商业DBMS,比如MySQL AB,都有它们自己的认证课程。4 i$ k/ e" \1 z7 A; @% m
本章考察你对数据库原理及数据库编程的相关知识——与特定的DBMS无关。- |/ t1 `7 L9 e) F2 _
" N, J: D9 S5 X6 t5 Y

8 \  W, I" o2 y7 A3 i/ D; C- l问题
2 ^7 H$ v! C( a1 S  ^) k
9 }0 e7 R, G& d, b8 l0 g* R1.考虑如下SQL语句。哪个选项能对返回记录的条数进行限制?(双选)+ h% P1 m6 n% s! ^! H8 a$ p# K
$ L: l- E8 m$ Y0 f3 ^  m
SELECT * FROM MY_TABLE
" F  _, ^, Z4 E; E/ X# b" |
7 H# @) c- U/ I6 d2 EA.如果可能,用把查询转换成存储例程) h2 _  V- R$ z5 R* E0 U+ k+ D
B.如果程序允许,给查询指定返回记录的范围; O: V, k1 Y, ]% j  M& \
C.如果可能,添加where条件
3 {) b1 y/ P8 d! x5 N& _6 H% ^D.如果DBMS允许,把查询转换成视图
- [  v7 u, i5 c" YE.如果DBMS允许,使用事先准备好的语句! T& }+ S. q, }
- A- M" O8 Y# V) c7 ~4 d
6 |  q7 N. G' Q$ U
2.可以用添加______条件的方式对查询返回的数据集进行过滤?! X7 ^# a) \+ k# u& B2 a
+ ~- |* F" r; Y0 L2 V
答案:____________2 u, Z: c7 c/ v8 f& J5 d" e
) @3 u5 D1 j) Z, d+ ~$ X1 O
5 y3 K0 x" s/ D9 k
3.内关联(inner join)是用来做什么的?' p  n; [( T; c' l8 v0 C- d
& d! {" Y/ q2 V, Q) p
A.把两个表通过相同字段关联入一张持久的表中8 N1 ]3 j7 j/ ?6 g) h+ r
B.创建基于两个表中相同相同行的结果集+ D! t5 v4 U0 e1 v: P
C.创建基于一个表中的记录的数据集1 n2 z) U. A( v* L
D.创建一个包含两个表中相同记录和一个表中全部记录的结果集
3 ~4 Y5 N! |% c+ L# F9 t2 [8 ]E.以上都不对
. ^6 s! v( g' R" E0 T5 F* x5 G  l
; z, G. y2 ?5 j, u7 o
4.以下哪个DBMS没有PHP扩展库?# F# z& L3 ^- W  ?
; F: }) Q6 Q# t; L
A.MySQL
3 G" G( J& a" `. zB.IBM DB/2
3 j5 o: V- ?  u8 }2 y. n; u0 ~C.PostgreSQL) ]+ k1 R  n' R; h! C( C5 `
D.Microsoft SQL Server
6 n( L; f6 s) VE.以上都不对
. p' o9 T" V' ]# Y9 c+ J1 _
: s% \% g! Q" X4 Q" R' u( J6 Y. b7 C7 R% f
5.考虑如下脚本。假设mysql_query函数将一个未过滤的查询语句送入一个已经打开的数据库连接,以下哪个选项是对的?(双选)& m' l/ h$ y: p
# Y8 Y4 c4 ]6 l
<?php: [  {3 C) {: ^' J# i
$r = mysql_query ('DELETE FROM MYTABLE WHERE ID=' . $_GET['ID']);
9 b2 x6 e4 S4 {7 E; ~, p! u/ |?>
4 o6 ?) X4 P6 x; y- ?+ x$ h: a( i  ~; {5 ?7 [, |1 _+ \
A.MYTABLE表中的记录超过1条! L0 q# a7 j1 Q/ \' R  G, F
B.用户输入的数据需要经过适当的转义和过滤
5 z; i8 O/ r( q3 H& g  YC.调用该函数将产生一个包含了其他记录条数的记录
8 w: r9 c+ _! O6 O4 ?" kD.给URL传递ID=0+OR+1将导致MYTABLE中的所有表被删除+ d, y* \3 m' q6 _' f
E.查询语句中应该包含数据库名
  B; r& a8 S. y: I+ t4 V: v; W4 r( n% ?: A  N) p6 R. E

" H- k* p# o& b* {( R& l# V6.______语句能用来向已存在的表中添加新的记录。
" T# i$ {( X! p7 s1 N' o$ w' @) g: z
答案:____________
1 [, S. z5 |, V# Z, O) G% W) I" P
, m. ~# C2 a% ]6 e, d- q# G$ R/ k
/ Q! A. [( i6 d0 S/ x5 K7.以下哪个说法正确?, H7 C# M  J9 w! }. g, E+ z6 Z; W

0 L0 V5 o; m# i6 D, T, X+ VA.使用索引能加快插入数据的速度4 O3 S) F, s7 ~) |
B.良好的索引策略有助于防止跨站攻击
" i. m9 G" \# d3 ]C.应当根据数据库的实际应用按理设计索引4 L5 n: h4 k$ A. y: ?% W7 b
D.删除一条记录将导致整个表的索引被破坏
& R" Z5 z; H: A6 E3 @$ Y" P* }E.只有数字记录行需要索引
6 X; N: ]0 l& X+ h8 F+ z
- C0 g5 j8 ^' b- ~6 f9 j( H5 c
$ n( w+ \: C! C' E* Y$ a2 X8 N8.join能否被嵌套?
9 l; Y& \: l% W" D, a4 L% M
# i+ N; n9 W" W+ RA.能
+ `( r4 o3 b( ~; ]B.不能
: {  u% U9 k  x) }; e1 |! d9 w  y# h/ s" W9 {. G# |  y1 \

  z8 y+ ^' g! ~- z9.考虑如下数据表和查询。如何添加索引能提高查询速度?; n8 k" |: ?: f* k2 p3 h

  r( g+ D( I/ r8 G! x+ q& OCREATE TABLE MYTABLE (
  k9 {4 [8 b- h* b, z2 bID INT,1 `2 S  V% u- L
NAME VARCHAR (100),
( k% F4 K4 A3 N4 t/ ?ADDRESS1 VARCHAR (100),
4 f- s' u0 |; iADDRESS2 VARCHAR (100),: b% y( b/ g0 R1 |5 g( W
ZIPCODE VARCHAR (10),
3 x% H/ M1 J' WCITY VARCHAR (50),
' H0 F( }  v3 w( H! p$ ePROVINCE VARCHAR (2)7 Z  s  x( R' {9 h) }
)
# o7 }% ?# ~) D! x( Y) B, MSELECT ID, VARCHAR
3 _1 E' I8 a/ vFROM MYTABLE/ w& r% t1 E9 q
WHERE ID BETWEEN 0 AND 100
, Q( U& L4 H8 j# c; sORDER BY NAME, ZIPCODE* E7 c4 `# J+ W, v* Z+ D

7 M' b! f4 Q: l/ ^7 vA.给ID添加索引
  S* c  d. S# p3 ]5 VB.给NAME和ADDRESS1添加索引
$ ^, M8 I" R9 ]1 LC.给ID添加索引,然后给NAME和ZIPCODE分别添加索引0 C) R- B8 p& V5 N& ]
D.给ZIPCODE和NAME添加索引  l8 j, Q% u" t0 k7 j! S( T
E.给ZIPCODE添加全文检索: p( i, [' R/ w6 k, {( A$ ^1 Z

" a! I2 `, }% A! ]- p' ^
& m: D4 s! x0 L10.执行以下SQL语句后将发生什么?7 r4 Z6 x$ a1 ^7 ~# o1 t  J( l

7 s5 `) _9 m0 l: ^2 z0 ~0 B$ ZBEGIN TRANSACTION0 ]4 l  d% t) U& Y) i7 U
DELETE FROM MYTABLE WHERE ID=1, \- a2 w3 c6 @: m9 d! ^! D8 S
DELETE FROM OTHERTABLE4 @7 w+ f4 |, J9 H7 m
ROLLBACK TRANSACTION9 g( Y0 u7 [( \/ _; F5 E0 E# t
7 ?/ S: @' o( J: ~: y' J
A.OTHERTABLE中的内容将被删除' y. y' v+ b+ _, v" f8 G0 g
B.OTHERTABLE和MYTABLE中的内容都会被删除4 ~0 [& v; H0 o8 g) i/ z
C.OTHERTABLE中的内容将被删除,MYTABLE中ID是1的内容将被删除1 a! o3 W9 `5 {4 y1 X( e6 a
D.数据库对于执行这个语句的用户以外的起来用户来说,没有变化: f, i$ l# ~6 o8 g1 D
E.数据库没用变化1 M* C1 ~: L  a, c1 v- m
2 o6 D7 D. ~' C" M9 o; T3 P4 I: {
- p9 \3 H$ ~6 {) O: D9 A" V
11.DESC在这个查询中起什么作用?
4 C/ h$ V% |) I" ^
: _  P) s. G+ l0 B# X6 q4 zSELECT *
+ H/ c7 W8 `  k% S( z4 h- uFROM MY_TABLE% _1 Y7 N$ Q7 A# W+ n* Q4 [! V
WHERE ID > 0
% U7 h! q3 @+ |ORDER BY ID, NAME DESC
6 \  i/ U+ S' _& z
/ z* J1 K4 J5 z2 B( \) F9 Y  [A.返回的数据集倒序排列
2 y- E/ E! m7 E0 C2 w+ @B.ID相同的记录按NAME升序排列  |$ b: Q9 |& ]& |* ]: }; S
C.ID相同的记录按NAME倒序排列  R3 U8 M5 X' l% O$ k7 Y
D.返回的记录先按NAME排序,再安ID排序  L9 k8 h# D) I
E.结果集中包含对NAME字段的描述4 O3 g5 e' t8 U( Z$ X3 W, X1 |
5 {% d5 X! N1 K5 H% K2 Z/ a
. k7 q6 e. e. s1 D* Z
12.以下哪个不是SQL函数?
, I+ ?- m& {$ v& A: T- m  ^8 Z8 [' C$ a) W
A.AVG
5 D$ j/ \! p! z0 T7 j1 F* HB.SUM% Y* X5 w. M7 h5 _3 I/ Y
C.MIN4 ]1 i6 V9 ^% `, }
D.MAX, ]7 m6 j0 W- ~
E.CURRENT_DATE()0 O: q1 f6 y! u

9 V' R5 ~( |, T! P* @5 p8 i
. _  a1 s. O! y  B9 g13.如果一个字段能被一个包含GROUP BY的条件的查询语句读出,以下哪个选项的描述正确?+ c8 ~" {9 k. D3 _

5 d/ B7 _0 H4 C/ \" [A.该字段必须有索引
8 d" f3 I9 ]7 B8 I3 R5 X$ Z, IB.该字段必须包括在GROUP BY条件中
- {& Z. t1 C6 p% F2 H* J1 iC.该字段必须包含一个累积值
; n+ p3 d8 M' V* |6 ~0 ?! DD.该字段必须是主键& v, n5 c9 p6 }  ]
E.该字段必须不能包含NULL值& u0 s& k, T: @7 c$ ^% j

+ L9 E2 X. e# \
6 h% T' x0 a: }14.以下查询输出什么?
1 @5 i/ m/ @1 @% |
9 Z8 Q5 ~* i" N4 NSELECT COUNT(*) FROM TABLE1 INNER JOIN TABLE27 ^! P+ {! F. l7 }, [, J* X3 T" g/ z
ON TABLE1.ID <> TABLE2.ID
7 ?9 l6 ~, M/ Y5 r5 Y* G
  x; z8 z  y) B- `A.TABLE1和TABLE2不相同的记录8 a' h0 D. i5 I& h
B.两个表中相同的记录
$ `& Y) s1 R$ \- s+ a) aC.TABLE1中的记录条数乘以TABLE2中的记录条数再减去两表中相同的记录条数/ N; j: K0 F; b" v+ e
D.两表中不同记录的条数
, Q' |; o0 b' z9 W. xE.数字2
8 u5 k& j4 T1 N' S, F; S8 @- L, K) G! O

  B% U3 ~$ d3 b8 L2 a. I15.______能保证一组SQL语句不受干扰的运行?. v$ B) N, `9 x4 p. B

* s( }3 F8 W! A1 q) Z! T答案:____________! K: y& _. K6 c
" J: R' Z: i* v3 a  f

& x; v/ B( f$ R. X1 ^4 y, \. a1 h8 l$ |' Q7 ]  ]* z* I( ^9 l
答案速查) `5 n$ ?6 e/ X3 J
1:BC
) c5 I! ^0 ]8 J) `# G2:WHERE! j% @4 u. t7 a$ d7 u
3:B
1 }' a5 D) j2 C& E, O2 D4:E
2 t& o0 z8 Q% L, e. I5:BD
5 j; V  g8 y6 E! ], s# `6:INSERT) D, Q  H* K5 g8 h* y
7:C
; s9 j* y, h2 ~# |5 ~8 p7 X8:A
; o5 z0 Y# [4 o) S* V1 N+ n) W: _9:C! ]( D/ E" O' B; r: w
10:E5 g& R2 C! @) Y" Y$ n7 x( w% m- v
11:C
- F: H; J% F) i  ^: [1 N. l1 {% V12:E) ^1 A! T- }, `) P8 e! J
13:BC% g( Z, J2 T! D; x% N: L8 E
14:C& e( w, k, `8 r. X  O
15:事务7 u$ B9 h1 W% s, d
5 N/ A* }, r6 H3 \& j$ a
4 B; g% \( k: M  s! W
8 @' h9 I/ j* k; j* D9 o5 `: h- Q# F
答案详解
  J' a, ?3 r  c' ]$ J* ^
4 ]2 d$ N+ O& V& p5 C1.有两个方法能限制返回记录的条数——使用where条件和指定查询返回的记录的范围。通常情况下,如果没有特殊需要,尽量不要用select *,这会浪费大量的数据缓存。答案是B和C。; T# w' E8 M0 E2 G; Q- \

$ n4 ^* M& c! w# P3 v: l5 W/ O2.有很多种方式能过滤查询返回的数据,但这题描述的显然是where条件。
- K- O( F$ h; ^1 s
& a2 U7 K" O, F3 f% Y. m: c' B3.答案是B。内关联(inner join)把两个表通过一个特定字段关联起来,并创建该字段相同的所有记录的数据集。
; T; o7 r0 H8 t: q
, }+ J# h( C7 d; W4.答案是E。PHP有PostgreSQL和MySQL扩展库。访问DB/2可以用ODBC,访问Microsoft SQL Server可以用TDS和mssql扩展。这题考验你对PHP的兼容性的了解——在决定开发小组要使用什么数据库时会用得上。
" g& J$ |! X" j
3 s' m' |) G4 I" v8 @, }5.答案是B和D。用户输入未经过滤就直接送往了数据库,这非常危险。如果URL包含ID=0+OR+1这样的参数时,实际的查询为DELETE FROM MYTABLE WHERE ID = 0 OR 1,数据库将删除表中所有的记录。
0 i: {3 Z- G3 T/ l5 X* \  ^
! A8 q) m. j& j) @7 x2 h6.答案显然是INSERT。
, V" v! i. f( ]4 n
( Y- ?- i  E7 f9 e. t# _0 D7.答案是C。创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。1 S1 e( \8 b) i' t7 D, J

! f" k5 A2 j2 T8.能。你可以嵌套任意数量的join条件,但最终的结果可能并不是你想要的。3 {% ^) k5 ?. w4 y6 X) }0 o

: |7 g) V6 d0 \9.答案是C。给ID字段设置索引能提高where条件执行的效率,给NAME和ZIPCODE设索引则能使排序更快。
/ L# e9 L2 a. m, u. W# s" Q5 t* K$ g4 U# C/ ?1 ?
10.这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化,因此答案是E。( h  O" V/ r- B  c: p+ h

; s/ p! M$ }) R/ M11.答案是C。DESC能反转默认的排序机制。因此在本题中,数据将先按ID升序排列,再按NAME降序排列。7 s7 B8 i& g1 j2 P. j

4 i) T5 p; ?6 [' b& K) [' R1 q12.CURRENT_DATE函数不是标准SQL中的函数(但某些特定的数据库平台可能包含了这个函数)。
( K" g, G1 N# L* {$ J/ ^# m  ?  S$ V( @$ E) ?
13.答案B和C正确。在标准SQL中,如果出现GROUP BY,结果集中所有的字段都必须是聚集值,或者是GROUP BY结构本身的一部分。某些DBMS——比如MySQL——允许你打破这种规则,但它不按标准的方式执行,并且在其他数据库系统上无效。
2 v- u; j( H' U& Z# ~, f
5 f7 T7 U6 u# a3 H, o2 O3 |' s( q! u7 A" `14.本题描述了一种在使用join时常犯的概念性错误。很多人可能觉得这个查询将返回两个表中非共有记录。但实际上数据库却认为是“读出所有ID非共有的记录”。DBMS将读取读取左边表中所有的记录加上右边表中ID非共有的记录。因此,该查询将读取TABLE1中的每条记录乘以TABLE2中的每条记录再减去两表中相同的记录条数。
3 @: b, Z; C# y- F: u: ]4 r
5 \& E: }0 f) M4 }' w2 t) V15.事务能实现这个功能。事务能将任意个SQL语句组合起来一起执行,或者一起回滚。

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