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 407 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

Tiêu đề Năm vấn đề chung về cơ sở dữ liệu trên PHP
Người hướng dẫn Jack Herrington, Tổng biên tập Code Generation Network
Thể loại Bài viết
Năm xuất bản 2010
Định dạng
Số trang 10
Dung lượng 219,84 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

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

!

!

! 2

6

&)$>'$ '>8%$

+$7@B+@C'

'$A'

'$A'

!

"78 " !

!

!

! 2

Trang 3

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

6

&)$>'$ '>8%$

+$7@B+@C' C*' CB%% >B'* @C&)$+$C'

'$A' C*' CB%%

'$A' C*' CB%%

=)@+>)I J$I

!

"78 " !

!

! 2

6

Trang 4

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

&)$>'$ '>8%$

+$7@B+@C'

+$7@B+@C'

'$A'

'$A'

!

&)$>'$ '>8%$

+$7@B+@C'

'$A'

'$A'

!

"78 " !

!

!

! 2

!

!

Trang 5

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

!

! 2

6

"78 " !

!

?6

!

! 2

6

&)$>'$ '>8%$

+$7@B+@C'

'$A'

'$A'

Trang 6

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

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 9

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 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

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

TỪ KHÓA LIÊN QUAN

w