PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
1
1
1
1
Dormitory204.B518:20
PM
April
7,
2006
àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâ
m
đếnviệctránhnhữnglỗi
thườnggặpkhisửdụngPHP.NgườiđọcphảibiếtcáccúphápcủaPHP,vànênbiết
côngdụngcủacáchà
m
trongPHP.
Mộttrongnhữngđiể
mm
ạnhnhấtcủaPHPvôtìnhtrởthành
m
ộttrongnhữngđiể
m
yếu
nhấtcủanó:t
d
ụ
ụ
ụ
ụ
ng
ng
ng
ng
.NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnra
rằng:sửdụngđúngPHP
PHP
PHP
PHP
c
c
c
c
ò
ò
ò
ò
n
n
n
n
kh
kh
kh
kh
ng
ng
ô
ô
ô
ô
n
n
n
n
ng
ng
ng
ng
ữ
ữ
ữ
ữ
kh
kh
kh
kh
á
á
á
á
c
c
c
c
d
d
ụ
ụ
ụ
ụ
ng
ng
ng
ng
printf()
printf()
printf()
printf()
kh
kh
kh
kh
ô
ô
ô
ô
ng
ng
ng
ng
th
th
th
th
theoýmuốn
M
M
M
M
ã
ã
ã
ã
l
l
l
l
ệ
ệ
ệ
ệ
nh
nh
nh
nh
(PHP)
<?
/*ThethreefacesofΠ*/
printf("Piis:%.2f\n<br>\n",M_PI);
printf("Piisalso:%.3f\n<br>\n",M_PI);
printf("Piisalso:%.4f\n<br>\n",M_PI);
?>
Ch
Ch
ộthà
m
1.
1.
1.
1.
Khi
Khi
Khi
Khi
n
n
n
n
à
à
à
à
o
o
o
o
print()
print()
print()
print()
th
th
th
th
n?
n?
Cáclậptrìnhviênthườngsửdụngprintf()trongkhichỉprint()làđủ.Xétthídụsau:
<?
$name='NguyenAnhKhoa';
$nghenghiep='Sinhvien';
$diachi='Phong204.B5–KTX–DHSPDongThap';
$email='';
printf("Tencuatuila:%s\n<br>\n
Hiendangla:%s,%s\n<br>\n
LienhevoitoiquaEmail:%s\n<br>\n",
$name,$nghenghiep,$diachi,$email);
?>
Hà
m
print()
print()
print()
print()
cóthểdùngthaychoprintf()nhưsau:
B
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
2
2
\n
<br>\n
\n
\n
\n
";
;
;
;
Khikhôngcầnđịnhdạngsửliệu,dùngprint()thaychoprintf()cónhữnglợiíchsau:
Thi
Thi
Thi
Thi
h
h
h
h
à
à
à
à
nh
nh
nh
nh
nhanh
nhanh
nhanh
nhanh
á
ng
ng
ng
ng
s
s
s
s
ủ
ủ
ủ
ủ
a:
a:
a:
a:
hãyxem,dùnghàmprintf()sẽlàmchongườiđọchơibịlẫnlộn
(tấtnhiêntrừkhihọcónềntảngC).Nóđòihỏikiếnthứcvềcúphápprintf()(thídụ,
%sthaychochuỗicòn%dlàsố)vàvềkiểubiến
2.
2.
2.
2.
D
D
D
D
ù
ù
ữ
ữ
ữ
ữ
li
li
li
li
ệ
ệ
ệ
ệ
u
u
u
u
tr
tr
tr
tr
ả
ả
ả
ả
v
v
v
v
ề
ề
m
m
m
m
Mộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhà
m
đế
m
dướiđây:
Khixuấtgiátrịdohà
m
trảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây:
Dùngtoántử.nhanhhơnviệcdùngprintf()
20.
20.
20.
20.
Á
Á
Á
Á
p
p
p
p
d
d
d
d
ụ
a
(semantics)
(semantics)
(semantics)
(semantics)
NhiềulậptrìnhviênsửdụngPHP
m
àkhôngbiếtđếnnhữngđiể
m
tinhtếcủangônngữ
này.Mộttrongnhữngđiể
m
đólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa
(semantics).
C
C
C
C
ú
ú
ú
ú
ph
ph
ph
ph
á
á
á
á
m
ộtngônngữlỏnglẻonhưPHP,bạncónhiềulựachọnđểviếtlệnh.Cácbiến
khôngcầncókiểuxácđịnh
Thídụsau
m
ởtậptinvàintừngdòng:
Thídụtrênsẽtạolỗi:
Warning:
Warning:
Warning:
Warning:
Supplied
Supplied
Supplied
Supplied
argument
argument
argument
argument
is
is
is
is
not
not
not
not
a
a
a
4.
4.
4.
<?
printf
printf
printf
printf
("%doccurrencesof%sfound.",
count($truyvan),$search_term);
?>
<?
print
print
print
print
count($truyvan).
"occurrencesof$search_termfound.";
?>
<?
$fp=@fopen('vanban.txt','r')
ordie('Khongthemofilevanban.txt');
while($line=@fgets("$fp",1024))//Loi{
print$line;
}
@fclose("$fp")//Loi
ordie('Khongthedongvanban.txt');
?>
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
C
C
ó
ó
ó
ó
th
th
th
th
ể
ể
ể
ể
tr
tr
tr
tr
á
á
á
á
nh
nh
nh
nh
vi
vi
vi
vi
sai
sai
ng
ng
ng
ng
ữ
ữ
ữ
ữ
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a?
a?
a?
a?
Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomize
yourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoretically
possibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđược
không?
Thídụtrêncủachúngtatạora
m
ộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncác
scriptđểthíchhợpvới
ầ
m
m
m
m
v
v
v
v
ự
ự
ự
ự
c:
c:
c:
c:
trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiến
cóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbản
về"tầmvực"dẫnđếnnhữnglỗisaitinhtếvàcảnhữnglỗilớn.
php.ini:
php.ini:
php.ini:
php.ini:
khiviếtmộtscriptchạyởnhiềumôitrườngkhácnhau,cầnbiếtrằng
khôngphảimọicấuhìnhPHPđềunhưnhau.Dođó,cầnthiếtnhữnglệnhkiểmtra
đểđảmbảoscriptcủabạnchạytốttrongcấuhìnhPHPcủangườikhác.
19.
19.
m
ngườiđọc
m
ệt
m
ỏi.Nóichung,lậptrìnhghi
chú(inlinedocumentation)được
m
ọingườikhẳngnhậnlàđiềutốt,nhưnghiế
m
khinótồntại.
Mộtvấnđềkháclàquánhiềughichú.Dùhiế
m
gặp,nhưngnólà
m
chocácđoạn
m
ãbị
cắtvụn,gâyrasựkhótheodõi.Dướiđâylà
m
ộtthídụ:
<?
//BatdaumaPHP
$age=18;//Gan18den$age
$age++;//Tang$agelen1donvi
//INradoantextthongbao:
print"Youarenow19,whichmeansyouhavebeen:";
print"\n<br>\n<br>\n";
//Vonglapforinratatcatuoitruocdo
for($idx=0;$idx<$age;$idx++){
1.
1.
1.
Bao
Bao
Bao
Bao
nhi
nhi
nhi
nhi
ê
ê
ê
ê
u
u
u
u
ghi
ghi
ghi
ghi
ch
ch
ch
ch
ú
ú
ú
Dùngmộtkiểughichúnhấtquán,/*
/*
/*
/*
*/
*/
*/
*/
hoặclà//
//
//
//
(tr
(tr
(tr
(tr
á
á
á
á
nh
nh
nh
nh
d
d
d
d
ù
ù
}
}
}else{
$randomAr=$elements;
}
$random_element=mt_rand(0,count($randomAr)-1);
return$randomAr[$random_element];
}
?>
18.
18.
18.
18.
Nhi
Nhi
Nhi
Nhi
ề
ề
ề
ề
u
u
u
u
bi
bi
bi
bi
ế
u
th
th
th
th
ờ
ờ
ờ
ờ
i
i
i
i
gian
gian
gian
gian
Cóvàingườibịá
m
ảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthể
viếtnhưthếnày:
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
5
5
ắt.Trong
haithídụtrên,thídụnàosúctíchhơn?Thídụnàolà
m
con
m
ắtdễchịuhơn?Dùngquánhiều
biếntạ
m
cóthểdẫnđến
m
ãchươngtrìnhkhóđọcvàkhôngsúctích.
1.
1.
1.
1.
L
L
L
L
ợ
ợ
ợ
ợ
i
i
i
i
đ
đ
đ
ù
ù
ù
ng
ng
ng
ng
bi
bi
bi
bi
ế
ế
ế
ế
n
n
n
n
t
t
t
t
ạ
ạ
ạ
ạ
m
m
m
á
á
á
á
c
c
c
c
lu
lu
lu
lu
ậ
ậ
ậ
ậ
t
t
t
t
chung
chung
chung
chung
c
c
c
c
ủ
ủ
i
i
i
i
Khiquyếtđịnhcódùngbiếntạ
m
hoặckhông,bạnnênsuynghĩvề2câuhỏi:
Bạncódùngbiếnđóítnhấthailần?
Tínhđọcđượccủa
m
ãcótăngđángkểkhông?
Nếuítnhất
m
ộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợp
cáchà
m
lại(nếucần).
17.
17.
17.
17.
Vi
Vi
Vi
Vi
ế
ế
ế
ế
t
h
à
à
à
à
m
m
m
m
c
c
c
c
ó
ó
ó
ó
s
s
s
s
ẵ
ẵ
ẵ
ẵ
n
n
n
n
Mộtsốnơiphổbiến
Class27K0A
–
DepartmentOfInformationTechnology
6
6
6
6
Dormitory204.B518:20
PM
April
7,
2006
Lạicó
m
ộtsốngườicốgắngviếtlạicáchà
m
PHPthôngdụngthayvìđihọcvềhà
m
đó
trongcáctàiliệuPHPcungcấp.
Cóítnhất2lídođểkhôngnênlà
m
điềunày.Thứnhất,vàtrênnhất,nólà
m
chonhững
ngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcả
m
thấycóquánhiềuhà
m
dưthừa.Họ
1.
Tr
Tr
Tr
Tr
á
á
á
á
nh
nh
nh
nh
vi
vi
vi
vi
ế
ế
ế
ế
t
t
t
t
l
l
l
l
ạ
m
c
c
c
c
ó
ó
ó
ó
s
s
s
s
ẵ
ẵ
ẵ
ẵ
n
n
n
n
Hãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên,
m
ộtlậptrình
viênkhôngthểtheokịpcáchà
m
củaPHPngayđược.Vàaicóthờigian
m
àtracứu.Tạisao
khôngviếtlạichokhoẻ?
ãnguồn
m
ởcủaPHP,bạncóthểtì
m
đượccác
hà
m
dongườidùngđịnhnghĩatrướckhinóđượcthê
m
vàoPHP(thídụnhưhà
m
tì
m
phầntử
khácnhaugiữahai
m
ảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlại
m
ã(Thisdoesn't
necessarilymeanthatyoushouldhavetocorrectthecode don'tunderstand)
16.
16.
16.
16.
Kh
Kh
Kh
Kh
ô
ô
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
server
server
server
server
v
v
v
v
à
à
à
à
client
client
client
client
Vàilậptrìnhviêncốkếtnốicảchươngtrìnhvớinhau,nghĩalàghépchung
m
API
API
API
Khimuốntáchbiệtphầnkhách-chủ,bạncóvàilựachọn.Mộtcáchlàviếtnhữnghà
m
hiểnthịnộidunglinhđộngvàđặtchúngđúngchỗtrongtrangweb.
Thídụdướiđâyminhhoạđiềunày:
index.php
index.php
index.php
index.php
-phầnkhách
returnstrlen($str);
}
?>
HTML
HTML
HTML
HTML
<
?phpinclude_once("site.lib");?>
<
html
>
<
head
>
<
title
>
7
7
7
Dormitory204.B518:20
PM
April
7,
2006
site.lib
site.lib
site.lib
site.lib
-phầnchủ
Nhưbạnthấytrongthídụtrên,táchbiệtkháchchủlà
m
tăngtínhdễđọctrongchương
trìnhcủabạn.Mộtlợiíchkháclà
m
ộtkhibạnđãcócáchà
m
APIhiểnthịnộidung,bạncóthể
đểchothiếtkếviênthamgiathayđổibốcục
m
àkhôngcầnsửa
m
ãchươngtrình.
1.1.
1.1.
1.1.
1.1.
a
a
h
h
h
h
à
à
à
à
m
m
m
m
API
API
API
API
Tươngđốisángsủa
Nhanh,hầunhưkhônglãngphíthờigian(overhead)
1.2.
1.2.
1.2.
1.2.
B
B
B
B
ấ
<
?phpprint_body();?
>
<
/td
>
<
/tr
>
<
/table
>
<
/body
>
<
/html
>
<?php
$dbh=mysql_connect("localhost","khoa","pass")
ordie(sprintf("KhongtheketnoidenMySQL[%s]:%s",
mysql_errno(),mysql_error()));
@mysql_select_db("MainSite")
ordie(sprintf("KhongthechonCSDL![%s]:%s",mysql_errno(),
mysql_error()));
$sth=@mysql_query("SELECT*FROMsite",$dbh)
ordie(sprintf("Khongthethuchientruyvan[%s]:%s",
mysql_errno(),mysql_error()));
$site_info=mysql_fetch_object($sth);
functionprint_header(){
7,
2006
Khôngsángsủavàdễdàngbằnghệthống
m
ẫu(templatesystem)
Cần
m
ộtítkiếnthứcPHPđểsửa
m
ẫu
2.
2.
2.
2.
H
H
H
H
ệ
ệ
ệ
ệ
th
th
th
th
ố
ố
ố
m
ẫu.Nghĩalà,có
m
ộtsố
đánhdấunộidungsauđódùngchươngtrìnhphântích,thaythếcácđánhdấuđóbằngthông
tincầnthiết.
Thídụ,bạncóthểtạo
m
ộttậptinnhưthếnày:
Sauđócóthểviếtchươngtrìnhphântáchtậptin,thaythếcácthôngtintrongdấucách
%%bằngcácthôngtinthíchhợp.
Ghichú:
m
ộtlớphỗtrợhệthốngkhuôn
m
ẫukhátốtlàlớpFastTemplate,cóở
www.thewebmasters.net
2.1.
2.1.
2.1.
2.1.
Ư
Ư
Ư
Ư
u
u
u
u
đ
h
ệ
ệ
ệ
ệ
th
th
th
th
ố
ố
ố
ố
ng
ng
ng
ng
khu
khu
khu
khu
ô
ô
ô
ô
n
n
n
n
m
c
đ
đ
đ
đ
i
i
i
i
ể
ể
ể
ể
m
m
m
m
Chậ
m
hơn,bạncầnphântáchtậptinkhuôn
m
ẫu,sauđóxuấtra
Việchiệnthựcphứctạphơn
15.
15.
15.
15.
D
D
u
u
u
u
tr
tr
tr
tr
ú
ú
ú
ú
c
c
c
c
l
l
l
l
ỗ
ỗ
ỗ
ỗ
i
i
i
i
th
th
Dùngcáccấutrúclỗithờicóthểlà
m
chậ
m
chươngtrìnhcủabạn,cũngnhưlà
m
chonó
trởnênkhóhiểu.Ngườiđọccácchươngtrìnhcủabạncóthểkhôngquenvớicáchà
m
lỗithời
củaPHP.Tuynhiên,khipháthiện
m
ộtđoạn
m
ãlạchậu,bạnđừngnghĩrằngcầnphảithaythế
nó.Chỉcầnchắcchắnrằngbạnsẽkhôngdùngnóchocácchươngtrìnhviếttrongtươnglai.
Mộtthídụvềcấutrúclỗithời,
m
ànhiềungườicóvẻcốnắ
m
lấy,làcúpháp
beginControlStructure
beginControlStructure
beginControlStructure
beginControlStructure
endControlStructure
>
<
tdwidth="25%">%%PAGE_LINKS%%</td
>
<
td>%%PAGE_CONTENT %%</td
>
<
/tr
>
<
/table
>
<
/body
>
<
/html
>
<?
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
9
9
9
m
tratàiliệukhibạncóýmuốn
m
ởrộngtínhnăngnàođócủaPHP.Theocáchnày,bạnsẽkhôngphảiviếtlạicáchà
m
cósẵn.
T
T
T
T
ổ
ổ
ổ
ổ
ng
ng
ng
ng
k
k
k
k
ế
ế
ế
ế
t
t
t
t
sai
sai
sai
sai
h
h
h
h
à
à
à
à
m
m
m
m
printf()
printf()
printf()
printf()
Á
Á
Á
Á
p
p
ĩ
ĩ
ĩ
ĩ
a
a
a
a
Thi
Thi
Thi
Thi
ế
ế
ế
ế
u
u
u
u
t
t
t
t
à
à
ngu
ngu
ngu
ngu
ồ
ồ
ồ
ồ
n
n
n
n
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
qu
qu
t
t
t
t
ạ
ạ
ạ
ạ
m
m
m
m
Vi
Vi
Vi
Vi
ế
ế
ế
ế
t
t
t
t
l
l
m
m
m
m
c
c
c
c
ó
ó
ó
ó
s
s
s
s
ẵ
ẵ
ẵ
ẵ
n
n
n
n
Kh
Kh
t
t
t
t
ph
ph
ph
ph
ầ
ầ
ầ
ầ
n
n
n
n
kh
kh
kh
kh
á
á
á
á
ch/ch
ch/ch
ch/ch
ch/ch
ủ
ủ
c
c
c
c
ấ
ấ
ấ
ấ
u
u
u
u
tr
tr
tr
tr
ú
ú
ú
ú
c
c
c
c
l
l
l
l
ỗ
ỗ
break;
}
}
?>
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
10
10
10
10
Dormitory204.B518:20
PM
April
7,
2006
PHẦN2–LỖINGHIÊMTRỌNG
n
th
th
th
th
ủ
ủ
ủ
ủ
c
c
c
c
á
á
á
á
c
c
c
c
quy
quy
quy
quy
ướ
ướ
ướ
ướ
c
m
ột
quyướcđặttêntồi.Tôiđãtiếpquảnnhiềudựán
m
àtrongđótôiphảibỏrarấtnhiềuthờigiờ
chỉđểhiểuchươngtrình,dolậptrìnhviênđặttêncácbiếnlà$fredvà$barneythaycho
$emailvà$name.Tôiđangđềcậpđến
m
ộtdựán
m
àngườilậptrìnhcũđãquyếtđịnhđưavào
toànbộ
chươngtrình
m
ộtkiểuđặttênkìlạ(aFlinstonesnamingtheme),khôngphảitôiđùa
đâu.
Cáchbạnđặttênbiếnvàhà
m
làtrungtâ
m
củaviệcxâydựng
m
ộtchươngtrìnhdễđọc.
Cónhiềulậptrìnhviênphạ
m
lỗikhiđặttênbiếnvàhà
mm
ànó:
quádàihoặcquángắn
khôngliênquanđếnngữcảnh
ế
ế
ế
ế
n
n
n
n
1.1.
1.1.
1.1.
1.1.
C
C
C
C
á
á
á
á
ch
ch
ch
ch
vi
vi
vi
vi
ế
ế
TrongPHP,tênbiếncócáchviếtphânbiệt,nghĩalà$uservà$Userlàhoàntoànkhác
nhau.Vàingườidùnglợidụngđiể
m
nàyđểđặtcácbiêncùngtênnhưngkháccáchviết.Đâylà
m
ộtthóiquentồitệ.Cáchviếtkhôngbaogiờnêndùngđểphânbiệtcácbiếnkhácnhau.Mỗi
tênbiến,trongcùngtầ
m
vực(scope),nêncólàtuyệtđốiduynhất.
1.2.
1.2.
1.2.
1.2.
T
T
T
T
ê
ê
ê
ê
n
n
n
n
qu
qu
qu
qu
á
T
T
ê
ê
ê
ê
n
n
n
n
qu
qu
qu
qu
á
á
á
á
d
d
d
d
à
à
à
à
i
i
i
i
ố
t
t
t
t
Dướiđâylànhữngthídụtốtvềtênbiến
$username='phanthanhkieu';
$password='bimat';
$teachers=array('Sadlon',
'Lane',
'Patterson',
'Perry',
'Sandler',
'Mendick',
'Zung');
foreach($teachersas$teacher);
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
11
11
11
11
Dormitory204.B518:20
PM
April
u
u
u
u
Dướiđâylànhữngthídụ(phóngđại)vềnhữngtênbiếntồi
$username_cua_csdl='SINHVIEN';
$guMbi='bimat';//forthe$password
$tentruocdo_cua_giaovien=array('Sadlon',
'Lane',
'Patterson',
'Perry',
'Sandler',
'Mendick',
'Zung');
foreach($tentruocdo_cua_giaovienas$TeaChER);
2.
2.
2.
2.
Đặ
Đặ
Đặ
Đặ
t
t
t
t
t
t
t
2.1.
2.1.
2.1.
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
độ
độ
độ
độ
ng
ng
ng
ng
t
t
t
t
ừ
ừ
ừ
ặcdùvẫnchuyểntảiđược
m
ụctiêucủahàm,nhưngnóngănngườitađọc
m
ộtcáchtrôichảy.
Hãysửdụngđộngtừ!
13.
13.
13.
13.
Kh
Kh
Kh
Kh
ô
ô
ô
ô
ng
ng
ng
ng
suy
suy
suy
suy
ngh
ngh
ngh
ngh
&
&
SQL
SQL
SQL
SQL
Sốcáchngườitatruycậpcơsởdữliệu(CSDL-database)vàlấykếtquảnhiềuđến
m
ức
thựcsựngạcnhiên.Nhữngthídụtôiđãgặpbaogồ
m
nhữngtổhợplệnhifvàvònglặpdo
while,cáccâugọinhiềulần,vàcáchà
m
sql_result()trongvòngfor.
Nhữngngườinàycó
nghĩ
họđanglà
m
gìkhông?
Việcviếtcác
m
ãtrật-hoặc-trúng(hit-or-misscode)chứngminhsựthiếutậptrung.
Nhữngcánhânđóxácđịnhnỗlựccủahọdùngđểhoànthànhcôngviệchơnlàđểhoànthành
đúng
côngviệc,kếtquảlàlà
m
chocácôngchủquăngthờigianvàtiềnbạcrađường.
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
vềCSDL
DùngsaiSQL:khônglấynhữngthứbạncần
DùngPHPđểsắpxếpkếtquả
1.
1.
1.
1.
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
sai
sai
sai
sai
c
c
c
c
á
á
}
do{
print"$mautin[0]:$mautin[1]\n<br>\n";
}while($mautin=sql_fetch_row($truyvan));
Ch
Ch
Ch
Ch
ú
ú
ú
ú
ý
ý
ý
ý
:
:
:
:
Ởtrên,vàcácthídụsaunữa,$truyvandiễntảhandlehoặcpointerđến
m
ộttập
kếtquảtruyvấn Nóicáchkhác,
m
ộttruyvấnđãđượcgửivà
m
ộttậpkếtquảđãđượctrảvề.
Cácthídụsẽnóivềvấnđềthaovớivớikếtquảtrảvề.
Có
m
tra
tra
tra
tra
tr
tr
tr
tr
ườ
ườ
ườ
ườ
ng
ng
ng
ng
h
h
h
h
ợ
ợ
ợ
ợ
p
p
p
p
kh
ấ
y:
y:
y:
y:
c
c
c
c
á
á
á
á
ch
ch
ch
ch
l
l
l
l
à
à
à
à
m
m
m
m
sai
T
ừ
ừ
ừ
ừ
b
b
b
b
ỏ
ỏ
ỏ
ỏ
v
v
v
v
ò
ò
ò
ò
ng
ng
ng
ng
l
l
l
l
ặ
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
13
13
13
13
Dormitory204.B518:20
PM
April
7,
2006
Tạisaovòngdo while
do while
do while
do while
bịcoinhưthôtục,xấuxa(nasty)?
Trongthídụtrên,chỉcó1lệnhinkếtquảtrongvònglặp.Hãytưởngtượng,nếu
có10lệnh,ngườiđọcmãphảitìmđiềukiệnwhile
sau
cáccâulệnhđó.Mộtcông
việcphiềntoái.
ĐiềukiệnWhilebắtđầucấutrúcthườngxuyênhơnlàkếtthúc.Mộtnhànghiên
cứusẽphảicẩnthậnhơnđểkhôngnhầmlẫnđiềukiệnwhile
cuối
vớiđiềukiện
th
ứ
ứ
ứ
ứ
g
g
g
g
ọ
ọ
ọ
ọ
n
n
n
n
g
g
g
g
à
à
à
à
ng
ng
ng
ng
v
sql_fetch_row()
sql_fetch_row()
sql_fetch_row()
sql_fetch_row()
nóirằng"
Tôi
tì
m
thấy
0dòngtrongtậpkếtquả.Điềunày
nghĩalà
có
0kếtquả
”(Ifoundnorowsintheresultset.Thismustmeanthat
therearenone.)
sql_num_rows()
sql_num_rows()
sql_num_rows()
sql_num_rows()
nóirằng“
Sốdòngtrongkếtquả
là
0
”(Thenumberofrowsin
theresultsetis0).
Nhưngđiềuđóthựcsựtạonênsựkhácbiệtnào?
Xétcùng
m
ộtsựsosánh,nhưngbâygiờlàtrongngữcảnhcủađiềukiệnifvàcủabiểu
thức,trongđoạnlệnhgiả(Pseudo-code):
}:
}:
olấy1dòngtrongtậpkếtquả
onếukếtquảrỗng,gáncho$mautingiátrịzero(0);0cógiátrịlogiclà
False,dođó!(0)
=
True;inthôngbáolỗi.
onếukhôngrỗng,lấydòngđầutiênvàgánnóvào$mautin;$mautin
khôngphảilàzerovàcógiátrịlàTrue.Dođó!(True)
=
False,vàtiếptục
vớicấutrúcdo while.
*
*
*
*
if((sql_num_rows($truyvan)<=
if((sql_num_rows($truyvan)<=
if((sql_num_rows($truyvan)<=
if((sql_num_rows($truyvan)<=
0)
0)
0)
0)
{
{
{
{
Print
Print
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
14
14
14
14
Dormitory204.B518:20
PM
April
7,
2006
1.4.
1.4.
1.4.
1.4.
Khi
Khi
Khi
Khi
m
m
m
m
à
à
à
à
kh
kh
ô
ô
ô
ô
ng
ng
ng
ng
h
h
h
h
ỗ
ỗ
ỗ
ỗ
tr
tr
tr
tr
ợ
ợ
ợ
ợ
sql_num _row()
sql_num _row()
sql_num _row()
sql_num _row()
ấ
ấ
y
y
y
y
k
k
k
k
ế
ế
ế
ế
t
t
t
t
qu
qu
qu
qu
ả
ả
ả
ả
:
:
:
:
á
á
ch
ch
ch
ch
c
c
c
c
ó
ó
ó
ó
í
í
í
í
ch
ch
ch
ch
Vấnđềthứhaitrongđoạn
m
ãnàylànódùngsql_fetch_row()đểlấytậpkếtquả.Hà
m
sql_fetch_row()
chỉ
trảvề
m
củanhàpháttriển,hà
m
nàocólợihơn?Mảngdùngchuỗigiúpchongười
đọchiểuđượcbạnđanglấycáigìchỉthôngquaviệcđọc
m
ã,nhưthídụđúngdướiđây:
<?php
if(sql_num_rows($truyvan)<=0){
print"Motloidaxayra:Khongcomautinnao!";
exit;
}
while($mautin=sql_fetch_array($truyvan)){
print"$mautin[name]:$mautin[phone_number]\n<br>\n";
}
?>
1.6.
1.6.
1.6.
1.6.
Khi
Khi
Khi
Khi
n
n
n
n
à
à
à
d
d
d
ù
ù
ù
ù
ng
ng
ng
ng
Tôikhôngthựcsựlàfancủathesql_fetch_row().Tuynhiên,có
m
ộttìnhhuống
m
àdùng
nókhônggiả
m
khảnăngdễđọc:khingườidùngđịnhnghĩacâutruyvấn.
Cácthídụchođếnlúcnàyđềuđềcậpđếnnhữngcâutruyvấnđượcbiếttrước.Đôikhi
bạnđểchongườidùngtựđịnhnghĩacâutruyvấn.Trườnghợpnàybạnsẽkhôngbiếtcáccột
trongkếtquả.
Dođó,dùnghà
m
sql_fetch_row()kè
m
vớicount()sẽxửlíhiệuquảcáccộttrong
m
ột
hàng:
kh
kh
kh
ô
ô
ô
ô
ng
ng
ng
ng
l
l
l
l
ấ
ấ
ấ
ấ
y
y
y
y
nh
nh
nh
nh
ữ
ữ
ữ
ầ
ầ
ầ
n
n
n
n
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
15
15
15
15
Dormitory204.B518:20
PM
April
7,
2006
Nhưlàvấnđềcủathựchành,đơngiảnlàsẽsailầ
m
khidùngPHPxửlí
m
ọidòngcủa
CSDL.TôiđãbắtgặpngườitadùngPHPđểchạy
m
SQL
SQL
)đượcthiếtkếđặcbiệtđể
truyvấnvàlấydữliệutừcácbảngcủabạn.Ýtưởnglàdùngnóđểlọcdữliệukhôngcầnthiết,
đểlạicácthôngtinliênquanchoPHPxửlí.
Nếubạnlấynhiềudữliệuhơncầnthiết,đólàdấuhiệuchắcchắnrằng
m
ãSQLđang
dùngchưađượctốiưuhoá.
2.1.
2.1.
2.1.
2.1.
M
M
M
M
ệ
ệ
ệ
ệ
nh
nh
nh
nh
đề
đề
đề
đề
WHERE
?>
Đoạn
m
ãtrênchưađượctốiưu:chúngtađangdùngPHPđểtì
m
kiế
m
trongtoànbộ
CSDL!NếunhưđiềunàykhôngquantrọngđốivớicácCSDLnhỏ,khikíchthướcCSDLtănglên
bạnsẽcả
m
thấy
m
ộtcúđấ
m
nặngnềvềhiệunăng.
Lờigiảirấtđơngiản:sửacâuSQLđểchứa
m
ệnhđềWHERE:
$strsql="SELECT*FROMSINHVIEN";
$strsql.="WHEREMASV='511203008'";
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
16
16
D
D
D
D
ù
ù
ù
ù
ng
ng
ng
ng
PHP
PHP
PHP
PHP
s
s
s
s
ắ
ắ
ắ
ắ
p
p
p
p
x
x
Nhiềungườilấydữliệuởtìnhtrạngkhôngcóthứtự,nhưngrồiđoạn
m
ãPHPtiếptheolại
sắpthứtựchúng.NênchớrằngsắpxếpbằngSQLnhanhhơnPHP.
DùngcúphápORDERBYcủaSQLđểsắpxếpthayvìhà
m
ksort()củaPHP.
Thídụdướiđâydùngksort()đểsắpxếptheotên:
$strsql="SELECTname,email,phoneFROMsome_table";
$strsql.="WHEREnameISLIKE'%baggins'";
$truyvan=@sql_db_query($strsql,"samp_db",$ketnoi);
if(!$truyvan){
die(sprintf("Error[%d]:%s",
sql_errno(),sql_error()));
}
while($mautin=@sql_fetch_array$truyvan)){
$matches[$mautin[name]]=array($mautin[email],
$mautin[phone]);
}
ksort($matches);
Nhưngtạisaokhôngsắpxếpdữliệu
ngayvàolúc
nóđượcđịnhnghĩa?Nógiúpchúngta
đỡphảiduyệtquatậpkếtquảlầnthứhai.
Dovậy,bỏhà
m
ksort()rakhỏichươngtrìnhtrênvàthayđoạn
m
ãSQLbằngđoạndưới
đây,códùngdùngcúphápORDERBY:
ể
ể
ể
ể
m
m
m
m
l
l
l
l
ỗ
ỗ
ỗ
ỗ
i
i
i
i
Tôiđãthấynhiềuchươngtrìnhthiếu
m
ộtlượngkiể
m
tralỗiđầyđủ.Nguyênnhânphần
lớnlàdolậptrìnhviênkhôngdànhthờigianđểlên
m
ộtkếhoạchthíchhợpchochươngtrình
của
m
i
i
i
đ
đ
đ
đ
i
i
i
i
ề
ề
ề
ề
u
u
u
u
t
t
t
t
ệ
ệ
ệ
ệ
nh
nh
nh
2006
Kiể
m
trakếtquảlờigọihà
m
Kiể
m
trakếtquảlờigọihệthống
Đặt
m
ứcerror_reportinglàE_ALLtrongtậptinphp.ini
1.1.
1.1.
1.1.
1.1.
Ki
Ki
Ki
Ki
ể
ể
ể
ể
m
m
m
m
tra
tra
i
i
i
i
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
h
h
à
à
à
à
m
m
m
m
Mỗikhibạngọi
m
?>
12.
12.
12.
12.
Thi
Thi
Thi
Thi
ế
ế
ế
ế
u
u
u
u
s
s
s
s
ự
ự
ự
ự
ki
ki
ki
ki
ể
m
tralỗikhôngnênthựchiện
saukhi
viếtchươngtrình.Sựthiếusóttrongtầ
m
nhìntrướccóthểdẫnđếnnhữnglỗinghiê
m
trọng,
khôngnhữnggâyrakếtquảsai
m
àthậ
m
chícònlà
m
hỏnghệthống(evencauseyoursystem
tocrash)!
1.
1.
1.
1.
Mong
Mong
Mong
Mong
đợ
đợ
đợ
đợ
i
i
ấ
ấ
ấ
ấ
t
t
t
t
Mọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuống
sai
.Đểgiả
m
thiểu
nhữngrủironhưthế,bạncầnlênkếhoạchđể:
Kiể
m
trakếtquảlờigọihà
m
Kiể
m
trakếtquảlờigọihệthống
Đặt
m
ứcerror_reportinglàE_ALLtrongtậptinphp.ini
1.1.
1.1.
1.1.
1.1.
Ki
Ki
ả
ả
ả
ả
l
l
l
l
ờ
ờ
ờ
ờ
i
i
i
i
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
=
$j
=
0.
<?php
mt_srand((double)microtime()*10000000);
functiondo_math($a,$b){
return(($a-$b)*2)/mt_rand();
}
for($i=5,$j=-5;$i>-5;$i ,$j++){
print$j/do_math($i,$j)."\n";
}
?>
1.2.
1.2.
1.2.
1.2.
Ki
Ki
Ki
Ki
ể
ể
ể
ể
m
m
m
m
tra
ờ
i
i
i
i
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
h
h
ệ
ệ
ệ
ệ
th
th
th
th
ố
đềuvậnhànhđúng.
Mộtthídụtuyệtvờilàviệckiể
m
trađầuracủa
m
ộtlờigọihệthốngkhidùnghà
m
sql_connect().Xácnhậnđầurađểkiể
m
traliênkếtđếnCSDLlàđúng.Là
m
saiđiềunàycóthể
dẫnđếncáctruyvấnhỏngvà
m
ấtdữliệutrongkhithậ
m
chíbạnkhôngbiết.
$ketnoi=@sql_connect($host,$user,$pass);
if(!$ketnoi){
die(sprintf("Error[%d]:%s",sql_errno(),sql_error()));
}
1.3.
1.3.
1.3.
1.3.
Đặ
Đặ
Đặ
Đặ
t
E_ALL
trong
trong
trong
trong
t
t
t
t
ậ
ậ
ậ
ậ
p
p
p
p
tin
tin
tin
tin
php.ini
php.ini
php.ini
php.ini
Hãyđả
m
bảobạncấuhìnhvới
m
ứcđộbáolỗicaonhấtcóthể.Nếubạnkhôngđặtnóở
-7713.5
?
-4702.5
-488.5
-928.5
-1394.75
2.
2.
2.
2.
B
B
B
B
ộ
ộ
ộ
ộ
qu
qu
qu
qu
ả
ả
ả
ả
n
n
n
n
ch
ch
ỉ
ỉ
ỉ
ỉ
nh
nh
nh
nh
PHPthườnghiểnthịcáclỗithựcthi(executionerrors)ratrìnhduyệt,ngănbạnxoá
(suppress)hoặcbắt(capture)nó.Tuynhiên,vớiPHP4bạnđãcóthểbắtlỗibằnghà
m
set_error_handler().
Hà
m
set_error_handler()cóthểđượcdùngđểghilạicáclỗixảyravớichươngtrìnhcủa
bạn.Thayvìlà
m
phiềnngườidùngvớicácthôngbáolỗi,bạncóthểghilạichoriêngbạn,bằng
cáchđặt
m
ộthà
m
quảnlílỗituỳchỉnh(acustomerrorhandlingfunction).
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
//function.
functionerror_handler($type,
$message,
$file=__FILE__,
$line=__LINE__)
{
error_log("$message,$file,$line",3,'error_file');
if($type&E_ERROR){
print'Anerroroccurred,ithasbeenlogged
anditwillbeaddressed.';
exit;
}
}
set_error_handler('error_handler');
?>
11.
11.
11.
11.
L
L
L
L
ạ
ạ
ạ
ạ
m
m
m
i
i
i
t
t
t
t
ượ
ượ
ượ
ượ
ng
ng
ng
ng
(H
(H
(H
(H
Đ
Đ
Đ
Đ
T)
T)
T)
T)
Môhìnhhướngđốitượnglà
m
ộtkháiniệ
ãhỗtrợHĐTcủaPHPkhôngđượctinhchỉnhvàcũngkhônghiệuquả.Nghĩalànếu
bạndùng
m
ôhìnhHĐTtrongPHP,bạncóthểlà
m
chậ
m
chươngtrìnhđángkể.
Nóichung,
m
ộtứngdụngdùngHĐTsẽchậ
m
đi,cũngnhưlàbạndùngeval()thìsẽ
chậ
m
hơnlàdùng
m
ãbìnhthường.ĐểminhhoạđầyđủhơnviệcHĐTcógìđókhôngtốt,tôi
đãtừngphảidùngnhữngtínhnăngvàkháiniệ
m
caocấpcủaPHP,
m
ộtvàitrongsốđóthậ
m
chíchưacótàiliệuchỉdẫn.
1.
1.
1.
1.
Ch
ể
l
l
l
l
à
à
à
à
m
m
m
m
g
g
g
g
ì
ì
ì
ì
m
m
m
m
à
à
à
à
kh
Đ
T?
T?
T?
T?
NếubạnchuyểnsangPHPtừcácngônngữnhưJavahayC++(nơibạnbạnthựcsự
khôngthểtạocácchươngtrìnhphứctạp
m
àkhôngdùngcáctínhnăngHĐT),việcbỏquakhả
năngHĐTcủaPHPcóthểsẽkhókhăn.Dùsao,tôivẫncóthểtrấnanbạnlàcácchươngtrình
rất
m
ạnh
cóthể
đượcviết
m
àkhôngdùng
m
ấtcứkháiniệ
m
và
m
ôhìnhHĐTnào(PHPđược
viếtbằngC,ngônngữkhônghỗtrợHĐT).
Đểdànhchonhữngaikhôngquenvớikĩnăngphi-HĐT,dướiđâylàvàikĩthuậtđểtạo
chươngtrìnhcótínhkếtdínhvàdễ
m
ởrộng
m
àkhôngdùng
m
ộttậptin
1.1.
1.1.
1.1.
1.1.
T
T
T
T
ạ
ạ
ạ
ạ
o
o
o
o
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
return(1.7);
}
//TheAPIislayer2
//doublecalculate_mortgage_rate(intmoney,inttime,intmonth)
//Calculatethemortgagerategiventhe
//thetotalmoney,timeitspaidoverand
//theintervals
functioncalculate_mortgage_rate($money,$time,$month){
$rate=_mort_find_interest_rate($money)/100;
$money/=($time/$month);
return($rate*$money)+$money;
}
?>
CalcMortgage.php
<?php
//Theactualapplicationislayer3
//$money,$timeand$periodaresubmitted
//fromaform
include_once'MortgageRate.php';
$price=calculate_mortgage_rate($money,$time,$period);
print"Your$periodmonthcostis$price";
?>
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
21
ộ
ộ
t
t
t
t
tr
tr
tr
tr
ì
ì
ì
ì
nh
nh
nh
nh
t
t
t
t
ự
ự
ự
ự
t
t
t
t
tu
tu
â
â
â
â
n
n
n
n
th
th
th
th
ủ
ủ
ủ
ủ
Mộttrongnhữngvấnđềchínhtrongbấtcứ
m
ộtdựánlớnnàolàsựxungđộtvềtên.Các
lớpcóthểphânđoạntên.Dođó,cáclớpkhácnhaucóthể:
Đượcgán
m
ộtthuộctínhvớitêngiốngnhau
Chứacácphươngthứcvớitêngiốngnhau
Thídụ,lớpPhillipsvàlớpNormalcóthểcùngcóphươngthứctênscrewdriver.
Nóichung,trướckhibắtđầu
m
ộtdựánlớnnào,bạnnêncó
á
c
c
c
c
ý
ý
ý
ý
ni
ni
ni
ni
ệ
ệ
ệ
ệ
m
m
m
m
chung
chung
chung
chung
v
v
v
v
à
p
tin
tin
tin
tin
Nhó
m
cáchà
m
APItươngtựvàochung
m
ộttậptincũnggiốngnhưnhó
m
cácphương
thứctươngtựvào
m
ộtlớp.Cốgắngtưởngtượng
m
ỗitậptinbạntạolà
m
ộtlớp,
m
ỗihà
m
trong
đólà
m
ộtphươngthức.Bằngcáchnày,cáchà
m
củabạnsẽcóđịnhnghĩavàcấutrúcsángsủa.
ố
ố
ng
ng
ng
ng
m
m
m
m
ọ
ọ
ọ
ọ
i
i
i
i
th
th
th
th
ứ
ứ
ứ
ứ
,
,
,
,
i
i
ề
ề
ề
ề
u
u
u
u
độ
độ
độ
độ
Đểtôilà
m
sángtỏ
m
ộtviệc.Tôikhôngphảiđangcốbiệnhộđểbạntừbỏ
hẳn
HĐTtrong
PHP.Đúngra,tôichỉđangcốcảnhbáobạnđừngnêndùngPHPnhưJavahayC++,nơi
m
à
HĐTcóthểdùngthoải
m
ái.
Hãycẩnthậnđánhgiálợivàhạitrướckhibạndùng
m
ộttiếpcậnHĐTvớiPHP.
Bi
Bi
ể
ể
ể
ể
u
u
u
u
th
th
th
th
ứ
ứ
ứ
ứ
c
c
c
c
Ch
Ch
Ch
Ch
í
í
í
í
m
ớicủaPHPcóthểlà
m
như
sau:
<?php
$URL="";
$fp=@fopen($URL,"r");
if(!$fp){
die("Cannotopenwebsite$URL!");
}
while($line=@fgets($fp,1024)){
$data.=$line;
}
@fclose($fp)
orwarn("Cannotclosewebsitehandle,$URL");
$data=ereg_replace("[a-z]","[A-Z]",$data);
print$data;
?>
Tuynhiên,sẽphíthờigiankhibạndùnghà
m
ereg_replace()(chậ
m
hơn)đểlà
m
công
việc
m
àstrtoupper()(nhanhhơn)cóthểthựchiệntốthơn.
$data=strtoupper($data);
á
á
c
c
c
c
h
h
h
h
à
à
à
à
m
m
m
m
c
c
c
c
ầ
ầ
ầ
ầ
n
n
n
n
việcvớicácchuỗilớn.
9.
9.
9.
9.
L
L
L
L
ậ
ậ
ậ
ậ
p
p
p
p
tr
tr
tr
tr
ì
ì
ì
ì
nh
nh
nh
nh
PHP
ô
n
n
n
n
ng
ng
ng
ng
ữ
ữ
ữ
ữ
kh
kh
kh
kh
á
á
á
á
c
c
c
c
NhiềungườibắtđầuPHPsaukhiđãthuầnthục
m
ộtngônngữkhácnhưPerl,C,Javahay
ASP.Là
m
"1
d
d
d
d
ò
ò
ò
ò
ng"
ng"
ng"
ng"
PHPlà
m
ộtngônngữkhôngthựcsựtốiưuchocáchtiếpcận1dòngkhiviếtchươngtrình.
Thayvàođó,nó
m
ởrộngcáctậphà
m
phứctạpvàcácbiểuthứcchínhquytheo
m
ộtđịnh
dạngcócấpbậchơn
M
M
M
M
ã
ã
ã
ã
l
l
l
l
ệ
ệ
ệ
ệ
nh
nh
nh
nh
PHP)
PHP)
PHP)
PHP)
<?php
$fp=@fopen('php://stdin','r');
if(!$fp){
die('CannotopenSTDIN');
}
while($line=@fgets($fp,1024)){
list($name,$quote)=explode(':',$line);
$quotes[$name]=$quote;
}
foreach($quotesas$name=>$quote){
print"$name:";
printimplode("",array_reverse(preg_split('//',
ng
ng
ng
d
d
d
d
ù
ù
ù
ù
ng
ng
ng
ng
c
c
c
c
á
á
á
á
c
c
c
c
h
h
h
hà
m
sẵncógiúpthaythếcácđoạn
m
ãdài.NếubạnđếnvớiPHPtừC,tôikhuyênbạnnênđọc
quatàiliệutrướckhiviết
m
ộtkhốilệnhđểxemPHPcósẵnhà
m
nàogiúpcuộcsốngcủabạn
dễdànghơnkhông.
Đổ
Đổ
Đổ
Đổ
i
i
i
i
t
t
t
t
ê
ê
ê
ê
n
n
n
đã
đã
đã
c
c
c
c
ó
ó
ó
ó
Tôiđãthấyngườitađổitêncáchà
m
đãcócủaPHPchỉđểgiúphọdễnhớhơn.Điềunày
khôngchỉlà
m
chậ
m
chươngtrình,
m
àlà
m
chođoạn
m
ãkhóđọchơn.
D
D
D
D
ù
t
ượ
ượ
ượ
ượ
ng
ng
ng
ng
qu
qu
qu
qu
á
á
á
á
m
m
m
m
ứ
ứ
ứ
ứ
c
c
c
c
PHPkhôngphảilà
ô
ng
ng
ng
ng
tin
tin
tin
tin
ở
ở
ở
ở
đâ
đâ
đâ
đâ
u?
u?
u?
u?
May
m
ắnlàcórấtnhiềuthôngtinvềviệc
làmthếnào
đểlậptrìnhPHP.Vàinơitốtnhất
là
Zend.combảngốccủabàiviếtnàylàởđó
ProfessionalPHP
ậ
ậ
ậ
ậ
n
n
n
n
th
th
th
th
ứ
ứ
ứ
ứ
c
c
c
c
đầ
đầ
đầ
đầ
y
y
y
y
đủ
đủ
t
t
t
t
Nhữngngườidùngkhôngphảilúcnàocũnglà
m
việcvớihệthốngcủachúngta.Vớitư
cáchlàlậptrìnhviên,tráchnhiệ
m
củachúngta
làthiếtkế
m
ộthệthốngantoàn,dễchịucó
thểlà
m
việcđượcchungvớilỗicủangườidùng.
Khithiếtkếhệthống,bạnphảiđặt
m
ìnhvàovịtríngườidùng.Xemxétnhữngchỗhọcó
thểgặplỗivàtì
m
kiế
m
nhữnglỗhổngbảo
m
ậttiề
m
tàng.Rồibạnthiếtkếchươngtrìnhcókhả
năngsửachữalỗinàyvàlấpcáclỗhổngbảo
m
ĐỪ
NG
NG
NG
NG
BAO
BAO
BAO
BAO
GI
GI
GI
GI
Ờ
Ờ
Ờ
Ờ
TIN
TIN
TIN
TIN
NG
NG
NG
NG
ƯỜ
ƯỜ
ƯỜ
ƯỜ
I
C
Á
Á
Á
Á
CH
CH
CH
CH
M
M
M
M
Ù
Ù
Ù
Ù
QU
QU
QU
QU
Á
Á
Á
Á
NG
NG
NG
NG
KHI
U
C
C
C
C
Ủ
Ủ
Ủ
Ủ
A
A
A
A
H
H
H
H
Ọ
Ọ
Ọ
Ọ
V
V
V
V
À
À
À
À
O
H
Ệ
Ệ
Ệ
Ệ
TH
TH
TH
TH
Ố
Ố
Ố
Ố
NG
NG
NG
NG
M
M
M
M
À
À
À
À
KH
KH
KH
KH
Ô
ƯỚ
C
C
C
C
.
Khiđăngkíngườidùng.Nếubạntrôngmongcókếtquảchínhxác,luônkiểmtra
vàđảmbảobảnđăngkíđượckiểmtranhữngchỗcầnthiết.Trướctiên,cónhiều
cáchđểkiểmtramộtđịachỉe-mailhợplệ.Hơnnữa,bạnnênkiểmtratuổicủa
ngườidùngcónằmtrongphạmvithíchhợpkhông.Vớimộtsựsuyrộng,bạncó
PHPprogrammingdynamicwebforewreybody
21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes
NGUYENANHKHOA
–
Class27K0A
–
DepartmentOfInformationTechnology
24
24
24
24
Dormitory204.B518:20
PM
April
7,
2006
thểkhẳngđịnhkháchắcchắnrằngkhôngcómộtngười200tuổinàocókhảnăng
dùngmáyvitính.
Khichấpnhậnthẻtíndụng.Mộtsốlậptrìnhviênchỉdùngnhữngthuậttoánđơn
giảnmàcóthểdễdàngbịđánhlừakhithựchiệnkiếmtrathẻtíndụng.Chỉchấp
ƯỞ
ƯỞ
ƯỞ
NG
NG
NG
NG
M
M
M
M
Ộ
Ộ
Ộ
Ộ
T
T
T
T
THU
THU
THU
THU
Ậ
Ậ
Ậ
Ậ
T
T
T
m
m
m
ậ
ậ
ậ
ậ
t
t
t
t
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
l
l
l
l
ờ
ờ
ờ
ố
ố
ố
ng
ng
ng
ng
Mỗikhibạnđưadữliệucủangườidùngvàolờigọihệthống,bạncần
tỉnhtáokiểmtra
dữliệuđó.Đả
m
bảorằngkhôngcógìnguyhiể
m
nằ
m
trongdữliệuđócóthểlừaphỉnhhệ
thốngthựchiệnnhữnglệnhkhôngmongmuốn.PHPcungcấp
m
ộthà
m
là
m
điềuđó:
EscapeShellCmd()
Bấtcứkhinàobạnchuyển
m
ộtlệnhcóchứadữliệunhạycảm,trốnthoátdữliệuđó
bằnghà
m
EscapeShellCmd
<
/head
>
<
body
>
<
h1>NameLookup</h1
>
<?php
if($name){
system(EscapeShellCmd("lookup$name"));
print"
nn";
}
?>
<
formaction="<[color=blue]?phpprint$PHP_SELF;?>[/color]"
method="GET">
Enteranametolookup:
<
inputtype="text"name="name">
<
inputtype="submit"value="LookupName">
<
/form
>
<
/body
>
i
i
i
xa
xa
xa
xa
h
h
h
h
ơ
ơ
ơ
ơ
n
n
n
n
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
2.
2.
2.
Ki
Ki
Ki
Ki
ể
ể
ể
ể
m
m
m
m
tra
tra
tra
tra
đị
đị
đị
đị
a
a
a
a
ch
ch
ch
Dormitory204.B518:20
PM
April
7,
2006
m
ộtnhó
m
thưtín,haytrong
m
ộtkho
m
ãnguồnnàođó).Tuynhiên,
m
ộtbiểuthứcchínhquy
khôngđủnếubạnmuốncókếtquảchínhxác.Cóvàicáchantoànhơn
m
àbạncóthểdùng:
2.1.
2.1.
2.1.
2.1.
Ki
Ki
Ki
Ki
ể
ể
ể
ể
i
i
(socket
(socket
(socket
(socket
validation)
validation)
validation)
validation)
Mộtcáchđểkiể
m
địnhđịachỉe-mail
m
àkhôngquấyrầytrựctiếpđếnngườidùnglàtạo
m
ộtkếtnốiđếnservernhậnđượctrongđịachỉe-mail,sauđótì
m
tênđăngkícủahọ.
2.1.1.
2.1.1.
2.1.1.
2.1.1.
Ư
Ư
Ư
Ư
u
u
u
Khuy
ế
ế
ế
ế
t
t
t
t
đ
đ
đ
đ
i
i
i
i
ể
ể
ể
ể
m
m
m
m
Khôngpháthiệnđượcđịachỉbịđánhcắp.Thídụ,nếuJohnDoeđưađịachỉe-
mailcủatôi(),
m
ọithứvẫntiếnhànhbìnhthường,dùnólàđịa
m
tra
tra
tra
tra
t
t
t
t
ươ
ươ
ươ
ươ
ng
ng
ng
ng
t
t
t
t
á
á
á
á
c
c
c
c
Mộtcáchkhácđểkiể
ể
ể
ể
ể
m
m
m
m
Làcáchtốtnhấtđểkiể
m
trangườidùngcó
m
ộtđịachỉe-mailhợplệ
2.2.2.
2.2.2.
2.2.2.
2.2.2.
Khuy
Khuy
Khuy
Khuy
ế
ế
ế
ế
t
t
t
t
đ
ộtđịachỉtạ
m
ởHotmailhayNetaddressvàsau