Tải bản đầy đủ (.pdf) (152 trang)

Kỹ thuật và thủ thuật lập trình hướng đối tượng PHP tập 2 phần 1 nguyễn minh, lương phúc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.54 MB, 152 trang )

Th.S: NGUYỄN MINH - LƯƠNG PHÚC
và nhóm tin học thự c dụng

Kỹ thuật và thủ thuật
lập trình hướng đốì tưỢng
P

H

P

Khái niệm, kỹ thuật và viết mã
♦ T rọii bộ 2 tậ p hạn sẽ có cơ hội cọ x á t đ ẻ n ân g cao Icỹ
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

♦ 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

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

^ Mỗi chương cồn có n h iề u b à i tậ p tliụ c liảiứá n ià b ạn
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ư

NHÀ XƯẤT BẢN HỒNG ĐỨC



I v ờ l NÓI ĐẦU
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 .
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.
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
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 .
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ả



C h ư ơ n g 7: Làm v iệ c vớ i các cơ sỏ dữ liệu và S Q L

PHẨN 2
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


8


C h ư ớ n g 7: Làm v iệ c v ớ i các cơ sỏ dữ liêu và SQL

......................................................................

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



Ể! Hoc nbiÌỲìg kbái niệm cơ sở d ữ liộn I'à Stnicliired Qiierỵ Langỉiage


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

M Tniy tìm các record cơ sứ d ũ liệu iĩới PHP
• ỉỉ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
» 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


ộ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ả.


C h ư ơ n g 7 : Làm v iệ c với các c ơ s ỏ dữ liệu và SQL

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

Giới ỉh iệu các cơ sở dữ liệu và SQL
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.
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


10

C h ư ơ n g 7: Làm việc với các cờ s ở dữ liệu v à SQL

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.

Tìm hiểu các cớ sỏ dữ liệu, record, v à khóa chính (Prím a ry Key)

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.
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.
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
2M78
7
2008 Dallas
ì5240
s
Chicaei)
19433
9
2(m VVashinctoíỉ
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



11

C h ư ơ n g 7: Làm v iệ c với các cơ sở dữ liệu và SQL

Thủ thuật
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

được).
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.

Tìm hiểu các m ối quan hệ và khóa ngoại (Poreign Key)
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.
Để 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.
G a it t lD

1 H oítoí
2 Crim c
Roni;mcc

AitỉhorỉD
1
2
3

AufỊiorS.Sieplicn K ìiìk
Uamelk* Srccle
lX'nnỉs Lcliano

4 MK'hael C onnellv
> N ora Rohcrts

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


12

C h ư d n g 7: Làm việc v ò i các c d sò dữ liệu và SQL

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).
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".
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.
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ả.


C h ư d n g 7 : Làm v iệ c v ớ i c á c c o s ò dữ liệu và SQ L_____________________________1 3

Tìm hiểu các câu lệnh SQL
S tructured Query Language hoặc SQL là ngôn ngữ chuẩn được sử dụng
để giao tiếp với m ộ t cơ sở dữ liệu, th êm hoặc th a y đổi các record và các đặc
quyền người dùng và thực th i các query. Ngôn ngữ n ày trỏ th à n h m ột chuẩn
ANSI vào n àm 1989 và h iện được sử dụng bởi hầu n h ư t ấ t cả RDBM thương
m ại ngày nay.
Các câu lệ n h SQL bao gồm m ột trong ba h ạn g mục:

• Data DeýìniHon Language (DDL). DDL gồm nhũng câu lệnh định
nghĩa cấu tníc và những mối quan hệ của một cơ sở dĩỉ Ỉiệỉi và các bảng
của nó. Nhũng căn ỉệnh này tbĩCờng được sứ dụng đ ể tạo, xóa và chỉnh
sửa các cơ sở d ữ liệu và bảng; xác định các tên và loại tníờngi và xác
lập các index.
K D ata M aniupulation Language (DML) . Các căn lệnh DML liên quan
đến việc thav đổi và trích X i i ấ t d ũ liệu từ một cơ sở d ữ liệu. Những câu
lệnh này điíợc sứ dụng đ ể thêm các record vào và xóa các record ra
khỏi m ột cơ sỗ d ữ liệu; thực thi các query, tniv tìm các record bảng khớp
ifớí một hoặc nhiều tiêu cbí do ngtcời dùng xác định; và nối các bảng lại
I)ới nhan sứ dụng các tníờng chung của chứng.

It Data Controỉ Language (DCL). Các căn lệnh DCL điiợc sử dụng để
định nghĩa các cấp tniy cập và các đăc quyền an ninh trong một cơ sở
d ứ liệu. B ạn thĩCờng 5ÍỈ’dụng nhũng cân lệnh nàv đ ể cho phép hoặc từ
chối các đặc quyền ngtíời dùng; phãn công các I>ai trò; thay đổi các

passỉiorđ- x e m các qtiyền (permission); í>à tạ o c á c tậ p b ợ p q u v tắ c (n ú o se t)

