Nm vn chung v c s d liu trên PHP
Mc : Trung bình
Jack Herrington, Tng biên tp, Code Generation Network
08 01 2010
Hãy khám phá nm vn v c s d liu ph bin xy ra trong các ng dng PHP -- gm thit k lc
c s d liu, truy cp c s d liu và mã logic nghip v s dng c s d liu -- cng nh các gii
pháp ca chúng.
Nu ch có mt cách s dng c s d liu chính xác ...
Bn có th to thit k c s d liu, truy cp c s d liu và mã logic nghip v PHP t trên u trang ca nó theo
mt s cách nào ó và bn thng kt thúc khi nhn thy nó sai. Bài vit này minh ha nm vn thng gp trong
vic thit k c s d liu, trong mã PHP truy cp các c s d liu và cách sa cha nhng vn này khi bn bt
gp chúng.
Vn 1: S dng MySQL trc tip
Khi s dùng các hàm
mysql_
truy cp trc tip vào c s d liu có mt vn ph bin là mã PHP ã c. Lit kê
1 ch ra cách truy cp trc tip vào c s d liu.
Lit kê 1. Access/get.php
Hãy lu ý vic s dng hàm
mysql_connect
truy cp vào c s d liu. Cng chú ý truy vn trong ó có dùng s
liên kt chu i b sung tham s
$name
vào truy vn ó.
K! thut này có hai s la chn tt: mô un PEAR DB và các l"p PHP Data Objects (PDO-Các i tng d liu
PHP). C hai u cung cp s tr#u tng t# vic la chn ca mt c s d liu c th. Do ó, mã ca bn có th chy
mà không cn iu chnh quá nhiu trên IBM® DB2®, MySQL, PostgreSQL, hoc c s d liu khác bt k$ mà bn
mun kt ni n.
Các giá tr% khác trong vic s dng các tng tr#u tng ca mô un PEAR DB và PDO là bn có th s dng toán t
?
trong các câu lnh SQL ca bn. Vic này làm cho SQL d& dàng bo trì hn và bo v ng dng ca bn kh'i các cuc
tn công ni x SQL.
Mã thay th khi s dng PEAR DB c hin th% d"i ây.
Lit kê 2. Access/get_good.php
!
!
"#$%$&'()*+,-$)$"..""!
/01!2
!
2
345!
6
"78."!
Page 1 of 10Nm vn chung v c s d liu trên PHP
Chú ý r(ng tt c các cp trc tip ca MySQL ã di&n ra, tr# chu i kt ni c s d liu trong
$dsn
. Ngoài ra,
chúng ta s dng bin
$name
trong SQL thông qua toán t
?
. Sau ó, d liu v"i truy vn này c gi i thông qua
array
cui phng thc
query()
.
Vn 2: Không s dng chc nng tng t ng
Ging nh hu ht các c s d liu hin i, MySQL có kh nng to các trình nhn dng (identifier) duy nht tng t
ng trên mt c s cho m i bn ghi. Mc dù vy, chúng ta v)n thy mã ln u tiên chy mt lnh
SELECT
tìm mã
nhn dng (
id
) ti a, sau ó b sung thêm mt vào
id
ó, cng nh mt bn ghi m"i. Lit kê 3 cho thy mt lc
m)u bad (xu).
Lit kê 3. Badid.sql
Trng
id
ây c quy %nh n gin là mt s nguyên. Vì vy, mc dù nó s* là duy nht, chúng ta có th thêm
vào bt k$ giá tr% nào mà chúng ta mun, nh ã ch ra trong câu lnh
INSERT
tip theo câu lnh
CREATE
. Lit kê 4 ch
ra mã PHP b sung thêm users (nhng ngi s dng) vào kiu lc này.
Lit kê 4. Add_user.php
9::9 ;:!
<7899&!
=$>)99$?6+!2
?6#$%$&'()*+,-$)$
!
!
?6@ /01!2
!
2
345!
6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'
'$A'
'$A'
!
@C#$)'@C'*D>%B$#E45!
@C#$)'@C'*D>%B$#F4!
@C#$)'@C'*D>%B$#E4!
"78."!
!
9::9 ;:!
<7899&!
=$>)99$?6+!2
?6"#$%$&'G()*+"!
!
?6@ /01!2
HE!
?6"@C#$)'@C'*D>%B$#"!
?6G!
!
2
Page 2 of 10Nm vn chung v c s d liu trên PHP
Mã trong
add_user.php
u tiên thc hin mt truy vn tìm ra giá tr% ti a ca
id
. Sau ó tp này chy mt câu
lnh
INSERT
v"i giá tr%
id
cng thêm mt. Mã này có th không chy thành công trong các iu kin ganh ua (race)
trên các máy ch có mt ti nng. Hn na, nó không hiu qu.
Vì vy, s thay th là gì? S dng tính nng tng t ng trong MySQL to các ID duy nht cho m i ln chèn t
ng. Lc cp nht c hin th% bên d"i.
Lit kê 5. Goodid.php
Chúng ta thêm c
NOT NULL
ch ra r(ng các trng này không r ng (null). Chúng ta cng ã b sung c
AUTO_INCREMENT
ch th% r(ng trng này tng t ng, cng nh c
PRIMARY KEY
ch th% trng nào là
id
.
Nhng thay i này cho phép tng mt chút tc . Lit kê 6 cho thy mã PHP ã cp nht, mã này chèn users (nhng
ngi dùng) vào bng.
Lit kê 6. Add_user_good.php
Thay vì nhn c giá tr%
id
ti a, tôi bây gi ch cn s dng câu lnh
INSERT
chèn d liu, sau ó s dng mt
câu lnh
SELECT
ly
id
ca bn ghi v#a m"i c chèn vào. Mã này n gin hn nhiu và hiu qu hn so v"i
phiên bn gc và lc liên quan ca nó.
Mt la chn khác i v"i chc nng tng t ng ca MySQL là s dng phng thc
nextId()
trong h thng
PEAR DB. Trong trng hp ca MySQL, iu này to ra mt bng tun t m"i và qun lý vic s dng mt c ch
khóa phc tp. Li th ca vic s dng phng thc này là nó s* hot ng trên các h thng c s d liu khác.
Dù b(ng cách nào, bn nên s dng mt h thng qun lý s tng các ID duy nht cho bn và không da vào h thng
mà bn truy vn u tiên, sau ó tng giá tr% ca chính bn và thêm bn ghi. Cách tip cn th hai d& b% nh hng
theo các iu kin ganh ua trên các trang có khi lng cao.
4!
3!
6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'C*'CB%%>B'*@C&)$+$C'
'$A'C*'CB%%
'$A'C*'CB%%
=)@+>)IJ$I
!
@C#$)'@C'*D>%B$#45!
@C#$)'@C'*D>%B$#4!
@C#$)'@C'*D>%B$#4!
"78."!
9::9 ;:!
<7899&!
=$>)99$?6+!2
?6"@C#$)'@C'*D>%B$#"!
?6G!
?6"#$%$&'"!
!
?6@ /01!2
!
2
4!
3!
6
Page 3 of 10Nm vn chung v c s d liu trên PHP
Vn 3: S dng nhiu c s d liu
Mt khi chúng ta thy ng dng mà m i bng trong mt c s d liu riêng bit. Có nhiu lý do thc hin iu ó
trong các c s d liu rt l"n, nhng i v"i ng dng trung bình, bn không cn mc phân on này. Ngoài ra, mc
dù có th thc hin các truy vn liên quan trên nhiu c s d liu, tôi rt khuyên bn chng li nó. Cú pháp phc tp
hn. Qun lý sao lu và khôi phc li không d& dàng. Cú pháp có th hoc không th làm vic gia các máy c s d
liu khác nhau. Và tht khó khn tip tc theo cu trúc quan h khi các bng c chia trên nhiu c s d liu.
Vì vy, nhiu c s d liu s* ging th nào? + bt u, bn cn mt s d liu. Lit kê 7 cho thy d liu này c
chia thành bn tp.
Lit kê 7. Các tp c s d liu
Trong phiên bn nhiu c s d liu ca các tp này, bn s* np câu lnh SQL vào trong mt c s d liu, sau ó np
các câu lnh SQL
users
(nhng ngi s dng) vào c s d liu khác. Mã PHP truy vn c s d liu cho các tp
này liên kt v"i ngi dùng c th c hin th% d"i ây.
Lit kê 8. Getfiles.php
(.9
(.9(.9
(.9
&)$>'$'>8%$
+$7@B+@C'
+$7@B+@C'
'$A'
'$A'
!
%.9
%.9%.9
%.9
@C#$)'@C'*D>%B$#EEE.4:E.4!
@C#$)'@C'*D>%B$#FEF.4:F.4!
B.9
B.9B.9
B.9
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'
'$A'
'$A'
!
%.9
%.9%.9
%.9
@C#$)'@C'*D>%B$#E45!
@C#$)'@C'*D>%B$#F4!
"78."!
9::9 ;:E!
<7899&!
=$>)99$?6+!2
?6"#$%$&'()*+,-$)$"
!
!
?6@ /01!2
!
2
!
!
9::9 ;:F!
<7899&!
=$>)99$?6+!2
Page 4 of 10Nm vn chung v c s d liu trên PHP
Hàm
get_user
kt ni t"i c s d liu cha bng ca nhng ngi s dng và ly ra ID cho mt ngi dùng ã bit.
Hàm
get_files
kt ni n bng các tp và ly ra các hàng có kt hp v"i ngi dùng ã bit.
Cách tt hn làm tt c nhng iu này là np d liu vào mt c s d liu, sau ó thc hin mt truy vn, nh
c hin th% bên d"i.
Lit kê 9. Getfiles_good.php
Mã này không ch ngn hn mà nó cng d& hiu hn và hiu qu hn. Thay vì thc hin hai truy vn, chúng ta ang
thc hin mt.
Trong khi vn này lc iu, chúng ta ã thy nó trong thc t có thi gian bit r(ng tt c các bng phi
trong cùng mt c s d liu, tr# khi có mt lý do cp thit khác.
Vn 4: Không s dng các mi quan h
Các c s d liu quan h không ging nh các ngôn ng lp trình. Chúng không có kiu mng. Thay vào ó, chúng
s dng các mi quan h gia các bng to ra cu trúc mt-t"i-nhiu gia các i tng, chúng có cùng tác dng
nh mt mng. Mt vn mà tôi ã thy v"i các ng dng là khi các k! s c gng s dng mt c s d liu nh
th nó ã là mt ngôn ng lp trình, to arrays (các mng) b(ng cách s dng chu i vn bn v"i các trình nhn dng
tách nhau b(ng du ph,y. Hãy xem lc d"i ây.
Lit kê 10. Bad.sql
?6"#$%$&'K()*+,-$)$"
!
?6@ /1 !2
!
2
45!
3!
6
"78."!
!
9::9 ;:!
<7899&!
=$>)99$?6+!2
?6
"#$%$&'.K()*+,-$)$
.>C7.."
!
?6@ /1 !2
!
2
45!
3!
6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'
'$A'
'$A'
!
Page 5 of 10Nm vn chung v c s d liu trên PHP