Tải bản đầy đủ (.pdf) (10 trang)

Năm vấn đề chung về cơ sỡ dữ liệu trên PHP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (219.84 KB, 10 trang )



Nm vn  chung v c s d liu trên PHP

Mc : Trung bình
Jack Herrington, Tng biên tp, Code Generation Network
08 01 2010
Hãy khám phá nm vn  v c s d liu ph bin xy ra trong các ng dng PHP -- gm thit k lc
 c s d liu, truy cp c s d liu và mã logic nghip v s dng c s d liu -- cng nh các gii
pháp ca chúng.
Nu ch có mt cách  s dng c s d liu chính xác ...
Bn có th to thit k c s d liu, truy cp c s d liu và mã logic nghip v PHP t trên u trang ca nó theo
mt s cách nào ó và bn thng kt thúc khi nhn thy nó sai. Bài vit này minh ha nm vn  thng gp trong
vic thit k c s d liu, trong mã PHP truy cp các c s d liu và cách sa cha nhng vn  này khi bn bt
gp chúng.
Vn  1: S dng MySQL trc tip

Khi s dùng các hàm
mysql_
 truy cp trc tip vào c s d liu có mt vn  ph bin là mã PHP ã c. Lit kê
1 ch ra cách truy cp trc tip vào c s d liu.

Lit kê 1. Access/get.php


Hãy lu ý vic s dng hàm
mysql_connect
 truy cp vào c s d liu. Cng chú ý truy vn trong ó có dùng s
liên kt chu i  b sung tham s
$name
vào truy vn ó.


K! thut này có hai s la chn tt: mô un PEAR DB và các l"p PHP Data Objects (PDO-Các i tng d liu
PHP). C hai u cung cp s tr#u tng t# vic la chn ca mt c s d liu c th. Do ó, mã ca bn có th chy
mà không cn iu chnh quá nhiu trên IBM® DB2®, MySQL, PostgreSQL, hoc c s d liu khác bt k$ mà bn
mun kt ni n.
Các giá tr% khác trong vic s dng các tng tr#u tng ca mô un PEAR DB và PDO là bn có th s dng toán t
?

trong các câu lnh SQL ca bn. Vic này làm cho SQL d& dàng bo trì hn và bo v ng dng ca bn kh'i các cuc
tn công ni x SQL.
Mã thay th khi s dng PEAR DB c hin th% d"i ây.

Lit kê 2. Access/get_good.php




 !
!

"#$%$&'()*+,-$)$"..""!
   /01!2

!
2

345!
6

"78."!




Page 1 of 10Nm vn  chung v c s d liu trên PHP

Chú ý r(ng tt c các  cp trc tip ca MySQL ã di&n ra, tr# chu i kt ni c s d liu trong
$dsn
. Ngoài ra,
chúng ta s dng bin
$name
trong SQL thông qua toán t
?
. Sau ó, d liu v"i truy vn này c gi i thông qua
array
 cui phng thc
query()
.



Vn  2: Không s dng chc nng tng t ng

Ging nh hu ht các c s d liu hin i, MySQL có kh nng to các trình nhn dng (identifier) duy nht tng t
ng trên mt c s cho m i bn ghi. Mc dù vy, chúng ta v)n thy mã ln u tiên chy mt lnh
SELECT
 tìm mã
nhn dng (
id
) ti a, sau ó b sung thêm mt vào
id
ó, cng nh mt bn ghi m"i. Lit kê 3 cho thy mt lc 

m)u bad (xu).

Lit kê 3. Badid.sql


Trng
id
 ây c quy %nh n gin là mt s nguyên. Vì vy, mc dù nó s* là duy nht, chúng ta có th thêm
vào bt k$ giá tr% nào mà chúng ta mun, nh ã ch ra trong câu lnh
INSERT
tip theo câu lnh
CREATE
. Lit kê 4 ch
ra mã PHP b sung thêm users (nhng ngi s dng) vào kiu lc  này.

Lit kê 4. Add_user.php

9::9 ;:!
<7899&!
=$>)99$?6+!2

?6#$%$&'()*+,-$)$
!
!
 ?6@  /01!2

!
2

345!

6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'
'$A'
 '$A'
!

@C#$)'@C'*D>%B$#E45!
@C#$)'@C'*D>%B$#F4!
@C#$)'@C'*D>%B$#E4!

"78."!



 !

9::9 ;:!
<7899&!
=$>)99$?6+!2

?6"#$%$&'G()*+"!
!
 ?6@  /01!2

HE!

?6"@C#$)'@C'*D>%B$#"!
?6G!


!
2

Page 2 of 10Nm vn  chung v c s d liu trên PHP

Mã trong
add_user.php
u tiên thc hin mt truy vn  tìm ra giá tr% ti a ca
id
. Sau ó tp này chy mt câu
lnh
INSERT
v"i giá tr%
id
cng thêm mt. Mã này có th không chy thành công trong các iu kin ganh ua (race)
trên các máy ch có mt ti nng. Hn na, nó không hiu qu.
Vì vy, s thay th là gì? S dng tính nng tng t ng trong MySQL  to các ID duy nht cho m i ln chèn t
ng. Lc  cp nht c hin th% bên d"i.

Lit kê 5. Goodid.php