đ ề bảo vệ việc tniy cập d ữ liộu.
Các lệnh SQL giống như tiếng Anh nói, n h ằm lầm cho ngôn ngữ dễ học
hơn. Cú pháp cũng k h á trực giác: Mọi câu lện h SQL b ắ t đẩu với m ột "từ
h à n h động ' n h ư DELETE, INSERT, ALTER, hoặc DESCRIBE và k ẽ t thúc
bằng m ột dấu chấm phẩy. K hoảng trắn g , các tab và các ký tự trở về đầu
đòng được bỏ qua. Sau đây là m ột vài ví dụ về những câu lện h SQL hợp lệ:
CREATE DATABASE library ;
SELECT movie FROM movies WHERE rating > 4;
DELETE FROM cars WHERE year_of_manufacture < 1980;

B ảng 7.1 liệ t kê cú p h áp cho m ột sô' câu lệnh SQL phổ biến với các giải
thích.


14

C h ư d n g 7: Làm v iệ c với c á c c ơ sở dữ liệu v à SQL
Bảng 7.1 Các câu lệnh SQL thống thường

C â u lệ n h SQ L

C hức n ă n g

CREATE DATABASE
database-nam e

Tạo một cơ sở dữ liệu mới


CREATE TABLE table-name
(fieldl, field2, ...)

Tạo một bảng mới

INSERT INTO table-name
(lìeldl, rield2,„) VALUES
(valuel, vali:e2,...)

Chèn một record mới vào một bảiig c6 cát;
giá trị được xác định

UPDATE table-nam e SET
íie ld l= v a lje l, fíeld2-value2,..
(WHERE condition)

CỊp n h ật các record trong một bảng có cac
giá trị mới

DELETE FROM tabỉe-name
{VVHERE conaitionl

Xóa các record ra khỏi một bảng

SELECT fỉeldl, íieM2,..
FROM table-name iWHERE
conditionJ

Truy tìm các record tương họ‘ĩ) iừ một bảag


RENAME tabỉe-name TO
new-table-name

Đổi tên một bảng

DROP TABLE table-name

Xóa một bảng

DROP DATABASE
database-nam e

Xéa một cơ sở dữ liệu

Hỏí chuyên gia
Hỏi: S Q L đ ư ợ c h ỗ trỢ rộ n g nh ư th ế nào?
Đ á p ; SQL v ừ a ỉồ n ộ t c h u ẩ n A N S l vừa là c h u ẩ n IS O , v à d ư ợ c h õ trợ rộng
rã i b ỏ i c á c h ệ th ố n g c ơ s ỏ dữ liệu S Q L tư ơ n g th ích c á c c h u ẩ n . N oi nh ư
v ậ y , n h iề u n h à c u n g cấ p c ơ s ờ a ữ liệu c ũ n g đ ã tn ở rộ n g S Q L "c h u ẩ n "
b ằ n g c á c e x te n s io n đ ộ c q u yền d ể m a n g đ ế n c h o c á c k h á c h h à n g m ộ t
lậ p h ợ p tín h n ă n g cải tiế n h o ặ c h iệ u s u ấ t tố t h ơ n . N h ữ n g e x te n s io n n à y
k h á c n h a u g iữ a c á c n h à cu n g cấ p v à c á c câ u lệ n h S Q L s ử d ụ n g nhữ ng
e x te n s io n n à y c ó th ể kh ô ng làm v iệ c th e o c ù n g m ộ t c á c h trẽ n tấ t c ả hệ
th ố n g c ơ s ỏ d ữ liệu, Do đó, sẽ lu ô n khôn n g o a n n ế u th a m k h ả o tà i liệu
c ủ a hệ th ố n g c ơ s ở dữ liệu và tìm h iể u c á c e x te n s io n đ ộ c q u y ể n n à o
n ế u c ó m à n ó c u n g c ấ p và xe m c á c e x te n s io n n à y ả n h h ư ở n g đ ế n
n h ữ n g c â u lệ n h S Q L m à bạn v iế t nh ư th ế n à o.

Thực hành 7.1: Tạo và tập hợp lại m ột cơ sở dữ liệu
Bây giờ k h i b ạn đă hiểu những điểm cơ bản, h ãy th ử m ộ t bài tậ p thực

h àn h giúp b ạn làm quen với việc sử dụng cơ sở dữ liệu và SQL. T rong phần


C h ư d n g 7 : Làm v iệ c vcii các cơ sò dữ liệu và SQL____________________________15

này b ạn sẽ sử dụng C lient dòng lện h MySQL tương tá c đ ể tạo m ộ t cơ sở dữ
liệu và các bảng, th êm và b iên tậ p các record và tạo các tậ p hợp k ế t quả
khớp với những tiêu chí khác nhau.
-------------------------------------------------------------------------------------

Qua suốt bài tập sau đây, chữ in đậm biểu íhị các lệnh mà bạn nên
gõ nhập tại dòng nhắc dồng lệnh MySQL. Các lệnh có thể được
nhập bằng hoặc chữ hoa hoặc chữ thường. Trước khi bắt đầu vổi
bài tập, hãy chắc chắn rằng bạn đã cài đặt, câu hình và test hệ
thống cơ sở dữ liệu MySQL theo những hướng dẫn trong những
phụ lục của sách này.
B ắt đầu b ằn g việc khởi động Client dòng lện h MySQL và k ế t nôi với cơ
sở dữ liệu MySQL bằng usernam e và password:
shell> m ysql -u user -panel

