u.v
n
ed
ui.
Th.S: NGUYỄN MINH - LƯƠNG PHÚC
u.v
n-
ww
w.
lib
.ha
và nhóm tin học thự c dụng
P
u.v
H
ed
P
n-
ww
w.
lib
.ha
ui.
ed
Kỹ thuật và thủ thuật
lập trình hướng đốì tưỢng
.ha
ui.
Khái niệm, kỹ thuật và viết mã
.lib
♦ T rọii bộ 2 tậ p hạn sẽ có cơ hội cọ x á t đ ẻ n ân g cao Icỹ
-w
ww
n ăiig lậ p trm li tliôiig q u a việc tliự c h à n h s ủ dm iíỊ các
tín h năng cao cáp, ch ẳn g h ạ n n h u các vấii íiti cơ sd
d ứ liệii, MySQỊv, SQỊvite và P D O c tia P H P
ed
u.v
n
♦ Với phươiiq p h áp hiíớnQ d ản t à n g ví d ụ b ạ n sẽ Idiỗnp
Iiliửng d ể dàiiíỊ n ắ m b ắ t các Id iái mộiTL c ă n b ảii, nâng
cao liơii ciiiiẹỊ Iiliit c ách SI^ dxuig các côniỊ cxx lậ p trù ili
.ha
ui.
New Edition
ciia P H P đ ễ v iế t các ch tíớ n g t r ì n h P I Ỉ P că n bảii
n ê n làm th e o đ ể n ắm vũnữ, n ộ l dting đtíỢc tr ìn h bày,
b ao g è m sự cài đ ặ t phlui m ề m , c ú p h á p ngôn ngiì, các
c ẩ u trứ c d ữ K ệư...
♦ Mà điểm đặc b iệ t ciia bộ sách chính là ở I>hươiig pliáỊ
hướng d ẫ n r ẩ t đơn g iản và cỢc kỳ d ề tiế p tìiư
ww
w
.lib
.ha
ui.
ed
u.v
n
-w
ww
.lib
^ Mỗi chương cồn có n h iề u b à i tậ p tliụ c liảiứá n ià b ạn
NHÀ XƯẤT BẢN HỒNG ĐỨC
u.v
n
ed
.ha
ui.
.lib
ww
w
ed
u.v
n
.ha
ui.
.lib
-w
ww
.lib
-w
ww
.ha
ed
ui.
n-
u.v
ww
w.
lib
.ha
ui.
ed
n-
u.v
ww
w.
lib
.ha
ui.
ed
u.v
n
u.v
n
ed
ui.
.ha
ww
w.
lib
I v ờ l NÓI ĐẦU
ww
w.
lib
.ha
ui.
ed
u.v
n-
B ộ s á c h " K j' t l i u ậ t v à th ủ t h u ậ t lậ i) tr ìn li liư ớ n g đ ố i
tư ợ n íị P H P ” đ ư ợ c b i ê n so ạn n h ằ m m ụ c đ íc h d à n h clio
n h ữ n g người m ớ i b ắ t đ ầ ii biíớc c h â n vào t h ế giới c ủ a ng ô n
n g ữ lậ p ư ù i h P H P . K h ô n g giống n h ư n h ữ n g s á c h Idiác,
s á c h n à y Id iơ n g đ ị i h ỏ i b ạ n p h ả i h ọ c q u a trư ớ c các v ấ n đ ề
c ă n b ả n v ề lậ p tr ìn li W eb ha}' cơ sỡ d ữ liệ u . M à đ iể m đ ặc
b i ệ t c ủ a b ộ s á c h c h ú ih là ở p h ư ơ n g p h á p h ư ớ n g d ẫ n r ấ t
đ ơ n g iả n v à cự c Icỳ d ể tiế p ứ iu .
ed
u.v
n
-w
ww
.lib
.ha
ui.
ed
u.v
n-
T liự c vậy, với p h ư ơ n g p h á p h ư ớ ng d ẫ n b ằ n g v í d ụ b ạ n
s ẽ Id iô n g n h ữ n g d ễ d à n g n ắ m b ắ t các Id iá i n iệ m c ă n b ả n ,
m à tliồ n g q u a đ ó s ẽ d ầ n trở n ê n q u e n tíiu ộ c với các Id iái
n iệ m n â n g cao h ơ n c ủ n g n h ư c á c h s ử d ụ n g các cồng c ụ lậ p
trìn h củ a P H P đ ể
các ch ư ơ n g t r ì n h P H P c ă n b ả n .
H ơ n n ữ a , với tr ọ n b ộ 2 tậ p b ạ n s ẽ có cơ liộ i cọ x á t đ ể n â n g
cao k ỷ n ă n g lậ p t r ì n h tliô n g q \ia việc tliự c lià iili s ử d ụ jig
các t í n h n ă n g cao cấ p , c h ẳ n g h ạ n n h ư các v ấ n tin cơ sở d ử
liệ u , M ySQ Ị/, S Q L ite v à PD O c ủ a P H P , c á c cô n g n g liệ
XMIv, c á c coolcie, s e s s io n và lie a d e r, và các p liầ n m ở rộng
c ủ a b ô n t h ứ b a.
.lib
.ha
ui.
S á c h có b ố c ụ c rỗ rà n g th e o từ iig ch ư ơ n g và đ ề m ục,
các b tíớ c h iíớ n g d ẫ n c ụ ứ iể và d ễ h ic ii. M ỗi cliiíơ ng cịn có
n h iề u b à i tậ p ứ iự c h à n li m à b ạ n n ê n là m th e o đ ể nắm
^àỈIlg n ộ i d m ig d ư ợ c tr ì n h b ày , b ao cỊồtn sự c à i đ ặ t p h ầ n
n iè in , c ú p h á p n g ô ii n g ữ , các c ấ u ta*úc đ ữ liệ u , các th tíờ n g
-w
ww
I x m li đ i c u I d i i t n , c á c lià n i c à i s ẵ n , v à n liiềa i t á c Aại liữ íi
íc h k h á c .
ww
w
.lib
.ha
ui.
ed
u.v
n
H y vọng s á c h s ẽ là n iộ t tà i liệ u h ọ c tậ p h ữ u íc h ch o b ạ n
đ ọ c tro n g q u á t r ì n h ti-ỏ tlià n h m ộ t c h u y ê n g ia v ề PH P .
T ấ c g iả
u.v
n
ed
.ha
ui.
.lib
ww
w
ed
u.v
n
.ha
ui.
.lib
-w
ww
.lib
-w
ww
.ha
ed
ui.
n-
u.v
ww
w.
lib
.ha
ui.
ed
n-
u.v
ww
w.
lib
.ha
ui.
ed
u.v
n
u.v
n
n-
ww
w.
lib
.ha
ui.
ed
C h ư ơ n g 7: Làm v iệ c vớ i các cơ sỏ dữ liệu và S Q L
ui.
ed
u.v
PHẨN 2
ww
w
.lib
.ha
ui.
ed
u.v
n
-w
ww
.lib
.ha
ui.
ed
u.v
n
-w
ww
.lib
.ha
ui.
ed
u.v
n-
ww
w.
lib
.ha
Làm viêc với dữ
liêu từ những
nguồn khác
CbiửJ9ig 7: Làm v iệ c với cá c cơ s ở
d ữ liệu và SQL
Chươìig &• Làm việc với XML
Chương 9: Làm việc với các Cookie,
Sessiơn, và H ea d er
Chươĩtg 10: X ử lý cá c lỗi
Chiừýiìg 11: Bảo vệ an toàn PHP
Cbươềig 12: M ờ rộng PH P
u.v
n
C h ư ớ n g 7: Làm v iệ c v ớ i các cơ sỏ dữ liêu và SQL
w.
lib
.ha
ui.
ed
u.v
n-
ww
w.
lib
.ha
ui.
ed
8
......................................................................
.ha
ui.
ed
u.v
n-
ww
Làm việc với các cơ sd dữ
liệu vò SQL
Những kỹ năng và k h á i niêm chính
.lib
Ị
Thêm, biên tập, xóa và xem các record sứ dụng các
MySQL và SQLiie
CO'
sở ciữ liệit
ed
u.v
n
•
-w
ww
Ể! Hoc nbiÌỲìg kbái niệm cơ sở d ữ liộn I'à Stnicliired Qiierỵ Langỉiage
M Tniy tìm các record cơ sứ d ũ liệu iĩới PHP
.ha
ui.
• ỉỉiộii lực bóa và htli d ữ liệu ĩihập Cíta ngííời dũng sang mộ! cơ sở dữ
ìiC>ti ì'ới PHP
-w
ww
.lib
» Viết các cbỉỉơtìg trình điền khiền bàng cơ sở đ ữ liệu kbả chìtyển
(portable)
M
ww
w
.lib
.ha
ui.
ed
u.v
n
ột trong những lý do cho sự th ô n g dụng của PH P n h ư là m ột
ngôn ngữ v iết script Web là nó hỗ trợ m ột dãy rộng các hệ
th ố n g dữ liệu quan hệ. Sự hỗ trợ làm cho các n h à p h á t triển
Web dễ dàng tạo các Web site điều k h iển bằng dữ liệu và tạo nguyên
các ứng dụng Web m ột cách n h an h chóng và hiệu quả.
u.v
n
.ha
ui.
ed
u.v
n-
ui.
ww
w.
lib
.ha
PH P hỗ trợ hơn 15 bộ máy cơ sở dữ liệu khác nhau bao gồm Microsoft
SQL Server, IBM DB2, PostgreSQ L, và Oracle. Cho đến P H P 5, sự hỗ trợ
này đă được cung cấp qua các extension cơ sở dữ iiệu riêng, mỗi extension
có chức n ăn g và tín h n ăn g riên g của nó. Tuy nhiên, điều này đã làm cho các
n h à p h á t triể n khó th ay đổi từ m ộ t bộ máy cơ sở dữ liệu này san g m ột bộ
m áy cơ sở đữ liệu khác. PH P 5 đã giải quyết tìn h huống n ày b ằn g việc giới
thiệu m ột API chung cho sự truy cập cơ sở dữ liệu: extension P H P D ata
Objects (PDO), cung cấp m ột giao diện hợp n h ấ t để làm việc với cơ sở dữ
Uệu %'à giúp các n h à p h á t triể n xử lý những cơ sở dữ liệu k hác n h au một
cách n h ấ t quán.
ed
C h ư ơ n g 7 : Làm v iệ c với các c ơ s ỏ dữ liệu và SQL
.lib
.ha
ui.
ed
u.v
n-
ww
w.
lib
T rong P H P 5.3, extension PDO đã được cải tiến th êm nữa với sự hỗ trợ
cho các bộ m áy cơ sở dữ liệu mới và những tối ưu h ó a th ê m nữa cho an n in h
và hiệu suất. Đ ể đ ạ t được k h ả n ăn g tương thích ngược, các extension cơ sở
dữ liệu riên g cũng tiếp tục dược hỗ trợ. Bởi vì b ạn sẽ thường tự n h ậ n thấy
m ình đã chọn giữa m ột extension riêng của m ình (m à có th ể n h an h hcm
hoặc đưa ra nhiều tín h n àn g hơn) hoặc PDO (đưa ra tín h k h ả chuyển và
tín h n h ấ t quán qua các bộ m áy cơ sở dữ liệu), chương n ày đề cập d ến h ai tùy
chọn; chương giới thiệu về PDO và cũng th ảo luận h a i trong sơ’ các extension riên g th ó n g dụng n h ấ t của PHP, extension MySQL Im proved và extension SQLite.
-w
ww
Giới ỉh iệu các cơ sở dữ liệu và SQL
-w
ww
.lib
.ha
ui.
ed
u.v
n
Trong thờ i đại In tern et, th ơ n g tin khơng cịn được trìn h bày tro n g các tủ
đựng hồ sơ nữa. T hay vào đó, nó được lưu trữ dưới dạng các số 1 và số 0
tro n g cấc kiểu dữ liệu điện tử vốn là những "hộp chứa" lưu trữ dữ liệu áp dặt
m ột cấu trúc n h ấ t định về th ô n g tin . Những cơ sở dữ liệu điện tử này khơng
chỉ chiếm ít không gian v ật lý hơn không gian gỗ và kim loại tương ứng m à
chúng còn chứa đầy những cơng cụ để giúp người dùng lọc và truy tìm
n h a n h thông tin sử dụng những tiêu chí khac ưhau. Cụ th ế hầu h ế t các cơ
sở dữ liệu điện tử ngày nay là những cơ sở dữ liệu quan hệ (relational
database) cho p h ép người dùng dịnh nghĩa mối quan hệ giữa các b ản g cơ sở
dữ liệu khác n h au để tìm kiếm và phân tích hiệu quả hơn.
ww
w
.lib
.ha
ui.
ed
u.v
n
H iện có sẵn m ột số lớn các hệ thơng quản lý cơ sở dữ liệu, m ột số thương
m ại và m ột số m iễn phí. Có lẽ b ạn đã nghe đến m ột vài hệ th ô n g này:
Oracle, M icrosoft Access, My SQL, và PostgreSQL. N hững hệ th ô n g cơ sở
dữ liệu này là những ứng dụng p h ần mềm m ạnh, phong phú tín h n ăn g có
k h ả n áng tổ chức và tìm kiếm h àn g triệu record với những tốc độ r ấ t cao;
do đó chúng dược sử dụng rộng rã i với các doanh nghiệp và v ăn phòng
u.v
n
C h ư ơ n g 7: Làm việc với các cờ s ở dữ liệu v à SQL
ed
10
u.v
n-
ww
w.
lib
.ha
ui.
chính phủ, thường cho những mục đích r ấ t quan trọng. Trước khi đi vào chi
tiế t cụ th ể của việc xử lý các record cơ sở dữ liệu với P H P , trước tiê n cần
p h ải hiểu rõ các k h á i niệm cơ sở dữ liệu cơ bản. Nếu b ạ n mới làm quen với
cơ sở dữ liệu này, các p h ần sau dầy cung cấp m ột n ền tả n g v à cũng cho bạn
th ử nghiệm với m ột bài tập thực tiễn tro n g S tructured Query Language
(SQL). Thông tin này sẽ hữu dụng để hiểu nội dung n â n g cao hơn tro n g các
p h ần tiếp theo.
.ha
ui.
ed
Tìm hiểu các cớ sỏ dữ liệu, record, v à khóa chính (Prím a ry Key)
ww
w.
lib
Mọi cơ sở dữ liệu gom m ôt hoặc nhiều b ản g (table). N hữ ng b ản g n ày tạo
cấu trúc dữ liệu th à n h các h àn g và cột, áp đ ặt sự tổ chủc lên dữ liệu. H ình
7.1 m inh h ọ a m ột bảng điển hình.
.lib
.ha
ui.
ed
u.v
n-
Bàng này chứỉt các sõ’ jiệ'j b án h ãn g oho
vỊ !;rj k h ác n h au vt'i
hàny hoặc record (bản ghi) chứa thịng tin cho m ơt vị rri va n ăm kỉiác. Mồi
recorđ được p h ân chia trở th à n h các cột hoặc field (trường) với mỗi trường
chứa m ột đoạn thông tin khác. Cấu trúc dạng b ản g n ày làm cho dễ tìm
kiếm trê n b ản g để tìm ra các record khớp với tiêu chí (criteria) cụ thể: ví
dụ, tấ t cả vị tr í có doanh sơ' lớn hơn $10,000 hoặc doanh s ố cho t ấ t cả vị trí
tro n g n ăm 2008.
ww
w
.lib
.ha
ui.
ed
u.v
n
-w
ww
.lib
.ha
ui.
ed
u.v
n
-w
ww
Các record tro n g b ản g không được sắp xếp theo b ấ t kỳ th ứ tự cụ th ể chúng có th ể được p h ân loại theo thứ tự bảng chữ cái, th eo năm , theo tổng
doanh số, theo vị trí hoặc theo b ấ t kỳ tiêu chí m à b ạ n chọn xác định. Do đó
để làm cho dễ n h ậ n dạng m ột record cụ th ể, cần p h ải th ê m m ộ t thuộc tín h
n h ận d ạn g duy n h ấ t vào mỗi record chẳng h ạn như m ột số serial hoặc m ã
trìn h tự. T rong ví dụ trước, mỗi record được n h ậ n d ạn g b àn g m ột trường
'record ID' duy n h ất; trường này ảược gọi là p rim ary key (khóa chính) clio
bảng.
ỊD
Yưíìr
Lĩcaiìơìi
Sales {ĩ)
2007 ỏdấỉĩiỉi
[
W fi
•y
8574
2007 Chicaco
ì
2007 Washincion
12929
Tị
2007 Ncw York
13636
5
2007 Lo*; Aiìícles
S748
6
2
M78
7
2008 Dallas
ì5240
Chicaei)
19433
s
9
2(m VVashinctỉ
3738
10
2008 Ncsv Yoric
(2373
11
2í)08 L«>.sAnkĩcles
12
2008 Ba^ion
4745
Hình 7.1 Một bảng mẫu
Thủ thuật
u.v
n-
u.v
n
ww
w.
lib
M ộ t cách dễ dàng đ ể hiểu những khái niệm này là bằng m ộ t sự tương dồng.
H ăy xem m ộ t c ơ sở dữ liệu như là m ột th ư viện và m ỗi bảng là m ột kệ sách bên
trong th ư viện này. D o đó m ột record là sự dại diện diện tử của m ột cuốn sách
trê n m ộ t kệ sách với tựa dề của cuốn sách là khóa chính của record. Nếu thiếu
tựã đề này, không th ể dễ dàng phân b iệ t m ột cuốn sách này với m ột cuô'n sách
khác. (Cách duy n h ấ t d ể làm điều nàỵ là m ở m ỗi cuô'n sách và kiểm tra nội
dung của nó - m ộ t tiế n trình mâ't thời gian mà khóa ch ín h sẽ giúp bạn tránh
.ha
ui.
ed
11
C h ư ơ n g 7: Làm v iệ c với các cơ sở dữ liệu và SQL
ed
được).
n-
ww
w.
lib
.ha
ui.
M ột khi bạn đã đưa thông tin vào m ột bảng, bạn thường muốn sử dụng
aó để tr ả lời các câu hỏi cụ th ể ■ví dụ, bao nhiêu vỊ trí có doanh số lớn hơn
$5000 tro n g 2008? N hững câu hỏi này được gọi là các query (mẫu truy vấn)
và k ế t quả được tr ả về bởi cơ sở dữ liệu nhằm phản hồi lại những query này
được gọi là các tậ p hợp k ế t quả (result set). Các query được thực th i sử dụng
Structured Query Language.
u.v
Tìm hiểu các m ối quan hệ và khóa ngoại (Poreign Key)
-w
ww
.lib
.ha
ui.
ed
Bạn đã b iết rằ n g m ột cơ sở dữ liệu có th ể chứa nhiều bảng. Trong m ột hệ
thơ ng cơ sở dữ liệu quan hệ, những bảng này có th ể được liên k ết với nhau
bằng m ột hoặc nhiều trường chung được gọi là các khóa ngoại (foreign key).
N hững kh ó a ngoại này làm cho có th ể tạo các mơ’i quan hệ m ột đô'i một
(one-to-one) hoặc m ột đối nhiều (one-to-many) giữa các bảng k hác nhau và
k ế t hợp dữ liệu từ nhiều b ản g để tạo các tậ p hợp k ế t quả to àn diện hơn.
G a it t lD
ed
u.v
n
Để m inh họa, h ãy xem xét hình 7.2 trìn h bày ba b ản g được liên kết.
.ha
ui.
1 H t
2 Crim c
Roni;mcc
AitỉhorỉD
1
2
3
AufỊiorS
.Sieplicn K ìiìk
Uamelk* Srccle
lX'nnỉs Lcliano
-w
ww
.lib
4 MK'hael C onnellv
> N ora Rohcrts
ww
w
.lib
.ha
ui.
ed
u.v
n
BnoklD
BookNahie
j T h c S h io iiự
2 ShuUer ĩslíìnd
Piỉỉ SeoiaUưy
4 Tha Overlook
5 Sisters
6 Safc HnrKnír
T a n ik Musk*
8 Blood Bix)thers
G e tu rỉí) AuỉhorlD
i
ì
ì
3
l
1
3
l
4
*J
3
1
3
2
4
5
Hình 7.2 Các mơi quan hệ bảng
u.v
n
C h ư d n g 7: Làm việc v ò i các c d sò dữ liệu và SQL
ed
12
u.v
n-
ww
w.
lib
.ha
ui.
H ình 7.2 m in h h ọ a ba bảng, chứa thông tin về các tá c giả (bảng A), các
th ể loại (bảng G), và các sách (bảng B). Các b ản g G và B k h á đơn giản:
chúng chứa m ột d an h sách các tê n th ể loại (genre) và tá c giả, với mỗi
record được n h ậ n dạng bằng m ột khóa chính duy n h ấ t. Bỗng B hơi phức
tạp hơn: mọi sách tro n g bảng được liên k ế t với m ộ t th ể loại cụ th ể bằng
khóa chính của genre (từ bảng G) và với m ột tác g iả cụ th ể qua khóa chính
của author (từ b ản g A).
ww
w.
lib
.ha
ui.
ed
B ăng cách dị th eo những khóa này đi đến các b ản g nguồn tuơng ứng caa
chúng, b ạn có th ể dễ d àn g n h ậ n dạng tác giả và th ể loại cho m ộ t cuốn sách
cụ thể. Ví du, cú th ể tliây vằng tựa đề "The Shin.ing" được v iết bởi "Stephon
ĩliiig" và thuộc về th ể loại "HoiTOr". Tương tự, b ắ t đầu từ dầu k ia có t}iể
th ấ y rằ n g tác giả "M ichael Connelly" đã viết hai cuôn sách "The Overlook'
và "Trunk Music".
ed
u.v
n
-w
ww
.lib
.ha
ui.
ed
u.v
n-
N hững mố.l quaii hệ n(iư vậy được thấy trong ỉiình 7.2 tạo nen néii tản g
của m ột hệ th ố n g cơ sd dử liệu quan hệ. Liẻn k ế t các bảng sử dụng các khóa
ngoại cũng hiệu quả hơn lựa chọn khác: trong k h i tạ o m ột b ản g mọi thứ
ngoại trừ bồn rửa n h à bếp để chứa tấ t cả thơng tin th o ạ t n h ìn trơ n g tiện
lợi, cập n h ậ t m ột b ản g như vậy luôn là m ột tiến tr ìn h th ủ cóng (và dễ sai
sót) để tìm mọi trường hợp của m ột giá trị cụ th ể và th a y th ế nó b ằn g m ột
giá trị mới. P h â n ch ia th ông tin th à n h các b ản g độc lập và liên k ế t những
bảng n ày b ằn g các k h ó a ngoại sẽ bảo đám rằn g m ộ t m ẫu th ô n g tin cụ th ể
xuất h iện m ột lầ n và chỉ m ột lần trong cơ sở dữ liệu; điều này loại bỏ những
p hần dư thừa, đơn giản hóa các th ay đổi (bằng việc cục bộ h ó a chúng sang
m ột vị trí) và làm cho cơ sơ dữ liệu gọn hơn và dễ q u ản lý hơn.
ww
w
.lib
.ha
ui.
ed
u.v
n
-w
ww
.lib
.ha
ui.
Tiến trìn h hợp lý hóa m ột cơ sd dữ liệu b ằn g việc d in h n g h ĩa và thực thi
các môi quan hệ m ột đôi m ột và m ột đôi nhiều giữa các b ản g th à n h phần
của nó được gọi là sự chuẩn hóa cơ sớ dữ liẹu (d atab ase norm alization) và
nó là m ột tá c vụ ch ín h m à m ột kỹ sư cơ sở dữ liệu p h ả i đối m ậ t k h i tạo m ột
cơ sd dữ liệu mới. T rong tiế n trìn h chuẩn hóa, kỹ sư cơ sở dữ liệu cũng n hận
dạng các mô'i quan hệ chéo và những sự phụ thuộc k hông chính xác giữa các
bảng và tối ưu hóa việc tổ chức dữ liệu sao cho các query SQL thực thi với
hiệu su ất tối đa. Cũng có m ột sơ" dạng chuẩn giúp b ạn te s t p h ạm vi m ột cơ
sở dữ liệu được chuẩn hóa; những dạng chuẩn n ày cung cấp nhữ ng hướng
dẫn hữu dụng để giúp bảo đảm việc th iế t k ế cơ sở dữ liệu vừa n h ấ t quán về
cấu trúc vừa hiệu quả.