1. Trang chủ
  2. » Công Nghệ Thông Tin

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

10 405 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 219,84 KB

Nội dung

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

w