Goodid.php Chúng ta thêm c NOT NULL ch ra rng các tr ng này không r ng null... Không có gì sai ây... Ông là tác gi c a ba cu n sách: Code Generation in Action, Podcasting Hacks và PHP H
Trang 1
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
6
"78 " !
Trang 2Chú ý 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
!
!
! 2
6
&)$>'$ '>8%$
+$7@B+@C'
'$A'
'$A'
!
"78 " !
!
!
! 2
Trang 3Mã 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
6
&)$>'$ '>8%$
+$7@B+@C' C*' CB%% >B'* @C&)$+$C'
'$A' C*' CB%%
'$A' C*' CB%%
=)@+>)I J$I
!
"78 " !
!
! 2
6
Trang 4V 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
&)$>'$ '>8%$
+$7@B+@C'
+$7@B+@C'
'$A'
'$A'
!
&)$>'$ '>8%$
+$7@B+@C'
'$A'
'$A'
!
"78 " !
!
!
! 2
!
!
Trang 5Hà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
!
! 2
6
"78 " !
!
?6
!
! 2
6
&)$>'$ '>8%$
+$7@B+@C'
'$A'
'$A'
Trang 6M t ng i dùng trong h th ng có th có nhi u t p Trong m t ngôn ng l p trình, b n s* s d ng m t m ng bi u di&n các t p liên k t v"i ng i dùng Trong ví d này, l p trình viên ã ch n t o ra m t tr ng files (các t p) ch a
danh sách các id t p c phân cách b(ng d u ph,y + có c m t danh sách t t c các t p cho ng i dùng c th ,
l p trình viên tr "c tiên ph i c hàng t# b ng nh ng ng i dùng, sau ó phân tích cú pháp v n b n c a t p và ch y
m t câu l nh SELECT riêng l- cho m i t p Mã này c hi n th% bên d "i
Li t kê 11 Get.php
K! thu t này ch m, khó b o trì và không t n d ng t t c s d li u Gi i pháp duy nh t là tái ki n trúc l c này
a nó tr l i thành m t d ng quan h truy n th ng, nh c hi n th% d "i ây
Li t kê 12 Good.sql
&)$>'$ '>8%$
+$7@B+@C'
'$A'
'$A' '$A'
!
"78 " !
!
!
!
!
2
! 2
6
&)$>'$ '>8%$
+$7@B+@C'
+$7@B+@C'
'$A'
'$A'
!
&)$>'$ '>8%$
+$7@B+@C'
'$A'
'$A'
!
Trang 7ây, m i t p có liên quan n ng i dùng thông qua hàm user_id trong b ng t p +i u này h u nh có v- l c h u v"i b t k$ ai nhìn th y i u này nh là m t m ng Ch c ch n, các m ng không tham chi u n i t ng trong m ng
th c t , ng c l i hoàn toàn Nh ng trong m t c s d li u quan h , ây là cách nh ng th này làm và lí do các truy
v n là nhanh h n và d& dàng h n nhi u Li t kê 13 cho th y mã PHP t ng ng
Li t kê 13 Get_good.php
ây, chúng ta th c hi n m t truy v n n c s d li u nh n c t t c các hàng Mã này không ph c t p và nó
s d ng c s d li u nh nó ã c d %nh
V n 5: M u n+1
Tôi không th nói cho b n bi t bao nhiêu l n chúng ta ã nhìn th y các ng d ng l"n trong ó mã này u tiên l y ra
m t danh sách các th c th g i là các khách hàng sau ó quay tr l i và l y ra chúng t#ng ng i m t có c
nh ng chi ti t cho t#ng th c th Chúng ta g i nó là m)u n+1 vì ó là có bao nhiêu truy v n s* c th c hi n m t
truy v n l y ra danh sách t t c các th c th , r i m t truy v n cho m i m t trong n th c th +ây không ph i là m t
v n khi n = 10, nh ng s* là gì khi n = 100 ho c n = 1000? R i, s thi u kh n ng th c s óng góp vào Li t kê 14 cho th y m t ví d v m t l c nh v y
Li t kê 14 Schema.sql
"78 " !
!
?6
!
! 2
6
&)$>'$ '>8%$
+$7@B+@C' C*' CB%% >B'* @C&)$+$C'
'$A' C*' CB%%
=)@+>)I J$I
!
7)*= '>8%$ @( $A@#'# 5 !
&)$>'$ '>8%$ 5
+$7@B+@C' C*' CB%% >B'* @C&)$+$C'
+$7@B+@C' C*' CB%%
'$A' C*' CB%%
=)@+>)I J$I
!
Trang 8+ây là l c áng tin c y Không có gì sai ây V n là trong mã truy c p vào c s d li u tìm t t c các sách cho m t tác gi c th , nh c hi n th% d "i ây
Li t kê 15 Get.php
N u b n nhìn vào mã d "i cùng, b n có kh n ng suy ngh/ n chính mình, "Ôi, i u này th c s s ch s*." Tr "c tiên, nh n c id, tác gi , r i nh n c m t danh sách các cu n sách, sau ó nh n c thông tin v m i cu n sách
Ch c ch n, nó s ch s* nh ng nó có hi u qu không? Không Hãy nhìn xem chúng ta ph i th c hi n bao nhiêu các truy v n l y ra ch các sách c a Jack Herrington M t truy v n nh n c m t id, m t truy v n khác nh n
c m t danh sách các cu n sách, sau ó m t truy v n cho m i cu n sách N m truy v n cho ba cu n sách!
Gi i pháp này là có m t hàm th c hi n m t s l ng l"n truy v n, nh li t kê d "i ây
Li t kê 16 Get_good.php
!
!
!
! 2
5
!
!
!
! 2
5
!
! 2
2
6
5
!
?6
!
Trang 9Bây gi l y ra danh sách yêu c u ch m t truy v n, nhanh Nó có ngh/a là tôi có kh n ng s* ph i có m t s các ki u các ph ng th c này v"i các tham s khác nhau, nh ng th c s không có s l a ch n nào N u b n mu n có m t ng
d ng PHP có th so sánh c v"i nhau, b n ph i s d ng hi u qu c s d li u và i u ó có ngh/a là các truy v n thông minh h n
V n v"i ví d này là nó quá rõ ràng Thông th ng, các ki u c a v n n+1 hay n*n nh y c m h n nhi u Và
chúng ch xu t hi n khi ng i qu n tr% c s d li u ch y m t trình %nh hình truy v n trên h th ng c a b n khi nó có
v n v hi u n ng
K t lu n
Các c s d li u là các công c m nh và nh t t c các công c m nh m* chúng có th b% l m d ng n u b n không bi t cách s d ng chúng cho úng Th thu t phía sau vi c xác %nh và gi i quy t các v n này là hi u rõ h n
v công ngh bên d "i Quá lâu, tôi ã nghe các nhà mã hóa logic nghi p v than th r(ng h không mu n ph i hi u
c s d li u ho c mã SQL H bao b c c s d li u trong các i t ng và t h'i t i sao hi u n ng l i kém n nh
v y
H không nh n ra r(ng s hi u bi t SQL là nguyên t c c b n chuy n c s d li u t# m t hoàn c nh khó kh n thành m t ng minh m nh N u b n s d ng c s d li u hàng ngày, nh ng SQL không phù h p v"i b n, hãy c
The Art of SQL (Ngh thu t SQL) +ây là h "ng d)n thi t th c, c vi t rõ ràng nh n c nhi u nh t bên ngoài
m t c s d li u
Tài nguyên
H c t p
The Art of SQL (Ngh thu t SQL), c a Stephane Faroult và Peter Robson, là m t cu n sách ph i c i v"i các
l p trình viên, nh ng ng i s d ng c s d li u trong các ng d ng c a h
PHP.net là i m kh i u cho t t c m i th PHP
Tài li u PEAR DB là m t tài nguyên xu t s c
Tài li u các ch c n ng PDO có th a b n lên n t c trên PHP Data Objects (PDO- Các i t ng d li u PHP)
MySQL.org có tài li u h "ng d)n xu t s c v"i các ví d hi n th% cách s d ng m t c s d li u t t h n
Truy c p tài nguyên d án PHP c a developerWorks IBM tìm hi u thêm v PHP
Theo sát v"i các s ki n k! thu t và webcast c a developerWorks
Hãy xem các h i ngh%, các cu c tri n lãm th ng m i, webcast s p t"i và các s ki n trên th gi"i mà các nhà phát tri n mã ngu n m c a IBM ang quan tâm
Truy c p vào l/nh v c mã ngu n m c a developerWorks v"i các thông tin h "ng d)n r ng l"n, các công c và
!
! 2
6
Trang 10+ nghe các cu c ph'ng v n và th o lu n thú v% v"i các nhà phát tri n ph n m m, hãy xem developerWorks podcasts
L y s n ph m và công ngh
+ i m"i d án phát tri n ngu n m ti p theo c a c a b n v"i ph n m m dùng th IBM, có s0n t i xu ng
ho c trên /a DVD
Th o lu n
Dành tâm trí cho c ng ng developerWorks b(ng cách tham gia vào các blog c a developerWorks
ôi nét v tác gi
Jack D Herrington là k! s ph n m m cao c p v"i h n 20 n m kinh nghi m Ông là tác gi c a ba cu n sách: Code Generation in Action, Podcasting Hacks và PHP Hacks Ông c ng ã vi t h n 30 bài báo