Passvvord: ****■•*
Nếu mọi th ứ đều diễn ra tố t đẹp, b ạn sẽ th ấy m ột th ô n g báo chào đón và
m ột dòng nhắc SQL tương tác n h ư sau:
mysql >

Bây giờ b ạn có th ể tiế n h à n h n h ập các câu lện h SQL tạ i dòng nhắc này.
N hững câu lệ n h n ày sẽ dược chuyển san g và được thực th i tr ê n server
MySQL và k ế t quả sẽ được h iển th ị trê n các dòng sau dòng nhắc. N hớ k ết
thúc mồi câu lệ n h b ằn g m ột dấu chấm phẩy.
Tao

• cơ sở dữ liêu

Vì t ấ t cả b ản g được lưu trữ tro n g m ột cơ sở dữ liệu, bước đầu tiê n là tạo
m ột cơ sở dữ liệu, sử dụng câu lện h CREATE DATABASE:
mysql> CREATE DATABASE m usic;
Query OK, 1 row affected (0, 05 sec)

Tiếp theo, chọn cơ sở đữ liệu mới tạo này làm cơ sở dữ liệu m ặc định cho
t ấ t cả lệ n h tương lai bằng câu lện h USE:
mysql> USE m usic;
Database changeđ

Thêm các bảng
M ột k h i b ạn đã khởi tạo cơ sở dữ liệu, đã đến lúc th êm m ộ t sô' bảng vào
nó. L ệnh SQL để thực h iệ n điều này là câu lệnh CREATE TABLE, câu lệnh


16___________________________ C h ư d n g 7: Làm v iệ c vớỉ các c d s ò dữ liệu và SQL

này đòi hỏi m ộ t tê n b ản g và m ột mô tả chi tiế t về các trư ờ ng của bạn. Sau
đây là m ột ví dụ:
m ysql> CREATE TABLE a rtists (
-> a r tis L id INT(4) NOT NULL PRIMARY KEY AUTO.INCREMENT,
•> a rtis L n a m e VARCHAR (50) NOT NULL,
-> a rtis L c ũ u n tĩV CHAR (2) NOT NULL

-> ):
Ouery OK, 0 rows affected (0.Ư7 sec)

Cău lện h n ày tạo m ột b ản g có tê n là a rtis ts có ba trư ờ ng a rtis t.id ,

artist_nam e, và artist_country. Chú ý rằn g theo sau mỗi tê n trường là một
ph ần k h ai báo kiểu (type declaration); p h ần khai báo n ày n h ậ n dạng kiểu
dữ liệu ntà tiư ò n g sẽ chứa chũ dù là striiig (chuỗi), num eiic (số), tem poral
(thớỊ giaiu, hoặc Booleai'-.. MySQL hỗ trợ m ột 30' kíểi. dữ liệu k hác nhau và
các kiểu dữ liệu quan trọiig nhấc được tóm tá t iro n g b ản g 7.2Có th êm m ột vài ràn g buộc (modifier) được xác lập cho b ản g tro n g câu
lệnh trước:
# Modiỷier NOTNỤLL bảo đảm rằng tníờng không th ể chấp nhận một giá
írị NULL sau mỗi định nghĩa tncờng.
K Modiýier PRIMARY KEY đánh dấu tníờng tương icng là khóa chinh (pritnary key) của bảng.
!ẵ ModiJỉerAUTO_INCREMENT, chỉcósãnchocáctníờngsố, vêỉtcẩuMySQL
tự động tạo một giá trị cho mcờng n à y mòi lần một record mới đĩcợc
chèn i>ào bảng, tdinggiá trị tntòc lên 1.
Bằng 7.2 Các kiểu dữ liệu MySQL

K iểu trư ờ n g

Mô tả

INT

Một kiểu SỐ có th ể chấp nhận các giá trị
trong dăy -2147483648 đến 2147483647

DECIMAL

Một kiểu số có hỗ trợ các sô' dấu động và số
thập phân

DATE


Một trường ngày th á n g th eo đinh dang
YỸYY-MM-DD

TIME

M ột trư ờ n g th ờ i g ia n th e o đ in h d an g
HH:MM:SS

DATETIME

Một kiểu ngày tháng/thời gian k ết hơp theo
dịnh dạng YYYY-MM-DD HH:MM:SS


C h ư ớ n g 7: Làm việc với các c o sõ dữ liệu và SQL____________________________ Ị_7

YEAR

Một trường cự thể cho năm hiển thị trong
dãy 1901 đến 2155 theo định dạng YYYY
hoặc Y Y

TIMESTAMP

Một kiểu tem thời gian theo định dạng
YỸYYMMDDHHMMSS

CHAR

Một kiểu chuỗi có kích cỡ tối đa 255 ký tự và

một chiều dài cố định

VARCHAR

Một kiểu chuỗi có kích cỡ tối da 255 ký tự và
một chiều dài khả biến.

TEXT

Một kiểu chuỗi có kích cờ tối da 65535 ký tự

BLOB

Một kiểu nhị phân cho dữ liệu biến.

ENUM

Một kiểu chuỗi có th ể châp nhận một giá trị
từ một danh sách các giá trị có thề có được
định nghĩa trước dó.

SET

Một kiểu chuỗi có th ể chấp nhận zero hoặc
nhiều giá trị từ một tập hợp giá trị có th ể có
được định nghĩa trước dó.

Bây giờ hãy tiến h à n h tạo thêm hai bảng sử dụng các câu lện h SQL này:
m ysql> CREATE TABLE ratings (
-> ra tin g _ id INT{2) NOT NULL PRIMARY KEY,

-> rating_nam e VARCHAR (50) NOT NULL

-> ):
Query OK, 0 rows atíected (0,13 sec)
m ysql> CREATE TABLE songs (
-> s o n g .id 1NT(4) NOT NULL PRIMARY KEY AUTO.INCREMENT,
-> so n g _title VARCHAR(IOO) NQT NULL,
-> lk _ s o n g _ a rtis í INT{4) NOT NULL,
-> lk_song_ratÌng 1NT(2) NOT NULL

■> ):
Query OK, 0 rows affected (0,05 sec)

Thêm các Record
T hêm m ột record vào m ột bảng chỉ đơn giản là gọi câu lện h INSERT với
nhữ ng giá trị th íc h hợp. Sau đây là m ột ví dụ, ví dụ n ày th ê m m ộ t record
vào bản g a rtis ts b ằn g việc xác định các giá trị cho các trường artist_ id và
a r tis tn a m e :


1 8 _____________________________C h ư ờ n g 7: Làm v iệ c v d i c á c c ờ s ò d ư liệ u v à S Q L
m ysql> INSERT INTO a rtists (a rtis t_ id , a rlis L n a m e , a rtis L c o u n try )
-> VALUES c r , 'Aerosmith', ‘US’);
Query OK, 1 row affected (0.00 sec)

