Xem mẫu

  1. N mv n chung v c s d li u trên PHP Page 1 of 10 N mv 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 ! ! "#$%$&' ()*+ ,-$)$ ". ." " ! /01! 2 ! 2 3 4 5 ! 6 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 "78. " !
  2. N mv n chung v c s d li u trên PHP Page 2 of 10 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 #$%$&' ()*+ ,-$)$ ! ! ?6 @ /01! 2 ! 2 3 4 5 ! 6 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 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 ! 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 "78. " ! ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' G ()*+ " ! ! ?6 @ /01! 2 H E! ?6 "@C#$)' @C'* D>%B$# " ! ?6 G ! ! 2
  3. N mv n chung v c s d li u trên PHP Page 3 of 10 4 ! 3 ! 6 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 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 ! 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 "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "@C#$)' @C'* D>%B$# " ! ?6 G ! ?6 "#$%$&' " ! ! ?6 @ /01! 2 ! 2 4 ! 3 ! 6 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. N mv n chung v c s d li u trên PHP Page 4 of 10 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 ( . 9 &)$>'$ '>8%$ +$7@B+@C' +$7@B+@C' '$A' '$A' ! % . 9 @C#$)' @C'* D>%B$# E E E.4 : E.4 ! @C#$)' @C'* D>%B$# F E F.4 : F.4 ! B . 9 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' ! % . 9 @C#$)' @C'* D>%B$# E 4 5 ! @C#$)' @C'* D>%B$# F 4 ! 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 "78. " ! 9:: 9 ; : E ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' ()*+ ,-$)$ " ! ! ?6 @ /01! 2 ! 2 ! ! 9:: 9 ; : F ! < 7899& ! =$>)99 $ ?6 + ! 2
  5. N mv n chung v c s d li u trên PHP Page 5 of 10 ?6 "#$%$&' K ()*+ ,-$)$ " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 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 "78. " ! ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' .K ()*+ ,-$)$ . >C7 . . " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 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 7)*= '>8%$ @( $A@#'# ! &)$>'$ '>8%$ +$7@B+@C' '$A' '$A' !
  6. N mv n chung v c s d li u trên PHP Page 6 of 10 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 ! M 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 "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ?6 "#$%$&' ()*+ ,-$)$ " ! ! ?6 @ /01! 2 ! ?6 "#$%$&' K ()*+ ,-$)$ " ! ?6 @ /1 ! 2 2 ! 2 4 5 ! 3 ! 6 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' +$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 !
  7. N mv n chung v c s d li u trên PHP Page 7 of 10 . â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 "78. " ! 9:: 9 ; : ! < 7899& ! =$>)99 $ ?6 + ! 2 ! ?6 "#$%$&' .K ()*+ ,-$)$ . >C7 . . " ! ?6 @ /1 ! 2 ! 2 4 5 ! 3 ! 6 . â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ó ã cd %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 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 = ) !
  8. N mv n chung v c s d li u trên PHP Page 8 of 10 +â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 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 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 78. ! 9:: 9 ; : 5 ! < 7899& ! =$>)99 $ ?6 + ! 2 5 ! ?6 "#$%$&' 5 .K ()*+ 5 ,-$)$ 5 . . >C7 . " !
  9. N mv n chung v c s d li u trên PHP Page 9 of 10 ! ?6 @ /1 ! 2 ! 2 5 5 L 5 - ! 3 5 ! 6 Bâ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 ct 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 nt c trên PHP Data Objects (PDO- Các it 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à 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.
  10. N mv n chung v c s d li u trên PHP Page 10 of 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.
nguon tai.lieu . vn