Chúng ta thêm c
NOT NULL
 ch ra r(ng các trng này không r ng (null). Chúng ta cng ã b sung c
AUTO_INCREMENT
 ch th% r(ng trng này tng t ng, cng nh c
PRIMARY KEY
 ch th% trng nào là

id
.
Nhng thay i này cho phép tng mt chút tc . Lit kê 6 cho thy mã PHP ã cp nht, mã này chèn users (nhng
ngi dùng) vào bng.

Lit kê 6. Add_user_good.php


Thay vì nhn c giá tr%
id
ti a, tôi bây gi ch cn s dng câu lnh
INSERT
 chèn d liu, sau ó s dng mt
câu lnh
SELECT
 ly
id
ca bn ghi v#a m"i c chèn vào. Mã này n gin hn nhiu và hiu qu hn so v"i
phiên bn gc và lc  liên quan ca nó.
Mt la chn khác i v"i chc nng tng t ng ca MySQL là s dng phng thc
nextId()
trong h thng
PEAR DB. Trong trng hp ca MySQL, iu này to ra mt bng tun t m"i và qun lý vic s dng mt c ch
khóa phc tp. Li th ca vic s dng phng thc này là nó s* hot ng trên các h thng c s d liu khác.
Dù b(ng cách nào, bn nên s dng mt h thng qun lý s tng các ID duy nht cho bn và không da vào h thng
mà bn truy vn u tiên, sau ó tng giá tr% ca chính bn và thêm bn ghi. Cách tip cn th hai d& b% nh hng
theo các iu kin ganh ua trên các trang có khi lng cao.
4!

3!

6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'C*'CB%%>B'*@C&)$+$C'
'$A'C*'CB%%
 '$A'C*'CB%%
=)@+>)IJ$I
!

@C#$)'@C'*D>%B$#45!
@C#$)'@C'*D>%B$#4!
@C#$)'@C'*D>%B$#4!

"78."!



9::9 ;:!
<7899&!
=$>)99$?6+!2

?6"@C#$)'@C'*D>%B$#"!
?6G!

?6"#$%$&'"!
!
 ?6@  /01!2

!
2


4!

3!
6
Page 3 of 10Nm vn  chung v c s d liu trên PHP



Vn  3: S dng nhiu c s d liu

Mt khi chúng ta thy ng dng mà m i bng  trong mt c s d liu riêng bit. Có nhiu lý do  thc hin iu ó
trong các c s d liu rt l"n, nhng i v"i ng dng trung bình, bn không cn mc phân on này. Ngoài ra, mc
dù có th thc hin các truy vn liên quan trên nhiu c s d liu, tôi rt khuyên bn chng li nó. Cú pháp phc tp
hn. Qun lý sao lu và khôi phc li không d& dàng. Cú pháp có th hoc không th làm vic gia các máy c s d
liu khác nhau. Và tht khó khn  tip tc theo cu trúc quan h khi các bng c chia trên nhiu c s d liu.
Vì vy, nhiu c s d liu s* ging th nào? + bt u, bn cn mt s d liu. Lit kê 7 cho thy d liu này c
chia thành bn tp.

Lit kê 7. Các tp c s d liu


Trong phiên bn nhiu c s d liu ca các tp này, bn s* np câu lnh SQL vào trong mt c s d liu, sau ó np
các câu lnh SQL
users
(nhng ngi s dng) vào c s d liu khác. Mã PHP  truy vn c s d liu cho các tp
này liên kt v"i ngi dùng c th c hin th% d"i ây.

Lit 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$#EEE.4:E.4!
@C#$)'@C'*D>%B$#FEF.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$#E45!

@C#$)'@C'*D>%B$#F4!

"78."!



9::9 ;:E!
<7899&!
=$>)99$?6+!2

?6"#$%$&'()*+,-$)$"
!
!
 ?6@  /01!2

!
2



!

 !

9::9 ;:F!
<7899&!
=$>)99$?6+!2

Page 4 of 10Nm vn  chung v c s d liu trên PHP


Hàm
get_user
kt ni t"i c s d liu cha bng ca nhng ngi s dng và ly ra ID cho mt ngi dùng ã bit.
Hàm
get_files
kt ni n bng các tp và ly ra các hàng có kt hp v"i ngi dùng ã bit.
Cách tt hn  làm tt c nhng iu này là np d liu vào mt c s d liu, sau ó thc hin mt truy vn, nh
c hin th% bên d"i.

Lit kê 9. Getfiles_good.php


Mã này không ch ngn hn mà nó cng d& hiu hn và hiu qu hn. Thay vì thc hin hai truy vn, chúng ta ang
thc hin mt.
Trong khi vn  này lc iu, chúng ta ã thy nó trong thc t có  thi gian  bit r(ng tt c các bng phi 
trong cùng mt c s d liu, tr# khi có mt lý do cp thit khác.



Vn  4: Không s dng các mi quan h

Các c s d liu quan h không ging nh các ngôn ng lp trình. Chúng không có kiu mng. Thay vào ó, chúng
s dng các mi quan h gia các bng  to ra cu trúc mt-t"i-nhiu gia các i tng, chúng có cùng tác dng
nh mt mng. Mt vn  mà tôi ã thy v"i các ng dng là khi các k! s c gng s dng mt c s d liu nh
th nó ã là mt ngôn ng lp trình, to arrays (các mng) b(ng cách s dng chu i vn bn v"i các trình nhn dng
tách nhau b(ng du ph,y. Hãy xem lc  d"i ây.

Lit kê 10. Bad.sql

?6"#$%$&'K()*+,-$)$"

!
 ?6@  /1 !2

 !
2

45!

3!
6

"78."!



 !

9::9 ;:!
<7899&!
=$>)99$?6+!2

?6
"#$%$&'.K()*+,-$)$
.>C7.."
!
 ?6@  /1 !2

 !
2


45!

3!
6
7)*='>8%$@($A@#'#!
&)$>'$'>8%$
+$7@B+@C'
'$A'
'$A'
!
Page 5 of 10Nm vn  chung v c s d liu trên PHP

×