Từ p h ần trước b ạn sẽ nhớ rằ n g trường artist_ id đã được đ án h dấu bằng
cờ (flag) AUTO_INCREMENT. Đây là m ột p h ần mô rộ n g MySQL cho SQL
chuẩn yêu cầu MySQL tự động g án m ột giá trị vào trường n ày nếu nó không
được xác định. Để th ấ y trực tiế p điều này, hãy th ử th êm m ột reeord mới 5 Ứ
dụng cáu lệ n h sau đây;

m ysql> INSERT INTO artists (artist..n3m e, artỉst_cQiintry>
> VALUES (‘Ahba’ , ‘SE’ );
Query OK, 1 row affented (O.GO sec)

Tương tự, th ẳ m m ột số rccord vàc bảng rEtings:
n y s q l> INSERT INTO ra tin gs ( r a tin g jd , ra tin g_n a m e ) VA1.UES (4, ‘Goort’ }Query OK, 1 row affected (0.00 sec)
m y s q b INSERT INTO ratings ( r a tin g jd , ra tin g _n a m e ) VALUES (5, ‘ExGelle n t'):
Query OK, 1 row affected (0.00 sec)

Thêm m ột số record vào b ản g songs:
mysq[> INSERT INTO songs (so n g_títle , fk _ s o n g „a rtis t, fk_so n g _ratin g )
-> VALUES (‘JanieVs Got A Gun’ , 1, 4);
Query OK, 1 row affecteđ (0.04 sec)
mysql> INSERT INTO songs (s o n g J ỉtle , fk _ s o n g _ a rtis t, !k _ s o n g ,ra tin q )
-> VALUES (‘Crazy’ , 1, 5);
Query OK, 1 row affected (0,00 sec)

Chú ý rằn g các record trong bảng songs được liên k ế t với các record trong
các bảng a rtis ts và ratings thông qua các khóa ngoại (foreign key). B ạn sẽ
th ây trực tiếp nhừ ng môi queưi hệ khóa ngoại n ày tro n g p h ần tiếp theo.
Q

iid a

________________________________________________________

Nguồn lưu trữ mã cho sách này có một danh sách đầy đỏ các câu
lệnh SQL INSERT để tập hỢp lại ba đoạn được sử dụng trong bài
tập này, Chạy các câu lệnh này và hoàn tất việc xây dựng các bảng
_______t r ự ^ khi_^ ^ 'n ^ á c phần tiếp theo.



C h ư ở n g 7 : L à m v iệ c với c á c cO s ò d ữ liệu và SQL_____________________________ 19

Thực thi các query
M ột k h i dữ liệu n ăm trong cơ sở dữ liệu, đã đến lúc làm m ột điều p đó
với nó. SQL cho phép b ạn tìm kiếm các record khớp với n h ữ n g tiêu chí cụ
th ể sử dụng câu lệ n h SELECT. Sau đây là một ví dụ, ví dụ n ày tr ả về tâ t cả
recorđ từ b ản g artists:
m ysql> SELECT a rtis t.id , a rtis L n a m e FROM artists;
artist_icJ

6

artist_nam e

1

Aerosmith

2

Abba

3

Timbaland

4


Take That

5

Girls Alouđ

6

Cubanismo

rows in set (0.00 sec)

T rong hầu h ế t các trường hợp, bạn sẽ muốn th êm các bộ lọc (filter) vào
query để giảm kích cỡ của tập hợp k ế t quả và bảo đảm rằ n g nó chứa chỉ các
record khớ p với những tiêu chí n h ấ t định. Điều này được h o àn t ấ t bằng việc
th êm m ột m ện h đề W HERE vào câu lệnh SELECT cùng với m ộ t hoặc nhiều
biểu thức có điều kiện. Sau đáy là m ột ví dụ, ví dụ này liệ t kê chỉ các nghệ
sĩ từ nước Mỹ:
m ysql> SELECT a r tis U d , artist_nam e FROM artists
-> WHERE a rtis L c o u n try = ‘US’ ;
artist_ld

artisLnam e

1

Aerosmith

3


Timbaland

2 rows in set (0.00 sec)

T ấ t cả to á n tử so sán h chuẩn m à bạn đã quen thuộc từ P H P được hỗ trợ
bởi SQL. Ví dụ trước m inh họa toán tử đảng thức (=); ví dụ tiế p th eo sau đây
m inh họa to á n tử lớn hơn hoặc bằng {>=) bằng việc liệ t kê t ấ t cả b ản nhạc
có ra tin g từ 4 trở lên:
m ysql> SELECT s o n g _title , fk_song_rating FROM songs
-> WHERE fk_song_rating >= 4;
song_titie

fk_son9_raíing

Janie’s Got A Gun

4


2 0 _____________________________C h ư ớ n g 7; Làm

việc v ớ i các c o s ò d ữ iiệ u v à S Q L

Crazy

5

En Las Delicious

5


Pray

4

Apologize

4

SOS

4

Dancing Queen

4

7 rows in set ^0.00 sec)

B ạn co th ể k ế i hợp những biểu thức có điều k iện sử dụng cấc to án tứ
logic AND, OR, vè MOT ín h ư v đ i câu lệnh có điếu k iện P K P thóiig thường).
Sau đây ià m ột ví dụ, ví
dụnãy liệ t kê các nghệ sì từ nước
Mỷ hoặc vương
quốc Anh:
mysql> SELECT artist_nam e, arti3t_ccuntry PRCIVI a rtists
>

VVHERE ă rtis t .CGuMry = ‘US


-> OR a rtis L c o u n try = UK’;
a rtisL n a m e artist_CDuntfy
Aerosm ith

us

Timbaland

us

■■■ake T h ít

UK

Girls Alũud

UK

4 rows in set (0.02 sec)

Sắp xếp th ứ tự và giới hạn các tập hợp kết quả
Nếu b ạn muô'n th ấ y dư liệu lừ một báng đuợc sáp xếp th ú tự theo một
trường cụ thể, SQL ổưr\ ra ĩnônh dề ORDER BY. M ệnh đề n à j chc bạr., địnli
nghĩa tê n trường để p h ân loại và hướng p h ân loại (tăn g d ần hoặc giảm
dần).
Ví dụ dể th â y m ột d an h sách ản g nhạc dược p h ân loại theo th ứ tự bảng
chữ cái, sử dụng câu lện h SQL sau đây:
mysqỉ> SELECT s o n g J ille FROM songs
-> ORDER BY s o n g J itle ;
song,Jiỉle

Another Crack In My Heart
Apologize
Babe


C h ư ớ n g 7 : L à m v iệ c v ổ i

các c d s ỏ d ũ liệu v à S Q L_____________________________21

Crazy
Dancing Queen
En Las Delicious
Gimme Gimme Gimme
Janie’s Got A Giin
Pray
SOS
Sure
Voijlez Vous
12 rows in set (0.04 sec)

Đ ể p h â n loại đảo ngược đ an h sách này, thêm m odiíĩer DESC như trong
ví dụ tiếp theo:
m ysql> SELECT so n g_title FROM songs
-> ORDER BY s o n g .title DESC;
s o n g J itle
s o n g Jỉtle
Sure
SOS
Pray
Jariie's Got A Gun

Gimme Qimme Gimme
En Las Delicious
Dancing Queen
Crazy
Babe
Apologize
Another Crack In My Heart
12 rows in seí (0,00 sec)

SQL cũng cho bạn giới h ạn bao nhiêu record x u ất h iện tro n g tậ p hợp k ết
quả bằng từ k h ó a LIM IT, từ k h óa này chấp n h ận h ai th a m sô': o íĩset record
để b ắ t đầu {bắt đầu với 0) và số record để hiển thị. Ví dụ, để h iển th ị các
hàng 4-9 của m ột tậ p hợp k ế t quả, sử dụng câu lện h sau dây:


2 2 ___________________________ C h ư ớ n g 7: Làm việc với các Cờ s ò dư liệu v à S QL
mysql> SELECT s o n g .titie FROM songs
-> ORDER BY s o n g J ille
-> LIM IT 3.6;
song_tit[e
Crazy
Dancing Cueen
En Las Deliciủus
Gimme Gimme Gimme
Janie's Got A Gun
Pray
5 rows in set {0.00 sec)

S ử dụng các ký lự đại diện (Wiỉdcard)
Câu lệnh SQL SELECT cũng hỗ trợ m ột m ệnh đề LIKE, m ệnh đề này có

th ể được sử dụng để tìm kiếm b ên trong các trường te x t sử dụng nhữ ng k j
tự đại diện (vvildcard). Cõ hai ioại vvildcard được cho phép trong m ột m ệnh
đề LIKE: ký tự % được sử dụng để báo hiệư zero hoậc nhiều trường hợp của
m ột ký tự và ký tự _ được sử đụng để báo hiệu chính xác m ột trường hợp của
m ột ký tự.
Ví dụ sau đây m in h họa tiếp m ột m ệnh dề LIKE, tìm kiếm các tự a đề
bản nhạc có ký tự 'g' tro n g đó:
mysql> SELECT s o n Q _ id , s o n g J itle FROM songs
-> WHERE s o n g _title LIKE ‘ % g% ’ ;
song,Jd

song ,title

1

Janie’s Got A Gun

7

Apologize

8

Gimme Glmme Gimme

10

Dancing Queen

4 rows in set (0.00 sec)


NỐì cấc bảng
Cho đến bây giờ, tấ t cá query m à b ạn đă th ấ y đã được tậ p tru n g một
bảng. N hưng SQL cũng cho phép b ạn truy vấn mỗi lần h ai hoặc nhiều bảng
và hiển th ị m ột tậ p hợp k ế t quả k ế t hợp. v ề m ặt kỹ th u ậ t, đây được gọi là


C h ư ớ n g 7: Lám v iệ c với các Cd sở dữ liệu v à SQL___________________________ ^

m ột join vì nó đòi hỏi "nối" các bảng khác nhaư tạ i các trường chung (các
khóa ngoại) để tạo các view mới của dữ liệu.
• • • • • • •

Thủ thuật
Khi nối các bảng, b á t đầu m ỗi tên trưèmg bằng tên của bảng mà nó thuộc về để
trá n h sự nhầm lẫn phòng hờ các trường trong các bảng khác nhau có cùng m ột
tên.

Sau đây là m ột ví dụ về việc nối các bảng songs và a rtis ts lại với nhau sử
dụng trường artist_ id chung (m ệnh đề WHERE được sử dụng để án h xạ các
trường chung sang với nhau).
mysql> SELECT song_id, s o n g J itle , a rtisL n a m e PROIVl songs, artists
-> WHERE s o n 9 S .fk _ s o n g _ a rtlst = a rtis ls .a rtis L id ;
song_id

so n gJitle

artist_nam e

1


Janie’s Got A Gun

Aerosmith

2

Crazy

Aerosmith

8

Gịmme Gimme Gimme

Abba

9

SOS

Abba

10

Dancing Queen

Abba

11


Voulez Vous

Abba

7

Apologize

Timbaland

4

Sure

Take That

5

Pray

Take That

6

Another Crack In My Heart

Take That

12


Babe

Take That

3

Ẽn U s Delicious

Cubanismo

12 rows in set (O.ũũ sec)

Và đây là m ột \-í dụ về việc nối cả b a bảng lại với nhau và saư đó lọc tập
hợp k ế t quả th ậm chí nhiều hơn nữa để bao hàm chỉ các b ản nhạc có m ột
ra tin g là 4 trở lên và có các nghệ sĩ không phái ở Mỹ;
mysql> SELECT s o n g _ tiile , arlist_nam e, rating_nam e
•> FROM songs, artists, ratings
-> WHERE songs,fk_song_artist = artists.a rỉist_id
-> AND songs.ík_song_rating = ra tin g s .ra ỉin g .id
-> AND ra tin g s .ra tin g _id >= 4


24

C h ư ơ n g 7: Làm v iệ c với c á c c ơ s ỏ d ữ íiê u v à S Q L
-> AND a rtis ts .a rtis L c o u n try != ‘US’ ;
song_title

artist_name


rating_name

En Las Delicious

Cubanismo

Excellent

Pray

Take That

Good

SOS

Abba

Good

Dancing Queen

Abba

Good

4 rows ỉn set (0.Ũ2 Sfic)

Chỉnh sửa và loại bỏ các Record

TươPg tự n h ư bạn INSERT các reccrd vào m ột bảng, bọn cũng cc th ể xóa
các record b ằn g câu lện h DELETE. Điển hình, b ạn thường chọn m ột tập
hợp con các h àn g cụ th ể cần xóa b ằn g việc thêm m ện h đề W HERE vào câu
lệnh DELETE như tro n g ví dụ tiếp theo, ví dụ này xóa tế t cả b ản nhạc c<^
m ột ratin g Iibỏ hơn hoặc bàng 3:
m ysql> DELETE FROM songs
-> WHERE fk_song_raỉỉng <= 3;
Query OK, 5 rows affected (0.02 sec)

Cũng có m ột câu lệnh UPDATE, câu lệnh này có th ể được sử dụng để
th a y đổi nội dung của m ột record; câu lệnh này cũng :h ấp n.hận m ột mệnh
đề W HERE để b ạn có th ể áp đụng những th ay đổi vào chỉ các record khớp
với những tiêu chí riên g biệt. Xem x ét ví dụ sau đây, ví dụ này th a y đổi
ratin g 'Excellent' th à n h T an tastic':
mysql> UPDATE ratings SET rating_nam e = T a n ta s tic ’
-> WHERE ía lin ịj_ n a m e = ‘Exceílent’ ;
ũuery OK, I fũw affected (0.00 sec)
Rows matched; 1 Changed: 1 VVarnings: ũ

B ạn có th ể th a y đổi nhiều trường bằng việc tách b iệt chúng b ằn g các dấu
phẩy. Sau dây là m ột ví dụ cập n h ậ t m ột record bản n hạc cụ th ể tro n g bảng
songs, th a y đổi cả tựa đề của nó và ratin g của nó:
mysql> UPDATE songs SET so n g_title = ‘VVaterloo’ ,
•> lk _ s o n g _ ra tỉn g = 5

-> WHERE s o n g J [ỉ = 9;
Ouery OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 VVarnings; ũ



C h ư đ n g 7: Làm v iệ c vớ i các c ơ sở dư liệu và S Q L

25

Hỏi chuyên gia
H ỏ i: T ô i đ a n g s ủ d ụ n g _____ cơ s ở d ữ liệu v à n ó k h ô n g h ỗ t r ợ ______ kiểu
trư ờ n g , T ô i p h ả i làm gì b â y giờ?
Đ á p : C á c c ơ s ỏ d ữ !iệu k h á c nhau c ó cú p h áp k h á c n h a u ch o c á c k iể u dữ
liệ u trư ờ n g . V i d ụ , M y S Q L gọi c á c trư ờn g s ố n g u y ê n là IN T, tro n g khi
S Q L ite g ọ i c á c trư ờ n g y nh ư th ế là IN T E G E R . T u y n h iê n , h ầ u như m ọi
c ơ s ở d ữ liệ u s ẽ hổ trợ - tố i th iể u - c á c kiểu d ữ liệ u c h o nhữ ng g iá trị số
n g u y ê n (in te g e r), g iá trị d ấ u đ ộ ng (flo a d in g *p o in t), g iá trị c h u ỗ i (s trin g ),
g iá trị nhị p h â n (b in a ry ) v à g iá trị N U LL, T ấ t c ả n h ữ n g gl bạn cầ n làm là
d ò tìm tà i liệ u c ơ s ở d ữ liệ u và xác định cú p h á p đ ể s ử d ụ n g c h ín h xác
nh ữ n g k iể u đ ữ liệ u đ ó tro n g c á c câu lệ n h S Q L .
H ỏ i: T ạ i sa o tô i cẩ n liệ t kê tấ t cả trư ờn g b ắ t b u ộ c tro n g câ u lệ n h S E L E C T ?
T ó i k h ô n g th ể s ử d ụ n g ký tự đại d iệ n * để n h ận đ ư ợ c trỏ lại tấ t c ả trư ờn g
c ó sẳn p h ả i k h ò n g ?
Đ á p : T ro n g k h i S Q L h ỗ trợ ký tự đại d iệ n dấu s a o (*) đ ể đ ạ i d iệ n ch o “tất
c ả trư ờ n g tro n g m ộ t b ả n g “ , ưu tiê n luôn đ ặ t tê n cụ th ể c á c trư ở n g mà
bạ n m u ố n th ấ y tro n g tậ p h ợ p kết q u ả . Đ iể u n à y c h o p h é p ứ n g d ụ ng
s ố n g s ó t sa ư n h ữ n g th a y đ ổ i cấu trú c tro n g b ả n g củ a nó và th ư ờ n g c ũ n g
c ó h iệ u q u ả h ơ n v ề k h ía cạ n h bộ nhớ bởi vì tậ p h ợ p k ế t q u ả sẽ kh ô ng
ch ứ a d ữ liệ u k h ô n g m o n g m u ố n h o ặ c d ữ liệ u k h ô n g liê n q u an .

Sử dụng Extension MySQL của PHP
N hư được giải th íc h trước đó, PH P cho phép các n h à p h á t triể n tương tác
với những cơ sd dữ liệu băng hai cách: bằng việc sử dụng m ột extensioii
riêng b iệt của cơ sở dữ liệu được tùy biến hoặc b ằn g việc sử dụng extension
PH P D ata O bjects (PDO) tru n g hòa với cơ sở dữ liệu. Trong khi extension

PDO có tín h k h ả chuyển (portable) hơn, nhiều n h à p h á t triển v ẫn th ấy sử
dụng extension cơ sở dữ liệu riêng thì ưu tiên hơn đặc b iệ t khi extension
riêng có hiêu su ấ t tố t hơn hoặc nhiều tín h n ăn g hơn phiên b ản PDO.
Trong số nhữ ng bộ m áy cơ sở dữ liệu khác nhau được hỗ trợ bởi PH P, cho
đèíi băy giờ bộ m áy cơ sở dữ liệu thông đụng n h ấ t la MySQL. Kliông khó
hiểu tạ i sao: C ả P H P và MySQL đều là những dự á n nguồn mở v à bằng việc
sử dụng chúng cùng với nhau, các n h à p h á t triể n có th ể có lợi từ những
khoảng tiế t kiệm lớn về chi phí bản quyền của những lựa chọn m ang tín h
thương m ại. Trước đây P H P cũng đã hỗ trợ từ bên ngoài cho MySQL kể từ
PH P 3 và chỉ hợp lý k h i tậ n dụng lượng suy nghĩ đ án g kể m à các n h à p h át
triển P H P và M ySQL đã đ ặ t vào việc bảo đảm rằ n g h a i gói (package) làm
việc cùng với n h au m ộ t cách thông suốt và trơn tru.


2 6 ____________________________C h ư d n g 7; Làm việc với các cờ sỏ dữ liệu và SQL

N goài việc hỗ trợ MySQL thông qua extension P H P D ata O bjects (được
th ả o lu ận tro n g p h ầ n tiếp theo), PH P cũng có m ột extension MySQL tùy ý
có tê n là MySQL Im proved (MySQL) m ang lại những lợi ích về tốc độ và
tín h n ăn g so với p h iê n b ản PDO và là m ột lựa chọn tô't cho các dự á n p h át
tr iể n d àn h riê n g cho MySQL- Các p h ần tiếp theo th ảo luận chi tiế t hơn
extension này.
Truy tìm dữ íiệu
T rong p h ần trước b ạ n tạo m ột bảng cơ sở dữ liệu và đã sử dụng một
query SELECT để tru y tìm m ột tập hợp k ế t quả từ nó. Bây giờ h ãy làm
tươnẹ tií aử dung P H P tro n g script sa.u đèy:
// attem pt database connection
SiTivsqli = 'ie w -■nysqii(‘ lo';alnost", 'us^ỉr”, ‘pass’ , '
it ($m ysqii ==:= falS8) I

die('‘ERROR: Could not connect. " , m ysqíi_connect_error());

1
/ / attem pt query execiition
// ilerate over resuỉt set
// p rin t each record and its tields
/ / output: “ 1:Aerosmith \n 2:Abba \n ..."
$sql = “ SELECT a rtis L id , aríisLnam e FROM artists";
if ($result = $m ysq)i->quefy($sql)) {
if ($resuỉt->nijm _rows > 0) I
whí!e($row = $result->fetch_array()) i
echo $ ro w [0] .

. $row [1] . "\n";

I
$result->close();
}

else

i

echo "No recorcls matching your query were íound,";

1
}

else


{

echo "ERROR: Couíd not execute $sql. “ . $mysqli->error,

}


27

C h ư ở n g 7: Làm việc với các cơ sô dữ liệu và SQL
// close connection
$mysqli->close();

?>
1

of: http://locâlho9t/php6-tM iok/€h07/M in9S/m )W Ịl“S*s^
Êite

’ Help

*

l ỉ A e c o s in itlì

z :A tĩb ã
3 ỉT iỉT ^ a le n d
4rT ak e T hat
S ỉ C i c l s X lo u d
6 :C ub8ini9ỉA ồ|


Kình 7.3 Truy tìm các record từ một cơ sở dữ liệu MySQL với PHP

H ình 7.3 m in h họa k ế t quả của script này.
N hư bạn có th ể th ấy sử dụng P H P để nhận dữ liệu từ cơ sở dữ liệu đòi hỏi
m ột sô' bước được mô tả ở đây:
1. Để b ắ t đầu giao tiế p với server cơ sở dữ liệu MySQL, trước tiê n b ạn
cần mở m ộ t nô'i k ế t với server. T ất cả sự giao tiếp giữa P H P và
server cơ sở dữ liệu xảy ra qua nối kết này.
Để khởi tạo nô'i k ế t này, khởi tạo m ột instance của class MySQL và
chuyển đến phương thức tạo đối tượng bôn đối số: tê n h o st của serv er
MySQĨ. để k ấ t nối, m ột usernam e và password hợp lệ để tru y cập nó
vào tê n cơ sở dữ liệu để sử dụng.
Giả sử nỗ lực k ết nối th à n h công, instance (tối tượng n ày tượng trư ng
cho nôl k ế t cơ sd dữ liệu cho tấ t cả hoạt động tương lai và phơi bày
những phương thức đê' truy vấn, truy Um và xử lý các tậ p hợp k ết
quả. Nếu nỗ lực k ế t nối không th à n h còng, in stan ce đối tượng sẽ trở
th à n h false; m ột th ông báo lỗi giải thích lý do th ấ t bai b ây giờ có th ể
nhận được bằng việc gọi hàm mysqli_connect._error ().
• • • • • • •

Thủ thuật
Nếu server c ơ sờ dữ liệ u và W eb server đểu chạy trê n cùng m ộ t m áy v ậ t lý , bạn
có th ể sử dụng localhost làm tên servcr.

2. Bước tiếp th eo là tạo và thực th i query SQL. Điều n à y được thực h iện
bằng việc gọi phương thức queryO của đối tượng MySQLi và chuvển



×