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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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 mt cách  s dng c s d liu chính xác . Bn 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 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 ó dùng s liên kt chu i  b sung tham s $name vào truy vn ó. K! thut này 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 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 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 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 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 nó s* là duy nht, chúng ta 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 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 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. 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 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. 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 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 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 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  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 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 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ù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 Mt ngi dùng trong h thng th 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 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  7)*='>8%$@($A@#'#! &)$>'$'>8%$ +$7@B+@C' '$A'  '$A' '$A' !  @C#$)'@C'*D>%B$#EE.4:E.4! @C#$)'@C'*D>%B$#FE.4:E.4! @C#$)'@C'*D>%B$#E45EF!  "78."!    9::9 ;:! <7899&! =$>)99$?6+!2  ?6"#$%$&'()*+,-$)$" ! !  ?6@  /01!2   !    ?6"#$%$&'K()*+,-$)$" !  ?6@  /1 !2 2   ! 2  45!  3! 6 7)*='>8%$@($A@#'#! &)$>'$'>8%$ +$7@B+@C' +$7@B+@C' '$A' '$A' !  7)*='>8%$@($A@#'#! &)$>'$'>8%$ +$7@B+@C' '$A'  '$A' !  @C#$)'@C'*D>%B$#E45! @C#$)'@C'*D>%B$#EEE.4:E.4! @C#$)'@C'*D>%B$#FEE.4:E.4! Page 6 of 10Nm vn  chung v c s d liu trên PHP . ây, m i tp 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 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 nhng chi tit cho t#ng thc th. Chúng ta gi nó là m)u n+1 vì ó là 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."!    9::9 ;:! <7899&! =$>)99$?6+!2   ! ?6 "#$%$&'.K()*+,-$)$. >C7.." !  ?6@  /1 !2   ! 2  45!  3! 6 7)*='>8%$@($A@#'#! &)$>'$'>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 !  @C#$)'@C'*D>%B$#L5-! @C#$)'@C'*D>%B$#73'!  @C#$)'@C'*5D>%B$#E&M>! @C#$)'@C'*5D>%B$#E=-5! @C#$)'@C'*5D>%B$#E=-=-5! @C#$)'@C'*5D>%B$#F==! @C#$)'@C'*5D>%B$#F))! @C#$)'@C'*5D>%B$#F=)! Page 7 of 10Nm vn  chung v c s d liu trên PHP +ây là lc  áng tin cy. Không 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 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ó 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à 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  78.!  9::9 ;:5! <7899&! =$>)99$?6+!2    !  ?6"#$%$&'()*+,-$)$" ! !  ?6@  /01!2 ! 2  5  !  ?6"#$%$&'()*+5,-$)$" ! !  ?6@ /1 /01!2 ! 2  5  !  ?6"#$%$&'K()*+5,-$)$"!  ?6@  !2 ! 2  L5-! 55! 55 555! 35! 2 6  78.!  9::9 ;:5! <7899&! =$>)99$?6+!2  5  !  ?6 "#$%$&'5.K()*+5,-$)$ 5..>C7." ! Page 8 of 10Nm vn  chung v c s d liu trên PHP Bây gi ly ra danh sách yêu cu ch mt truy vn, nhanh. Nó ngh/a là tôi kh nng s* phi 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 s la chn nào. Nu bn mun mt ng dng PHP 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 ó 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ó 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 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 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 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à d án  giúp bn phát trin v"i các công ngh mã ngun m và s dng chúng v"i các sn ph,m ca IBM.  !  ?6@  /1 !2  ! 2  55L5-! 35! 6 Page 9 of 10Nm vn  chung v c s d liu trên PHP  + 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, 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. Page 10 of 10Nm vn  chung v c s d liu trên PHP . ?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á. Action, Podcasting Hacks và PHP Hacks. Ông cng ã vit hn 30 bài báo. Page 10 of 10Nm vn  chung v c s d liu trên PHP

Ngày đăng: 06/11/2013, 23:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan