... PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology1111Dormitory204.B518:20PMApril7,2006àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâmđếnviệctránhnhữnglỗithườnggặpkhisửdụngPHP .Người ọcphảibiếtcáccúphápcủaPHP,vànênbiếtcôngdụngcủacáchàmtrongPHP.MộttrongnhữngđiểmmạnhnhấtcủaPHPvôtìnhtrởthànhmộttrongnhữngđiểmyếunhấtcủanó:ttttíííínhnhnhnhddddễễễễssssửửửửddddụụụụngngngng.NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnrarằng:sửdụngđúngPHPPHPPHPPHPccccòòòònnnnkhkhkhkhóóóóhhhhơơơơnnnnccccááááccccngngngngôôôônnnnngngngngữữữữkhkhkhkháááácccc.Trongloạtbàinàysẽlầnlượtnêura21lỗi,từnhữngsailầmgiáokhoa(làmscripttrởnênchậmvàkhóquảnlí)đếnnhữngsailầmchếtngười-cóthểxemlànguồngốccủanhữngsailầmsơđẳng.PHẦN1:7LỖIGIÁOKHOA21.21.21.21.SSSSửửửửddddụụụụngngngngprintf()printf()printf()printf()khkhkhkhôôôôngngngngththththííííchchchchhhhhợợợợppppHàmprintf()dùngđểindữliệucóđịnhdạngNócóthểđượcdùng,thídụ,khibạnmộtinmộtsốkiểudoublevới2s lẻ, hoặctrongbấtkìtìnhhuốngnàobạnmuốnthayđổiđịnhdạngtrướckhiin.Thídụdướiđâyminhhoạcáchdùngđúngcủaprintf():địnhdạngsốPivớiđộchínhxáctheoýmuốnMMMMããããllllệệệệnhnhnhnh(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);?>ChChChChúúúúýýýý....Tôiđãtừnggặpnhữngngườisợdùngprintf(),thayvàođólạidùngnhữnghàmđịnhdạngtựviết,dàiđến30-40dòng ,trong imộtcâuprintf()cóthểlàmmọithứanhtamongmuốn.Nhiếulậptrìnhviêndùngsaiprintf():incácbiến,cácgiátrịtrảvềcủahàmhoặcthỉnhthoảng,chỉlàdữliệuthôngthường.Thườngxảyratronghaitìnhhuống:Câulệnhprint()thíchhợphơnHiểnthịgiátrịtrảvềcủamộthàm1.1.1.1.KhiKhiKhiKhinnnnààààooooprint()print()print()print()ththththííííchchchchhhhhợợợợpppphhhhơơơơn?n?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='khoa_computer2004@yahoo.com';printf("Tencuatuila:%s\n<br>\nHiendangla:%s,%s\n<br>\nLienhevoitoiquaEmail:%s\n<br>\n",$name,$nghenghiep,$diachi,$email);?>Hàmprint()print()print()print()cóthểdùngthaychoprintf()nhưsau:BPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology2222Dormitory204.B518:20PMApril7,2006printprintprintprint"Tencuatuila:$name\n\n\n\n<br>\n\n\n\nHiendangla:$nghenghiep,$diachi\n\n\n\n<br>\n\n\n\nLienhevoitoiquaEmail:$email\n\n\n\n<br>\n\n\n\n";;;;Khikhôngcầnđịnhdạngsửliệu,dùngprint()thaychoprintf()cónhữnglợiíchsau:ThiThiThiThihhhhàààànhnhnhnhnhanhnhanhnhanhnhanhhhhhơơơơn:n:n:n:hàmprintf()địnhdạngdữliệucủabạntrướckhihiểnthị,nósẽchậmhơnprint()hoặcecho()MMMMããããssssáááángngngngssssủủủủ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ến2.2.2.2.DDDDùùùùngngngngprintf()printf()printf()printf()đểđểđểđểxuxuxuxuấấấấttttddddữữữữlilililiệệệệuuuutrtrtrtrảảảảvvvvềềềềttttừừừừggggọọọọiiiihhhhààààmmmmMộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhàmđếmdướiđây:Khixuấtgiátrịdohàmtrảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây:Dùngtoántử.nhanhhơnviệcdùngprintf()20.20.20.20.ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaa(semantics)(semantics)(semantics)(semantics)NhiềulậptrìnhviênsửdụngPHPmàkhôngbiếtđếnnhữngđiểmtinhtếcủangônngữnày.Mộttrongnhữngđiểmđólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa(semantics).CCCCúúúúphphphphááááp:p:p:p:nhữngquytắcđịnhnghĩamộtphầntử.Thídụ:dấu$đểtrướcdùngđịnhnghĩabiến,dùngdấu()vàcácthamsốđịnhnghĩamộthàm...NgNgNgNgữữữữnghnghnghnghĩĩĩĩa:a:a:a:nhữngquytắcápdụngtrongcúpháp.Thídụ:mộthàmcó2biếnđịnhnghĩabởicúphápcủanó,haibiếnnàycókiểustring-đólàngữnghĩa.TrongmộtngônngữlỏnglẻonhưPHP,bạncónhiềulựachọnđểviếtlệnh.Cácbiếnkhôngcầncókiểuxácđịnh...Thídụsaumởtậptinvàintừngdòng:Thídụtrênsẽtạolỗi:Warning:Warning:Warning:Warning:SuppliedSuppliedSuppliedSuppliedargumentargumentargumentargumentisisisisnotnotnotnotaaaavalidvalidvalidvalidFile-HandleFile-HandleFile-HandleFile-HandleresourceresourceresourceresourceininininC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpononononlinelinelineline4.4.4.4.<?printfprintfprintfprintf("%doccurrencesof%sfound.",count($truyvan),$search_term);?><?printprintprintprintcount($truyvan)."occurrencesof$search_termfound.";?><?$fp=@fopen('vanban.txt','r')ordie('Khongthemofilevanban.txt');while($line=@fgets("$fp",1024))//Loi{print$line;}@fclose("$fp")//Loiordie('Khongthedongvanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology3333Dormitory204.B518:20PMApril7,2006Đólàdobiến$fpđặttrongdấunháyképnênđượcchuyểnthànhchuỗi.Thếmàhàmfopen()nhậnmộtđịnhdanhtàinguyên(resourceidentifier)trongthamsốđầucủanó,chứkhôngnhậnmộtchuỗi.Đểgiảiquyếtvấnđề,bạnchỉđơngiảnbỏdấunháyképđi1.1.1.1.CCCCóóóóththththểểểểtrtrtrtráááánhnhnhnhviviviviệệệệccccááááppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩa?a?a?a?Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomizeyourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoreticallypossibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđượckhông?Thídụtrêncủachúngtatạoramộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncácscriptđểthíchhợpvớimộtkịchbảnkhácthườnghoặcvớicácđòihỏicủathôngtinra.Dođó,ítnhấttrênlíthuyết,bạncókhảnăngtránhviệcápdụngsaingữnghĩa.Vậy,bạncầnbiếtnhữnghậuquảcóthểcó(possibleoutcomes)nếubạnquyếtđịnhhọcvềngữnghĩa.Ápdụngsaidẫnđếnnhữnglỗikhátinhvinếubạnkhôngchúý.Nếubạnmuốntuỳbiếnscript,bạncầnhiểunhữngchủđềchínhsau:KiKiKiKiểểểểu:u:u:u:trongPHP,mỗibiếncómộtkiểuxácđịnhởmộtthờiđiểmxácđịnh,chodùbạncóthểtựdochuyểnđổikiểumộtbiến.Nóimộtcáchkhác,khôngcóbiếnnàolạikhôngkèmtheotínhchấtcủakiểucủanó.PHPcó7kiểucơbản:boolean,resource,integer,double,string,arrayvàobject.TTTTầầầầmmmmvvvvựựựực:c:c:c:trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiếncóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbảnvề"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ằngkhô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.19.19.ThiThiThiThiếếếếuuuughighighighichchchchúúúúTheoýtôi,mãnguồnthiếughichúlàcănnguyêncủasựlậptrìnhíchkỉ.Nódẫntớinhữnghiệuchỉnhsailầm,hiểusaiýnghĩavàlàmngườiđọcmệtmỏi.Nóichung,lậptrìnhghichú(inlinedocumentation)đượcmọingườikhẳngnhậnlàđiềutốt,nhưnghiếmkhinótồntại.Mộtvấnđềkháclàquánhiềughichú.Dùhiếmgặp,nhưngnólàmchocácđoạnmã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";//Vonglapforinratatcatuoitruocdofor($idx=0;$idx<$age;$idx++){<?$fp=@fopen('vanban.txt','r')ordie(‘Khongthemofiletailieuphp.txt');while($line=@fgets($fp,1024)){print$line;}@fclose($fp)ordie(Khongthedongfilevanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology4444Dormitory204.B518:20PMApril7,2006//Inratuoicanhanprint"$idxyearsold\n<br>\n";}//KetthucmaPHP?>1.1.1.1.BaoBaoBaoBaonhinhinhinhiêêêêuuuughighighighichchchchúúúúththththììììđủđủđủđủ????Nhiếuđếnmứcnào,điềuđótuỳthuộcngânsáchcủabạn,vàochínhsáchcủacôngtyvàvàođộphứctạpcủachươngtrình.Tuynhiên,cũngcómộtvàigợiýchobạnLuôncómộtmôtảngắnvềmụcđíchcủahàmngaytrướcđịnhnghĩacủahàmđóThêmghichúvàonhữngchỗcóthểbịhack,hoặcnhữngchỗtưởngrằngsainhưnglạichạyđúngNếumộtđoạnmãnàođócóthểgâynhầmlẫn,hãythêmmộtítghichúvềmụcđíchcủađoạnđó.SaunàybạnsẽthấyđượclợiíchcủanóDùngmộtkiểughichúnhấtquán,/*/*/*/**/*/*/*/hoặclà////////(tr(tr(tr(tráááánhnhnhnhddddùùùùngngngng#)#)#)#)Dướiđâylàmộtthídụvềghichútốt:<?//Random_Numbers.lib//Generatedifferenttypesofrandomnumbers.mt_srand((double)microtime()*1000000);//mixedrandom_element(arrayelements[,arrayweights])//Extractarandomelementfromelements.Weightsis//therelativeprobabilitythateachelementwillbe//selected.functionrandom_element($elements,$weights=array()){//Theremustbeexactlythesameamountofelementsas//thereareweightsforthisalgorithmtoworkproperlyif(count($weights)==count($elements)){foreach($elementsas$element){foreach($weightsas$idx){//Note:wedon'tuse$idx,sincewe//don'twanttooverrideelements.$randomAr[]=$element;}}}else{$randomAr=$elements;}$random_element=mt_rand(0,count($randomAr)-1);return$randomAr[$random_element];}?>18.18.18.18.NhiNhiNhiNhiềềềềuuuubibibibiếếếến,n,n,n,ttttốốốốnnnnnhinhinhinhiềềềềuuuuththththờờờờiiiigiangiangiangianCóvàingườibịámảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthểviếtnhưthếnày:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology5555Dormitory204.B518:20PMApril7,2006Tạisaophảidùngbiếntrunggian?NókhôngcầnthiếtRủithay,cóvẻnhưrấtnhiềungườikhóbỏđượcthóiquenxấunày.Biếntạmlàmchậmthờigianthihànhchươngtìnhcủabạn.Tốthơnlànênbỏquađóvàgộpcáclờigọihàmvớinhau.Nhữngngườidùngbiếntạmthườnglàmchươngcủahọchạychậmđến25%.Mộtlídokhácđểtránhcóquánhiềubiếntạmlàvìtrôngnókhôngđượcđẹpmắt.Tronghaithídụtrên,thídụnàosúctíchhơn?Thídụnàolàmconmắtdễchịuhơn?Dùngquánhiềubiếntạmcóthểdẫnđếnmãchươngtrìnhkhóđọcvàkhôngsúctích.1.1.1.1.LLLLợợợợiiiiđđđđiiiiểểểểmmmmccccủủủủaaaaddddùùùùngngngngbibibibiếếếếnnnnttttạạạạmmmmCácbiếntạmcólợitrongviệcthaythếcáchàmhaybiểuthứcdàilêthê.Nócóvaitrònhưbídanhgiả.Điềunàyđặcbiệtđúngkhibạndùngmộthàmhaybiểuthứcnhiềulần.Xemxétthídụđây,nókhôngdùngnhiềubiếnhơnmứctốithiểuNộidungtronghàmimplode()dàivàdođókhóđọc.Dùngmộthoặcnhiềubiếntạmcóthểgiúpchúngta:2.2.2.2.CCCCáááácccclulululuậậậậttttchungchungchungchungccccủủủủaaaangngngngóóóónnnntaytaytaytayccccááááiiiiKhiquyếtđịnhcódùngbiếntạmhoặckhông,bạnnênsuynghĩvề2câuhỏi:Bạncódùngbiếnđóítnhấthailần?Tínhđọcđượccủamãcótăngđángkểkhông?Nếuítnhấtmộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợpcáchàmlại(nếucần).17.17.17.17.ViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnMộtsốnơiphổbiếnmãnguồncácscriptPHPchủtrươngđổitêncáchàmsẵncóđểtạosựdễdàngchocáclậptrìnhviênchuyểntừVBsang.Thídụ:<?$tmp=date("Fd,h:ia");/*ieJanuary3,2:30pm*/print$tmp;?><?printdate("Fd,h:ia");?>//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){returnimplode("",array_reverse(preg_split("//",$str)));}//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){$characters=preg_split("//",$str);$characters=array_reverse($characters);returnimplode("",$characters);}<?functionlen($str){PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology6666Dormitory204.B518:20PMApril7,2006LạicómộtsốngườicốgắngviếtlạicáchàmPHPthô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àmchonhữngngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcảmthấycóquánhiềuhàmdưthừa.Họtựhỏitạisaobạnlạiđiđịnhnghĩahàmtheokiểuđó,thayvìsửdụngcáchàmđịnhnghĩasẵnbởiPHP.Thứhai,địnhnghĩahàmnhưvậycũngsẽlàmchậmchươngtrìnhcủabạn(mộtcáchkhôngcầnthiết).Khôngchỉphảixửlínhiềumãhơn,màmỗilầngọihàmdobạnđịnhnghĩa,bạnđãtốnthờigianchochínhhàmđó,trướckhihàmnguyênthuỷđượcgọi.1.1.1.1.TrTrTrTráááánhnhnhnhviviviviếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnHãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên,mộtlậptrìnhviênkhôngthểtheokịpcáchàmcủaPHPngayđược.Vàaicóthờigianmàtracứu.Tạisaokhôngviếtlạichokhoẻ?CáchlàmcủatôilàluôncósẵnmộttàiliệuchỉdẫnPHP(PHPmanual)mỗikhiviếtchươngtrình(tácgiảbàinàydùngmộtbảnPDFcótạochỉmục,riêngtôi,ngườidịch,thìdùngmộttàiliệuCHMđầyđủthôngtinvàcócảgópýcủangườisửdụngmàbạncóthểlấyởhttp://www.php.net/docs.php).Sauđó,mỗikhiđịnhviếtmộthàmmởrộngchoPHP,tôiđọclướtquatàiliệuđểxemhàmđócóchưa.Tuynhiên,cầnchúýlà,dobảnchấtmãnguồnmởcủaPHP,bạncóthểtìmđượccáchàmdongườidùngđịnhnghĩatrướckhinóđượcthêmvàoPHP(thídụnhưhàmtìmphầntửkhácnhaugiữahaimảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlạimã(Thisdoesn'tnecessarilymeanthatyoushouldhavetocorrectthecode.-don'tunderstand)16.16.16.16.KhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnserverserverserverservervvvvààààclientclientclientclientVàilậptrìnhviêncốkếtnốicảchươngtrìnhvớinhau,nghĩalàghépchungmãHTML(client-side-phầnkhách)vớimãPHP(server-side-phầnchủ)vàotrongmộttậptinlớn.Mặcdùđiềunàytốtchocácsitenhỏ,nhưngnócóthểtrởthànhvấnđềlớnkhicácsiteđótrởnênlớnhơnvàđượcbổsungthêmtínhnăng.Lậptrìnhtheocáchnàylàmnảysinhvấnđềkhóbảotrìvàcáctậptintrởnêncồngkềnh.1.1.1.1.HHHHààààmmmmAPIAPIAPIAPIKhimuốntáchbiệtphầnkhách-chủ,bạncóvàilựachọn.Mộtcáchlàviếtnhữnghàmhiểnthịnộidunglinhđộngvàđặtchúngđúngchỗtrongtrangweb.Thídụdướiđâyminhhoạđiềunày:index.phpindex.phpindex.phpindex.php-phầnkháchreturnstrlen($str);}?>HTMLHTMLHTMLHTML<?phpinclude_once("site.lib");?><html><head><title><?phpprint_header();?></title></head><body><h1><?phpprint_header();?></h1><tableborder="0"cellpadding="0"cellspacing="0"><tr>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology7777Dormitory204.B518:20PMApril7,2006site.libsite.libsite.libsite.lib-phầnchủNhưbạnthấytrongthídụtrên,táchbiệtkháchchủlàmtăngtínhdễđọctrongchươngtrìnhcủabạn.MộtlợiíchkháclàmộtkhibạnđãcócáchàmAPIhiểnthịnộidung,bạncóthểđểchothiếtkếviênthamgiathayđổibốcụcmàkhôngcầnsửamãchươngtrình.1.1.1.1.1.1.1.1.LLLLợợợợiiiiííííchchchchccccủủủủaaaahhhhààààmmmmAPIAPIAPIAPITươngđốisángsủaNhanh,hầunhưkhônglãngphíthờigian(overhead)1.2.1.2.1.2.1.2.BBBBấấấấttttllllợợợợiiii<tdwidth="25%"><?phpprint_links();?></td><td><?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(){global$site_info;print$site_info->header;}functionprint_body(){global$site_info;printnl2br($site_info->body);}functionprint_links(){global$site_info;$links=explode("\n",$site_info->links);$names=explode("\n",$site_info->link_names);for($i=0;$i<count($links);$i++){print"\t\t\t<axhref=\"$links[$i]\">$names[$i]</a>\n<br>\n";}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology8888Dormitory204.B518:20PMApril7,2006Khôngsángsủavàdễdàngbằnghệthốngmẫu(templatesystem)CầnmộtítkiếnthứcPHPđểsửamẫu2.2.2.2.HHHHệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuMộtcáchkhácđểtáchbiệtkháchchủlàdùnghệthốngkhuônmẫu.Nghĩalà,cómộtsốđánhdấunộidungsauđódùngchươngtrìnhphântích,thaythếcácđánhdấuđóbằngthôngtincầnthiết.Thídụ,bạncóthểtạomộ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ônmẫukhátốtlàlớpFastTemplate,cóởwww.thewebmasters.net2.1.2.1.2.1.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmccccủủủủaaaahhhhệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuRấttrongsángKhôngcầnkiếnthứcPHPđểsửakhuônmẫu2.2.2.2.2.2.2.2.NhNhNhNhượượượượccccđđđđiiiiểểểểmmmmChậmhơn,bạncầnphântáchtậptinkhuônmẫu,sauđóxuấtraViệchiệnthựcphứctạphơn15.15.15.15.DDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiiiCónhiềungườicứdùngmãicácmãvàthưviệnlỗithời.ThídụnhưhọđãviếtmộthàmdùngởPHP2,vàvẫncòndùngnóởPHP4,mặcdùmộthàmcócùngmụcđíchnhưthếđãđượcthêmvàoởPHP3Dùngcáccấutrúclỗithờicóthểlàmchậmchươngtrìnhcủabạn,cũngnhưlàmchonótrởnênkhóhiểu .Người ọccácchươngtrìnhcủabạncóthểkhôngquenvớicáchàmlỗithờicủaPHP.Tuynhiên,khipháthiệnmộtđoạnmã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ắmlấy,làcúphápbeginControlStructurebeginControlStructurebeginControlStructurebeginControlStructure........endControlStructureendControlStructureendControlStructureendControlStructure;HTMLHTMLHTMLHTML<html><head><title>%%PAGE_TITLE%%</title></head><body%%BODY_PROPERTIES%%><h1>%%PAGE_TITLE%%</h1><tableborder="0"cellpadding="0"cellspacing="0"><tr><tdwidth="25%">%%PAGE_LINKS%%</td><td>%%PAGE_CONTENT%%</td></tr></table></body></html><?PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology9999Dormitory204.B518:20PMApril7,2006ĐâylàmộtthóiquenxấuvìNókhôngđượcdùngrộngrãi,chonênnhiềungườihọcsẽbịlẫnlộngiữahaicúphápNókhôngtươngthíchvớingônngữkhác,nghĩalànótrởnênkhóđọcđốivớinhữngngườitronggiaiđoạnquáđộ(mớichuyểntừmộtngônngữnàođósangPHP)Quantrọngnhất,làmộtngàynàođótínhnăngnàysẽbịxoáxổ,bắtbuộcbạnphảiviếtlạitoànbộmãcódùngnó.DấungoặcnhọnluônluônlàmộtphầncủangônngữPHP.Ởtrênchỉlàmộtthídụvềcấutrúclỗithời.Nócònnhiềunữa.Nhưmộtquytắc,bạnnêntheonhữngcácviếttrongtàiliệuPHP.Hầuhếtnóđượccậpnhậtmới.NócũngdùngcáchàmmớinhấtcủaPHPtrongthídụcủamình.NênthườngxuyênkiểmtratàiliệukhibạncóýmuốnmởrộngtínhnăngnàođócủaPHP.Theocáchnày,bạnsẽkhôngphảiviếtlạicáchàmcósẵn.TTTTổổổổngngngngkkkkếếếếttttTrongbàinàybạnđãđiqua7trêntổngsố21lỗimàlậptrìnhviênPHPmắcphải.Nhữnglỗigiáokhoanàybaogồm:SSSSửửửửddddụụụụngngngngsaisaisaisaihhhhààààmmmmprintf()printf()printf()printf()ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaaThiThiThiThiếếếếuuuuttttààààiiiililililiệệệệuuuutrongtrongtrongtrongmmmmããããngungungunguồồồồnnnnDDDDùùùùngngngngququququáááánhinhinhinhiềềềềuuuubibibibiếếếếnnnnttttạạạạmmmmViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnKhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnkhkhkhkháááách/chch/chch/chch/chủủủủDDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiii//Bad/OutdatedPracticewhile(1):print"5";if($idx++==5):break;endif;endwhile;//BetterPractice//(thecodecouldbeoptimizedthough)while(1){print"5";if($idx++==5){break;}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology10101010Dormitory204.B518:20PMApril7,2006PHẦN2–LỖINGHIÊMTRỌNG14.14.14.14.KhKhKhKhôôôôngngngngtutututuâââânnnnththththủủủủccccááááccccquyquyquyquyướướướướccccđặđặđặđặttttttttêêêênnnnMộttrongnhữnglỗinghiêmtrọngmàngườilậptrìnhcóthểphạmphảilàđịnhnghĩamộtquyướcđặttêntồi.Tôiđãtiếpquảnnhiềudựánm 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đếnmộtdựánmàngườilậptrìnhcũđãquyếtđịnhđưavàotoànbộchươngtrìnhmộtkiểuđặttênkìlạ(aFlinstonesnamingtheme),khôngphảitôiđùađâu.Cáchbạnđặttênbiếnvàhàmlàtrungtâmcủaviệcxâydựngmộtchươngtrìnhdễđọc.Cónhiềulậptrìnhviênphạmlỗikhiđặttênbiếnvàhàmmànó:quádàihoặcquángắnkhôngliênquanđếnngữcảnhkhôngđểýđếncách-viết-phân-biệt(casesensitivity)ngăncảnkhảnăngdễđọc(đặcbiệtlàcáchàm)1.1.1.1.ĐặĐặĐặĐặttttttttêêêênnnnbibibibiếếếếnnnn1.1.1.1.1.1.1.1.CCCCááááchchchchviviviviếếếếttttphphphphâââânnnnbibibibiệệệệttttTrongPHP,tênbiếncócáchviếtphânbiệt,nghĩalà$uservà$Userlàhoàntoànkhácnhau.Vàingườidùnglợidụngđiểmnà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ỗitênbiến,trongcùngtầmvực(scope),nêncólàtuyệtđốiduynhất.1.2.1.2.1.2.1.2.TTTTêêêênnnnququququáááángngngngắắắắnnnnNhiềungườisửdụngnhữngchữviếttắtđầu(crypticacronym)bíẩnchocácbiếncủahọ,đểrồisaunàyhốitiếcvìquênmấthọđãmuốnámchỉđiềugìkhiđó.Tênbiếnnênmôtảnộidungnó(sẽ)chứa,dùngnguyêntừhoặcnhữngchữviếttắtcóthểhiểuđược.1.3.1.3.1.3.1.3.TTTTêêêênnnnququququááááddddààààiiiiỞkhíacạnhkhác,vàingườilạisửdụngtênbiếnquádài.Nóichung,tênbiếnkhôngnêndàiquáhaitừ.Haitừcóthểđượctáchbiệtbằngdấuphâncách"_"hoặclàviếthoachữđầucủatừthứhai.1.4.1.4.1.4.1.4.ThThThThóóóóiiiiquenquenquenquenttttốốốốttttDướ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);PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology11111111Dormitory204.B518:20PMApril7,20061.5.1.5.1.5.1.5.ThThThThóóóóiiiiquenquenquenquenxxxxấấấấuuuuDướ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.ĐặĐặĐặĐặttttttttêêêênnnnhhhhààààmmmmMọikháiniệmápdụngchotênbiếncũngápdụngchođặttênhàm.Tuynhiên,ngữphápđóngvaitròđặcbiệttrongcáchàm.CáchàmPHP,địnhnghĩasẵnhoặcdongườidùngđịnhnghĩa,làkhông-phân-biệt-cách-viết(notcasesensitive)2.1.2.1.2.1.2.1.DDDDùùùùngngngngđộđộđộđộngngngngttttừừừừHàmcủaPHPtươngđươngvớimộtđộngtừkhinói.Tênhàm,dođó,nênđượchướnghànhđộng(actionoriented).Nócũngnênđượcdùngởthìhiệntại.Thídụ,bạncómộthàmtạomộtsốngẫunhiênvớiphânbốGausse(agaussianrandomnumber),bạnnênđặttênnólàgenerate_gaussian_rand().Chúýcácsửdụngđộngtừhànhđộngtrongtênhàm.Nósẽđặthàmvàongữcảnhthíchhợp<?phplist($num1,$num2)=generate_gaussian_rand();list($num3,$num4)=generate_gaussian_rand();?>Đểsosánh,hãyxemthídụ:<?phplist($num1,$num2)=gaussian_rand_generator();list($num1,$num2)=gaussian_rand_generator();?>Bạncóthấysựkhácbiệt?Thídụthứhaisửdụngdanhtừ,mặcdùvẫnchuyểntảiđượcmụctiêucủahàm,nhưngnóngănngườitađọcmộtcáchtrôichảy.Hãysửdụngđộngtừ!13.13.13.13.KhKhKhKhôôôôngngngngsuysuysuysuynghnghnghnghĩĩĩĩththththấấấấuuuuđáđáđáđáo:o:o:o:CSDLCSDLCSDLCSDL&&&&SQLSQLSQLSQLSốcáchngườitatruycậpcơsởdữliệu(CSDL-database)vàlấykếtquảnhiềuđếnmứcthựcsựngạcnhiên.Nhữngthídụtôiđãgặpbaogồmnhữngtổhợplệnhifvàvònglặpdo..while,cáccâugọinhiềulần,vàcáchàmsql_result()trongvòngfor.Nhữngngườinàycónghĩhọđanglàmgìkhông?Việcviếtcácmã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đúngcôngviệc,kếtquảlàlàmchocácôngchủquăngthờigianvàtiềnbạcrađường.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology12121212Dormitory204.B518:20PMApril7,2006Sựlấymẫukhôngchínhxáclàmộtthídụhayvềvấnđềnày.Vàingườiviếtlệnhkhôngdànhthờigianđểnghĩthấuđáo.Đúnglàkhôngchỉcóduynhấtmộtcách“đúng”đểlấymẫudữliệu,nhưngnócórấtnhiềucáchkhôngđúng.Phầnnàybaogồmcácchủđề:ÁpdụngsaicáchàmvềCSDLDùngsaiSQL:khônglấynhữngthứbạncầnDùngPHPđểsắpxếpkếtquả1.1.1.1.DDDDùùùùngngngngsaisaisaisaiccccáááácccchhhhààààmmmmCSDLCSDLCSDLCSDLMộtđoạnmãPHPđãdùngcúphápsauđểlấykếtquảtừCSDL(presentedbelowusingageneralizedsetofSQLfunctions):if(!($mautin=sql_fetch_row($truyvan))){print"Motloixayra:Khongtimthaymautinnao!";exit;}do{print"$mautin[0]:$mautin[1]\n<br>\n";}while($mautin=sql_fetch_row($truyvan));ChChChChúúúúýýýý::::Ởtrên,vàcácthídụsaunữa,$truyvandiễntảhandlehoặcpointerđếnmộttậpkế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ộtvàivấnđềvớiđoạnmãtrên:Nókiểmtracáctrườnghợp“khôngtìmthấy”("noincidents"case)bằngcáchlấymộtdòngNókhônglưukếtquảvàomảngliênkết(associativearray)1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratratrtrtrtrườườườườngngngnghhhhợợợợppppkhkhkhkhôôôôngngngngttttììììmmmmththththấấấấy:y:y:y:ccccááááchchchchllllààààmmmmsaisaisaisaiBằngcáchdùngsql_fetch_row(),PHPchủtrươngmộtcáchtiếpcậnhàmẩnchoviệcxácđịnhcókếtquảtìmthấyhaykhông.Mộtcáchkháctrựctiếpvàtườngminhlàđếmsốdòngcủakếtquảbằngsql_num_rows()nhưdướiđây:<?phpif(sql_num_rows($truyvan)<=0){print"Motloixayra:Khongtimthaymautinnao!";exit;}while($mautin=sql_fetch_row($truyvan)){print"$mautin[0]:$mautin[1]\n<br>\n";}?>1.2.1.2.1.2.1.2.TTTTừừừừbbbbỏỏỏỏvvvvòòòòngngngngllllặặặặppppDo..WhileDo..WhileDo..WhileDo..WhileTrướchếtvàtrênhết,vònglặpthôtụcdo..whilekhôngbaogiờcầnnữavìkhidùngsql_num_row(),chúngtakhôngphảilấydòngđầutiêncủakếtquảkhimuốnkiểmtrakếtquảtrống.Thídụcũđãdiễntảmộtthídụm trong ó,nếukếtquảkhôngrỗng,dòngđầutiênđãđượclấybằnghàmsql_fetch_row()trongcâulệnhif.Cấutrúcdo..whilecầnthiếttrongtrườnghợpnàyvìkhiđó,bộđếmcủaCSDLđãtănglênvàchuyểnsangdòngkếtiếp.Dođó,bạnphảixửlí(lệnhdo)dòngđầutiênvìnóđãđượclấy.Cáclệnhtiếptheolấycácdòngkế,vàcứthế.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology13131313Dormitory204.B518:20PMApril7,2006Tạisaovòngdo..whiledo..whiledo..whiledo..whilebịcoinhưthôtục,xấuxa(nasty)?Trongthídụtrên,chỉcó1lệnhinkếtquảtrongvònglặp.Hãytưởngtượng,nếucó10lệnh ,người ọcmãphảitìmđiềukiệnwhilesaucáccâulệnhđó.Mộtcôngviệcphiềntoái.ĐiềukiệnWhilebắtđầucấutrúcthườngxuyênhơnlàkếtthúc.Mộtnhànghiêncứusẽphảicẩnthậnhơnđểkhôngnhầmlẫnđiềukiệnwhilecuốivớiđiềukiệnwhileđầu.1.3.1.3.1.3.1.3.GiGiGiGiữữữữmmmmọọọọiiiiththththứứứứggggọọọọnnnnggggààààngngngngvvvvààààđơđơđơđơnnnngigigigiảảảảnnnnVớitrườnghợpkếtquảrỗng,sql_num_rows()đưađếnngaykếtquả,trongkhisql_fetch_row()thìkhôngsql_fetch_row()sql_fetch_row()sql_fetch_row()sql_fetch_row()nóirằng"Tôitìmthấy0dòngtrongtậpkếtquả.Điềunàynghĩalàcó0kếtquả”(Ifoundnorowsintheresultset.Thismustmeanthattherearenone.)sql_num_rows()sql_num_rows()sql_num_rows()sql_num_rows()nóirằng“Sốdòngtrongkếtquảlà0”(Thenumberofrowsintheresultsetis0).Nhưngđiềuđóthựcsựtạonênsựkhácbiệtnào?Xétcùngmộtsựsosánh,nhưngbâygiờlàtrongngữcảnhcủađiềukiệnifvàcủabiểuthức ,trong oạnlệnhgiả(Pseudo-code):****if(!($mautinif(!($mautinif(!($mautinif(!($mautin====sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan))){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}: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;$mautinkhôngphảilàzerovàcógiátrịlàTrue.Dođó!(True)=False,vàtiếptụcvớ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){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}:ođếmsốdòngtrongtậpkếtquả.oNếunhỏhơnhaybằng0,inthôngbáolỗi.oNếukhông,tiếptục.Biểuthứcnàodểhiểuhơn?Rõrànglàcáchđếmsẽtrựctiếpvàgọngànghơn.Sựkhácbiệtthựctếlàgì?Vớimộtlệnhifđơngiản,chúngtakhôngthuđượclợinhều.Tuynhiên,vớihơn10000dònglệnh,hãydànhthờigiannghĩđếncáchrõràngnhất,nósẽtiếtkiệmchongườiphântíchchươngtrìnhnhiềugiờsuynghĩa.Lợiíchkháccóthểkểđếnlàchươngtrìnhcủabạnsẽnhanhhơnvàdễpháttriểnhơn.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology14141414Dormitory204.B518:20PMApril7,20061.4.1.4.1.4.1.4.KhiKhiKhiKhimmmmààààDBMSDBMSDBMSDBMSccccủủủủaaaabbbbạạạạnnnnkhkhkhkhôôôôngngngnghhhhỗỗỗỗtrtrtrtrợợợợsql_num_row()sql_num_row()sql_num_row()sql_num_row()VàiDBMScóthểkhônghỗtrợhàmsql_num_row().TôixinchiasẻvớibạnnếuDBMScủabạnlàmộttrongsốđó.Bạnsẽphảitìmtrongkếtquảrỗngbằngcáchlấydòng.Tuynhiên,trongtrườnghợpnày,nónêndùngmộtbiếnbooleannhưsau:<?php$timthay=false;while($mautin=sql_fetch_array($truyvan)){$timthay=true;}if(!$timthay){print"Loi!";}?>1.5.1.5.1.5.1.5.LLLLấấấấyyyykkkkếếếếttttququququảảảả::::hhhhããããyyyychchchchọọọọnnnnccccááááchchchchccccóóóóííííchchchchVấnđềthứhaitrongđoạnmãnàylànódùngsql_fetch_row()đểlấytậpkếtquả.Hàmsql_fetch_row()chỉtrảvềmảngđánhchỉsố,trongkhiđósql_fetch_array()trảvềmảngđánhchỉsốvàmảngdùngchuỗi.$mautin=sql_fetch_array($truyvan);print$mautin[1];//Cotthu2print$mautin[name];//TencotChChChChúúúúýýýý::::Cónhiềuquyướckhácnhauvềviệcdùngdấunháykhithêmmộtđốisốkiểuchuỗi.Trongthídụvềtêncộtởtrên,vàsuốtbàiviếtnày,nósẽđượcbỏ.Từquanđiểmcủanhàpháttriển,hàmnàocólợihơn?Mảngdùngchuỗigiúpchongườiđọchiểuđượcbạnđanglấycáigìchỉthôngquaviệcđọcmã,nhưthídụđúngdướiđây:<?phpif(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.KhiKhiKhiKhinnnnààààoooosql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)nnnnêêêênnnnđượđượđượđượccccddddùùùùngngngngTôikhôngthựcsựlàfancủathesql_fetch_row().Tuynhiên,cómộttìnhhuốngmàdùngnókhônggiảmkhả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.Đôikhibạnđểchongườidùngtựđịnhnghĩacâutruyvấn.Trườnghợpnàybạnsẽkhôngbiếtcáccộttrongkếtquả.Dođó,dùnghàmsql_fetch_row()kèmvớicount()sẽxửlíhiệuquảcáccộttrongmộthàng:<?phpfor($i=0;$i<count($mautin);$i++){print"Column".($i+1).$mautin[$i]."\n<BR>\n";}?>2.2.2.2.DDDDùùùùngngngngsaisaisaisaiSQL:SQL:SQL:SQL:khkhkhkhôôôôngngngngllllấấấấyyyynhnhnhnhữữữữngngngngggggììììbbbbạạạạnnnnccccầầầầnnnnPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology15151515Dormitory204.B518:20PMApril7,2006Nhưlàvấnđềcủathựchành,đơngiảnlàsẽsailầmkhidùngPHPxửlímọidòngcủaCSDL.TôiđãbắtgặpngườitadùngPHPđểchạymộtchươngtrìnhtìmkiếmđơngiảntrên2MBdữliệuvàtựhỏitạisaocáingônngữnàychạylâuthế.Lấy2MBdữliệutừCSDLcóthểlàmbạnchờmãimãi.Ngônngữtruyvấnchuẩn(StandardStandardStandardStandardQueryQueryQueryQueryLanguageLanguageLanguageLanguage----SQLSQLSQLSQL)đượ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ằngmãSQLđangdùngchưađượctốiưuhoá.2.1.2.1.2.1.2.1.MMMMệệệệnhnhnhnhđềđềđềđềWHEREWHEREWHEREWHEREMộtthídụkinhđiểnvềsựhiểuquảcủaSQLliênquanđếnmệnhđềwhere.ĐoạnmãsausẽlấycáckếtquảvàinratênvàmãsinhviêncủasinhviêncóMASV='511203008':<?phpinclude(“includes/taptinketnoi.inc”);$strsql="SELECTMASV,HOTENFROMSINHVIEN";$truyvan=@sql_query($strsql,$ketnoi);if(!$truyvan){die(sprintf("LOI:[%d]:%s",sql_errno(),sql_error()));}if(@sql_num_rows($truyvan)<=0){die("KhongketquatimduoctuCSDL!");}while($mautin=@sql_fetch_array($truyvan)){if($mautin[MASV]==“511203008”){print"MASV:$mautin[MASV]\n<br>\n";print"Hoten:$mautin[HOTEN]\n<br>\n";break;}}?>Đoạnmãtrênchưađượctốiưu:chúngtađangdùngPHPđểtìmkiếmtrongtoànbộCSDL!NếunhưđiềunàykhôngquantrọngđốivớicácCSDLnhỏ,khikíchthướcCSDLtănglênbạnsẽcảmthấymộtcúđấmnặngnềvềhiệunăng.Lờigiảirấtđơngiản:sửacâuSQLđểchứamệnhđềWHERE:$strsql="SELECT*FROMSINHVIEN";$strsql.="WHEREMASV='511203008'";PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology16161616Dormitory204.B518:20PMApril7,2006MệnhđềWHEREchophépbạntìmkiếmchọnlọchơn.Giớihạnchọnlọccủamệnhđềwherechínhlàmộthàmvớiđốisốcủanó.Trongthídụtrênđốisốlà"MASV='511203008'".Bâygiờchúngtađãchọnđượcdữliệucầnthiết,bạnchỉviệcdùngPHPđểinrasauđó:if(@sql_num_rows($truyvan)!=1){die("KhongdungsomautinnhanduoctuCSDL!");}$mautin=@sql_fetch_array($truyvan);print"Hovaten:$mautin[HOTEN]\n<br>\n";print"MASV:$mautin[MASV]\n<br>\n";3.3.3.3.DDDDùùùùngngngngPHPPHPPHPPHPssssắắắắppppxxxxếếếếppppkkkkếếếếttttququququảảảảNhiềungườilấydữliệuởtìnhtrạngkhôngcóthứtự,nhưngrồiđoạnmãPHPtiếptheolạisắpthứtựchúng.NênchớrằngsắpxếpbằngSQLnhanhhơnPHP.DùngcúphápORDERBYcủaSQLđểsắpxếpthayvìhàmksort()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ệungayvàolúcnóđượcđịnhnghĩa?Nógiúpchúngtađỡphảiduyệtquatậpkếtquảlầnthứhai.Dovậy,bỏhàmksort()rakhỏichươngtrìnhtrênvàthayđoạnmãSQLbằngđoạndướiđây,códùngdùngcúphápORDERBY:$strsql="SELECTname,email,phoneFROMsome_table";$strsql.="WHEREnameISLIKE'%baggins'ORDERBYname";12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology17171717Dormitory204.B518:20PMApril7,2006KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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";}?>12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology18181818Dormitory204.B518:20PMApril7,2006Luônđảmbảorằng,khibạnlàmviệcvớicáctiếntrìnhhoặctậptinngoàiPHP,mọithứđềuvậnhànhđúng.Mộtthídụtuyệtvờilàviệckiểmtrađầuracủamộtlờigọihệthốngkhidùnghàmsql_connect().XácnhậnđầurađểkiểmtraliênkếtđếnCSDLlàđúng.Làmsaiđiềunàycóthểdẫnđếncáctruyvấnhỏngvàmấtdữliệutrongkhithậmchí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.ĐặĐặĐặĐặttttmmmmứứứứccccerror_reportingerror_reportingerror_reportingerror_reportingllllààààE_ALLE_ALLE_ALLE_ALLtrongtrongtrongtrongttttậậậậpppptintintintinphp.iniphp.iniphp.iniphp.iniHãyđảmbảobạncấuhìnhvớimứcđộbáolỗicaonhấtcóthể.Nếubạnkhôngđặtnóởmứccaonhất,ítnhấtlàtrongquátrìnhtìmlỗi(debugging),bạncóthểbỏquanhữnglỗinhưlàbiểuthứcchínhquy(regularexpressions)khônghợplệvàcácgiátrịkhôngchínhxác.XemlạilầnnữathídụtôiđãđưatrongphầnKiểmtrakếtquảlờigọihàm,ởdướiđây.Giảsửbạnđặterrorreportingởmứcthấp,E_ERROR.Chúýrằngkếtquảinrakhichươngtrìnhthihànhhàmdo_math:khôngcóthôngbáoillegaldivisionbyzerođãtừnghiệnralầntrước,phần$i=$j=0đơnthuầnkhônghiệnkếtquả.<?phperror_reporting(E_ERROR);mt_srand((double)microtime()*1000000);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";}?>Kếtquảhiệnra:-5148.25-5271-323.75-4931-7713.5?-4702.5-488.5-928.5-1394.752.2.2.2.BBBBộộộộququququảảảảnnnnllllííííllllỗỗỗỗiiiitutututuỳỳỳỳchchchchỉỉỉỉnhnhnhnhPHPthườ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àmset_error_handler().Hàmset_error_handler()cóthểđượcdùngđểghilạicáclỗixảyravớichươngtrìnhcủabạn.Thayvìlàmphiềnngườidùngvớicácthôngbáolỗi,bạncóthểghilạichoriêngbạn,bằngcáchđặtmộthàmquảnlílỗituỳchỉnh(acustomerrorhandlingfunction).PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology19191919Dormitory204.B518:20PMApril7,2006Trongthídụdưới,set_error_handler()đượcdùngđểchỉđịnhhàmerror_handler()làbộquảnlílỗimặcđịnh.Khimộtlỗixảyra,error_handler()đượcgọivàhàmPHPerror_log()đượcdùngđểghilỗivàotậptinerror_file.NếumàlỗithuộcloạiE_ERROR,chúngtasẽthoátchươngtrìnhvàinthôngbáolỗi.<?php//voiderror_handler(stringtype,stringmessage,stringfile,intline)//Customerrorhandler,setbytheset_error_handler()//function.functionerror_handler($type,$message,$file=__FILE__,$line=__LINE__){error_log("$message,$file,$line",3,'error_file');if($type&E_ERROR){print'Anerroroccurred,ithasbeenloggedanditwillbeaddressed.';exit;}}set_error_handler('error_handler');?>11.11.11.11.LLLLạạạạmmmmddddụụụụngngngngHHHHướướướướngngngngđốđốđốđốiiiittttượượượượngngngng(H(H(H(HĐĐĐĐT)T)T)T)Môhìnhhướngđốitượnglàmộtkháiniệmtuyệtvời.Nócórấtnhiềulợiđiểm,màđángchúýnhấtlàkhảnăngdùnglạimãdễdàng.Tuynhiê,theonhưchúngtađượchiểu:PHPkhôngphảilàmộtngônngữHĐT.MặcdùPHPcómộtsựhỗtrợđầyđủvềHĐT,nókhônghiệuquảlẫnkhôngkhônngoannếudùngtínhnăngHĐTcủanókhibạncócáchàmkhácđểđạtđượccùngkếtquả.LídolàsựhỗtrợHĐTcủaPHPkhôngđượcpháttriểnmạnh.Trongkhicóhầuhếtcácphầntửchínhyếu,PHPvẫncònthiếuvàitínhnăngcaocấp(nhưcáckháiniệmprotected,private)màmộtngônngữHĐTthựcsự(thídụnhưC++,Java)phảicó.CácmãhỗtrợHĐTcủaPHPkhôngđượctinhchỉnhvàcũngkhônghiệuquả.NghĩalànếubạndùngmôhìnhHĐTtrongPHP,bạncóthểlàmchậmchươngtrìnhđángkể.Nóichung,mộtứngdụngdùngHĐTsẽchậmđi,cũngnhưlàbạndùngeval()thìsẽchậmhơnlàdùngmãbìnhthường.ĐểminhhoạđầyđủhơnviệcHĐTcógìđókhôngtốt,tôiđãtừngphảidùngnhữngtínhnăngvàkháiniệmcaocấpcủaPHP,mộtvàitrongsốđóthậmchíchưacótàiliệuchỉdẫn.1.1.1.1.ChChChChúúúúngngngngtatatataccccóóóóththththểểểểllllààààmmmmggggììììmmmmààààkhkhkhkhôôôôngngngngccccầầầầnnnnHHHHĐĐĐĐ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ạpmà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ìnhrấtmạnhcóthểđượcviếtmàkhôngdùngmấtcứkháiniệmvàmôhìnhHĐTnào(PHPđượcviế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ạochươngtrìnhcótínhkếtdínhvàdễmởrộngmàkhôngdùngmôhìnhHĐT:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology20202020Dormitory204.B518:20PMApril7,2006TạomộtAPITạomộttrìnhtựtênNhómcáchàmliênquanvàomộttậptin1.1.1.1.1.1.1.1.TTTTạạạạoooommmmộộộộttttAPIAPIAPIAPIÁpdụng3lớpchochươngtrìnhcủabạn:Thứnhất,cáchàmthựcsựthựchiệncôngviệccủabạnThứhai,mộthàmAPI.ĐâylàhàmgiúpbạnxâydựngcácchươngtrìnhđặcthùChươngtrìnhMortgageRate.php<?php//Theinternalfunctionsarelayer1//Internalfunctiontocalculatethecorrect//interestratetobeusedgiventheamountpermonth//andthetimeitistobepaidinfunction_mort_find_interest_rate($total){if($total<30000)return(7.4);elseif($total>30000)return(3.2);elseif($total>50000)return(2.5);elsereturn(1.7);}//TheAPIislayer2//doublecalculate_mortgage_rate(intmoney,inttime,intmonth)//Calculatethemortgagerategiventhe//thetotalmoney,timeitspaidoverand//theintervalsfunctioncalculate_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//fromaforminclude_once'MortgageRate.php';$price=calculate_mortgage_rate($money,$time,$period);print"Your$periodmonthcostis$price";?> ... PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology1111Dormitory204.B518:20PMApril7,2006àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâmđếnviệctránhnhữnglỗithườnggặpkhisửdụngPHP .Người ọcphảibiếtcáccúphápcủaPHP,vànênbiếtcôngdụngcủacáchàmtrongPHP.MộttrongnhữngđiểmmạnhnhấtcủaPHPvôtìnhtrởthànhmộttrongnhữngđiểmyếunhấtcủanó:ttttíííínhnhnhnhddddễễễễssssửửửửddddụụụụngngngng.NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnrarằng:sửdụngđúngPHPPHPPHPPHPccccòòòònnnnkhkhkhkhóóóóhhhhơơơơnnnnccccááááccccngngngngôôôônnnnngngngngữữữữkhkhkhkháááácccc.Trongloạtbàinàysẽlầnlượtnêura21lỗi,từnhữngsailầmgiáokhoa(làmscripttrởnênchậmvàkhóquảnlí)đếnnhữngsailầmchếtngười-cóthểxemlànguồngốccủanhữngsailầmsơđẳng.PHẦN1:7LỖIGIÁOKHOA21.21.21.21.SSSSửửửửddddụụụụngngngngprintf()printf()printf()printf()khkhkhkhôôôôngngngngththththííííchchchchhhhhợợợợppppHàmprintf()dùngđểindữliệucóđịnhdạngNócóthểđượcdùng,thídụ,khibạnmộtinmộtsốkiểudoublevới2s lẻ, hoặctrongbấtkìtìnhhuốngnàobạnmuốnthayđổiđịnhdạngtrướckhiin.Thídụdướiđâyminhhoạcáchdùngđúngcủaprintf():địnhdạngsốPivớiđộchínhxáctheoýmuốnMMMMããããllllệệệệnhnhnhnh(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);?>ChChChChúúúúýýýý....Tôiđãtừnggặpnhữngngườisợdùngprintf(),thayvàođólạidùngnhữnghàmđịnhdạngtựviết,dàiđến30-40dòng ,trong imộtcâuprintf()cóthểlàmmọithứanhtamongmuốn.Nhiếulậptrìnhviêndùngsaiprintf():incácbiến,cácgiátrịtrảvềcủahàmhoặcthỉnhthoảng,chỉlàdữliệuthôngthường.Thườngxảyratronghaitìnhhuống:Câulệnhprint()thíchhợphơnHiểnthịgiátrịtrảvềcủamộthàm1.1.1.1.KhiKhiKhiKhinnnnààààooooprint()print()print()print()ththththííííchchchchhhhhợợợợpppphhhhơơơơn?n?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='khoa_computer2004@yahoo.com';printf("Tencuatuila:%s\n<br>\nHiendangla:%s,%s\n<br>\nLienhevoitoiquaEmail:%s\n<br>\n",$name,$nghenghiep,$diachi,$email);?>Hàmprint()print()print()print()cóthểdùngthaychoprintf()nhưsau:BPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology2222Dormitory204.B518:20PMApril7,2006printprintprintprint"Tencuatuila:$name\n\n\n\n<br>\n\n\n\nHiendangla:$nghenghiep,$diachi\n\n\n\n<br>\n\n\n\nLienhevoitoiquaEmail:$email\n\n\n\n<br>\n\n\n\n";;;;Khikhôngcầnđịnhdạngsửliệu,dùngprint()thaychoprintf()cónhữnglợiíchsau:ThiThiThiThihhhhàààànhnhnhnhnhanhnhanhnhanhnhanhhhhhơơơơn:n:n:n:hàmprintf()địnhdạngdữliệucủabạntrướckhihiểnthị,nósẽchậmhơnprint()hoặcecho()MMMMããããssssáááángngngngssssủủủủ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ến2.2.2.2.DDDDùùùùngngngngprintf()printf()printf()printf()đểđểđểđểxuxuxuxuấấấấttttddddữữữữlilililiệệệệuuuutrtrtrtrảảảảvvvvềềềềttttừừừừggggọọọọiiiihhhhààààmmmmMộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhàmđếmdướiđây:Khixuấtgiátrịdohàmtrảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây:Dùngtoántử.nhanhhơnviệcdùngprintf()20.20.20.20.ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaa(semantics)(semantics)(semantics)(semantics)NhiềulậptrìnhviênsửdụngPHPmàkhôngbiếtđếnnhữngđiểmtinhtếcủangônngữnày.Mộttrongnhữngđiểmđólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa(semantics).CCCCúúúúphphphphááááp:p:p:p:nhữngquytắcđịnhnghĩamộtphầntử.Thídụ:dấu$đểtrướcdùngđịnhnghĩabiến,dùngdấu()vàcácthamsốđịnhnghĩamộthàm...NgNgNgNgữữữữnghnghnghnghĩĩĩĩa:a:a:a:nhữngquytắcápdụngtrongcúpháp.Thídụ:mộthàmcó2biếnđịnhnghĩabởicúphápcủanó,haibiếnnàycókiểustring-đólàngữnghĩa.TrongmộtngônngữlỏnglẻonhưPHP,bạncónhiềulựachọnđểviếtlệnh.Cácbiếnkhôngcầncókiểuxácđịnh...Thídụsaumởtậptinvàintừngdòng:Thídụtrênsẽtạolỗi:Warning:Warning:Warning:Warning:SuppliedSuppliedSuppliedSuppliedargumentargumentargumentargumentisisisisnotnotnotnotaaaavalidvalidvalidvalidFile-HandleFile-HandleFile-HandleFile-HandleresourceresourceresourceresourceininininC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpononononlinelinelineline4.4.4.4.<?printfprintfprintfprintf("%doccurrencesof%sfound.",count($truyvan),$search_term);?><?printprintprintprintcount($truyvan)."occurrencesof$search_termfound.";?><?$fp=@fopen('vanban.txt','r')ordie('Khongthemofilevanban.txt');while($line=@fgets("$fp",1024))//Loi{print$line;}@fclose("$fp")//Loiordie('Khongthedongvanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology3333Dormitory204.B518:20PMApril7,2006Đólàdobiến$fpđặttrongdấunháyképnênđượcchuyểnthànhchuỗi.Thếmàhàmfopen()nhậnmộtđịnhdanhtàinguyên(resourceidentifier)trongthamsốđầucủanó,chứkhôngnhậnmộtchuỗi.Đểgiảiquyếtvấnđề,bạnchỉđơngiảnbỏdấunháyképđi1.1.1.1.CCCCóóóóththththểểểểtrtrtrtráááánhnhnhnhviviviviệệệệccccááááppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩa?a?a?a?Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomizeyourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoreticallypossibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđượckhông?Thídụtrêncủachúngtatạoramộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncácscriptđểthíchhợpvớimộtkịchbảnkhácthườnghoặcvớicácđòihỏicủathôngtinra.Dođó,ítnhấttrênlíthuyết,bạncókhảnăngtránhviệcápdụngsaingữnghĩa.Vậy,bạncầnbiếtnhữnghậuquảcóthểcó(possibleoutcomes)nếubạnquyếtđịnhhọcvềngữnghĩa.Ápdụngsaidẫnđếnnhữnglỗikhátinhvinếubạnkhôngchúý.Nếubạnmuốntuỳbiếnscript,bạncầnhiểunhữngchủđềchínhsau:KiKiKiKiểểểểu:u:u:u:trongPHP,mỗibiếncómộtkiểuxácđịnhởmộtthờiđiểmxácđịnh,chodùbạncóthểtựdochuyểnđổikiểumộtbiến.Nóimộtcáchkhác,khôngcóbiếnnàolạikhôngkèmtheotínhchấtcủakiểucủanó.PHPcó7kiểucơbản:boolean,resource,integer,double,string,arrayvàobject.TTTTầầầầmmmmvvvvựựựực:c:c:c:trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiếncóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbảnvề"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ằngkhô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.19.19.ThiThiThiThiếếếếuuuughighighighichchchchúúúúTheoýtôi,mãnguồnthiếughichúlàcănnguyêncủasựlậptrìnhíchkỉ.Nódẫntớinhữnghiệuchỉnhsailầm,hiểusaiýnghĩavàlàmngườiđọcmệtmỏi.Nóichung,lậptrìnhghichú(inlinedocumentation)đượcmọingườikhẳngnhậnlàđiềutốt,nhưnghiếmkhinótồntại.Mộtvấnđềkháclàquánhiềughichú.Dùhiếmgặp,nhưngnólàmchocácđoạnmã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";//Vonglapforinratatcatuoitruocdofor($idx=0;$idx<$age;$idx++){<?$fp=@fopen('vanban.txt','r')ordie(‘Khongthemofiletailieuphp.txt');while($line=@fgets($fp,1024)){print$line;}@fclose($fp)ordie(Khongthedongfilevanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology4444Dormitory204.B518:20PMApril7,2006//Inratuoicanhanprint"$idxyearsold\n<br>\n";}//KetthucmaPHP?>1.1.1.1.BaoBaoBaoBaonhinhinhinhiêêêêuuuughighighighichchchchúúúúththththììììđủđủđủđủ????Nhiếuđếnmứcnào,điềuđótuỳthuộcngânsáchcủabạn,vàochínhsáchcủacôngtyvàvàođộphứctạpcủachươngtrình.Tuynhiên,cũngcómộtvàigợiýchobạnLuôncómộtmôtảngắnvềmụcđíchcủahàmngaytrướcđịnhnghĩacủahàmđóThêmghichúvàonhữngchỗcóthểbịhack,hoặcnhữngchỗtưởngrằngsainhưnglạichạyđúngNếumộtđoạnmãnàođócóthểgâynhầmlẫn,hãythêmmộtítghichúvềmụcđíchcủađoạnđó.SaunàybạnsẽthấyđượclợiíchcủanóDùngmộtkiểughichúnhấtquán,/*/*/*/**/*/*/*/hoặclà////////(tr(tr(tr(tráááánhnhnhnhddddùùùùngngngng#)#)#)#)Dướiđâylàmộtthídụvềghichútốt:<?//Random_Numbers.lib//Generatedifferenttypesofrandomnumbers.mt_srand((double)microtime()*1000000);//mixedrandom_element(arrayelements[,arrayweights])//Extractarandomelementfromelements.Weightsis//therelativeprobabilitythateachelementwillbe//selected.functionrandom_element($elements,$weights=array()){//Theremustbeexactlythesameamountofelementsas//thereareweightsforthisalgorithmtoworkproperlyif(count($weights)==count($elements)){foreach($elementsas$element){foreach($weightsas$idx){//Note:wedon'tuse$idx,sincewe//don'twanttooverrideelements.$randomAr[]=$element;}}}else{$randomAr=$elements;}$random_element=mt_rand(0,count($randomAr)-1);return$randomAr[$random_element];}?>18.18.18.18.NhiNhiNhiNhiềềềềuuuubibibibiếếếến,n,n,n,ttttốốốốnnnnnhinhinhinhiềềềềuuuuththththờờờờiiiigiangiangiangianCóvàingườibịámảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthểviếtnhưthếnày:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology5555Dormitory204.B518:20PMApril7,2006Tạisaophảidùngbiếntrunggian?NókhôngcầnthiếtRủithay,cóvẻnhưrấtnhiềungườikhóbỏđượcthóiquenxấunày.Biếntạmlàmchậmthờigianthihànhchươngtìnhcủabạn.Tốthơnlànênbỏquađóvàgộpcáclờigọihàmvớinhau.Nhữngngườidùngbiếntạmthườnglàmchươngcủahọchạychậmđến25%.Mộtlídokhácđểtránhcóquánhiềubiếntạmlàvìtrôngnókhôngđượcđẹpmắt.Tronghaithídụtrên,thídụnàosúctíchhơn?Thídụnàolàmconmắtdễchịuhơn?Dùngquánhiềubiếntạmcóthểdẫnđếnmãchươngtrìnhkhóđọcvàkhôngsúctích.1.1.1.1.LLLLợợợợiiiiđđđđiiiiểểểểmmmmccccủủủủaaaaddddùùùùngngngngbibibibiếếếếnnnnttttạạạạmmmmCácbiếntạmcólợitrongviệcthaythếcáchàmhaybiểuthứcdàilêthê.Nócóvaitrònhưbídanhgiả.Điềunàyđặcbiệtđúngkhibạndùngmộthàmhaybiểuthứcnhiềulần.Xemxétthídụđây,nókhôngdùngnhiềubiếnhơnmứctốithiểuNộidungtronghàmimplode()dàivàdođókhóđọc.Dùngmộthoặcnhiềubiếntạmcóthểgiúpchúngta:2.2.2.2.CCCCáááácccclulululuậậậậttttchungchungchungchungccccủủủủaaaangngngngóóóónnnntaytaytaytayccccááááiiiiKhiquyếtđịnhcódùngbiếntạmhoặckhông,bạnnênsuynghĩvề2câuhỏi:Bạncódùngbiếnđóítnhấthailần?Tínhđọcđượccủamãcótăngđángkểkhông?Nếuítnhấtmộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợpcáchàmlại(nếucần).17.17.17.17.ViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnMộtsốnơiphổbiếnmãnguồncácscriptPHPchủtrươngđổitêncáchàmsẵncóđểtạosựdễdàngchocáclậptrìnhviênchuyểntừVBsang.Thídụ:<?$tmp=date("Fd,h:ia");/*ieJanuary3,2:30pm*/print$tmp;?><?printdate("Fd,h:ia");?>//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){returnimplode("",array_reverse(preg_split("//",$str)));}//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){$characters=preg_split("//",$str);$characters=array_reverse($characters);returnimplode("",$characters);}<?functionlen($str){PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology6666Dormitory204.B518:20PMApril7,2006LạicómộtsốngườicốgắngviếtlạicáchàmPHPthô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àmchonhữngngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcảmthấycóquánhiềuhàmdưthừa.Họtựhỏitạisaobạnlạiđiđịnhnghĩahàmtheokiểuđó,thayvìsửdụngcáchàmđịnhnghĩasẵnbởiPHP.Thứhai,địnhnghĩahàmnhưvậycũngsẽlàmchậmchươngtrìnhcủabạn(mộtcáchkhôngcầnthiết).Khôngchỉphảixửlínhiềumãhơn,màmỗilầngọihàmdobạnđịnhnghĩa,bạnđãtốnthờigianchochínhhàmđó,trướckhihàmnguyênthuỷđượcgọi.1.1.1.1.TrTrTrTráááánhnhnhnhviviviviếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnHãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên,mộtlậptrìnhviênkhôngthểtheokịpcáchàmcủaPHPngayđược.Vàaicóthờigianmàtracứu.Tạisaokhôngviếtlạichokhoẻ?CáchlàmcủatôilàluôncósẵnmộttàiliệuchỉdẫnPHP(PHPmanual)mỗikhiviếtchươngtrình(tácgiảbàinàydùngmộtbảnPDFcótạochỉmục,riêngtôi,ngườidịch,thìdùngmộttàiliệuCHMđầyđủthôngtinvàcócảgópýcủangườisửdụngmàbạncóthểlấyởhttp://www.php.net/docs.php).Sauđó,mỗikhiđịnhviếtmộthàmmởrộngchoPHP,tôiđọclướtquatàiliệuđểxemhàmđócóchưa.Tuynhiên,cầnchúýlà,dobảnchấtmãnguồnmởcủaPHP,bạncóthểtìmđượccáchàmdongườidùngđịnhnghĩatrướckhinóđượcthêmvàoPHP(thídụnhưhàmtìmphầntửkhácnhaugiữahaimảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlạimã(Thisdoesn'tnecessarilymeanthatyoushouldhavetocorrectthecode.-don'tunderstand)16.16.16.16.KhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnserverserverserverservervvvvààààclientclientclientclientVàilậptrìnhviêncốkếtnốicảchươngtrìnhvớinhau,nghĩalàghépchungmãHTML(client-side-phầnkhách)vớimãPHP(server-side-phầnchủ)vàotrongmộttậptinlớn.Mặcdùđiềunàytốtchocácsitenhỏ,nhưngnócóthểtrởthànhvấnđềlớnkhicácsiteđótrởnênlớnhơnvàđượcbổsungthêmtínhnăng.Lậptrìnhtheocáchnàylàmnảysinhvấnđềkhóbảotrìvàcáctậptintrởnêncồngkềnh.1.1.1.1.HHHHààààmmmmAPIAPIAPIAPIKhimuốntáchbiệtphầnkhách-chủ,bạncóvàilựachọn.Mộtcáchlàviếtnhữnghàmhiểnthịnộidunglinhđộngvàđặtchúngđúngchỗtrongtrangweb.Thídụdướiđâyminhhoạđiềunày:index.phpindex.phpindex.phpindex.php-phầnkháchreturnstrlen($str);}?>HTMLHTMLHTMLHTML<?phpinclude_once("site.lib");?><html><head><title><?phpprint_header();?></title></head><body><h1><?phpprint_header();?></h1><tableborder="0"cellpadding="0"cellspacing="0"><tr>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology7777Dormitory204.B518:20PMApril7,2006site.libsite.libsite.libsite.lib-phầnchủNhưbạnthấytrongthídụtrên,táchbiệtkháchchủlàmtăngtínhdễđọctrongchươngtrìnhcủabạn.MộtlợiíchkháclàmộtkhibạnđãcócáchàmAPIhiểnthịnộidung,bạncóthểđểchothiếtkếviênthamgiathayđổibốcụcmàkhôngcầnsửamãchươngtrình.1.1.1.1.1.1.1.1.LLLLợợợợiiiiííííchchchchccccủủủủaaaahhhhààààmmmmAPIAPIAPIAPITươngđốisángsủaNhanh,hầunhưkhônglãngphíthờigian(overhead)1.2.1.2.1.2.1.2.BBBBấấấấttttllllợợợợiiii<tdwidth="25%"><?phpprint_links();?></td><td><?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(){global$site_info;print$site_info->header;}functionprint_body(){global$site_info;printnl2br($site_info->body);}functionprint_links(){global$site_info;$links=explode("\n",$site_info->links);$names=explode("\n",$site_info->link_names);for($i=0;$i<count($links);$i++){print"\t\t\t<axhref=\"$links[$i]\">$names[$i]</a>\n<br>\n";}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology8888Dormitory204.B518:20PMApril7,2006Khôngsángsủavàdễdàngbằnghệthốngmẫu(templatesystem)CầnmộtítkiếnthứcPHPđểsửamẫu2.2.2.2.HHHHệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuMộtcáchkhácđểtáchbiệtkháchchủlàdùnghệthốngkhuônmẫu.Nghĩalà,cómộtsốđánhdấunộidungsauđódùngchươngtrìnhphântích,thaythếcácđánhdấuđóbằngthôngtincầnthiết.Thídụ,bạncóthểtạomộ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ônmẫukhátốtlàlớpFastTemplate,cóởwww.thewebmasters.net2.1.2.1.2.1.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmccccủủủủaaaahhhhệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuRấttrongsángKhôngcầnkiếnthứcPHPđểsửakhuônmẫu2.2.2.2.2.2.2.2.NhNhNhNhượượượượccccđđđđiiiiểểểểmmmmChậmhơn,bạncầnphântáchtậptinkhuônmẫu,sauđóxuấtraViệchiệnthựcphứctạphơn15.15.15.15.DDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiiiCónhiềungườicứdùngmãicácmãvàthưviệnlỗithời.ThídụnhưhọđãviếtmộthàmdùngởPHP2,vàvẫncòndùngnóởPHP4,mặcdùmộthàmcócùngmụcđíchnhưthếđãđượcthêmvàoởPHP3Dùngcáccấutrúclỗithờicóthểlàmchậmchươngtrìnhcủabạn,cũngnhưlàmchonótrởnênkhóhiểu .Người ọccácchươngtrìnhcủabạncóthểkhôngquenvớicáchàmlỗithờicủaPHP.Tuynhiên,khipháthiệnmộtđoạnmã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ắmlấy,làcúphápbeginControlStructurebeginControlStructurebeginControlStructurebeginControlStructure........endControlStructureendControlStructureendControlStructureendControlStructure;HTMLHTMLHTMLHTML<html><head><title>%%PAGE_TITLE%%</title></head><body%%BODY_PROPERTIES%%><h1>%%PAGE_TITLE%%</h1><tableborder="0"cellpadding="0"cellspacing="0"><tr><tdwidth="25%">%%PAGE_LINKS%%</td><td>%%PAGE_CONTENT%%</td></tr></table></body></html><?PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology9999Dormitory204.B518:20PMApril7,2006ĐâylàmộtthóiquenxấuvìNókhôngđượcdùngrộngrãi,chonênnhiềungườihọcsẽbịlẫnlộngiữahaicúphápNókhôngtươngthíchvớingônngữkhác,nghĩalànótrởnênkhóđọcđốivớinhữngngườitronggiaiđoạnquáđộ(mớichuyểntừmộtngônngữnàođósangPHP)Quantrọngnhất,làmộtngàynàođótínhnăngnàysẽbịxoáxổ,bắtbuộcbạnphảiviếtlạitoànbộmãcódùngnó.DấungoặcnhọnluônluônlàmộtphầncủangônngữPHP.Ởtrênchỉlàmộtthídụvềcấutrúclỗithời.Nócònnhiềunữa.Nhưmộtquytắc,bạnnêntheonhữngcácviếttrongtàiliệuPHP.Hầuhếtnóđượccậpnhậtmới.NócũngdùngcáchàmmớinhấtcủaPHPtrongthídụcủamình.NênthườngxuyênkiểmtratàiliệukhibạncóýmuốnmởrộngtínhnăngnàođócủaPHP.Theocáchnày,bạnsẽkhôngphảiviếtlạicáchàmcósẵn.TTTTổổổổngngngngkkkkếếếếttttTrongbàinàybạnđãđiqua7trêntổngsố21lỗimàlậptrìnhviênPHPmắcphải.Nhữnglỗigiáokhoanàybaogồm:SSSSửửửửddddụụụụngngngngsaisaisaisaihhhhààààmmmmprintf()printf()printf()printf()ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaaThiThiThiThiếếếếuuuuttttààààiiiililililiệệệệuuuutrongtrongtrongtrongmmmmããããngungungunguồồồồnnnnDDDDùùùùngngngngququququáááánhinhinhinhiềềềềuuuubibibibiếếếếnnnnttttạạạạmmmmViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnKhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnkhkhkhkháááách/chch/chch/chch/chủủủủDDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiii//Bad/OutdatedPracticewhile(1):print"5";if($idx++==5):break;endif;endwhile;//BetterPractice//(thecodecouldbeoptimizedthough)while(1){print"5";if($idx++==5){break;}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology10101010Dormitory204.B518:20PMApril7,2006PHẦN2–LỖINGHIÊMTRỌNG14.14.14.14.KhKhKhKhôôôôngngngngtutututuâââânnnnththththủủủủccccááááccccquyquyquyquyướướướướccccđặđặđặđặttttttttêêêênnnnMộttrongnhữnglỗinghiêmtrọngmàngườilậptrìnhcóthểphạmphảilàđịnhnghĩamộtquyướcđặttêntồi.Tôiđãtiếpquảnnhiềudựánm 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đếnmộtdựánmàngườilậptrìnhcũđãquyếtđịnhđưavàotoànbộchươngtrìnhmộtkiểuđặttênkìlạ(aFlinstonesnamingtheme),khôngphảitôiđùađâu.Cáchbạnđặttênbiếnvàhàmlàtrungtâmcủaviệcxâydựngmộtchươngtrìnhdễđọc.Cónhiềulậptrìnhviênphạmlỗikhiđặttênbiếnvàhàmmànó:quádàihoặcquángắnkhôngliênquanđếnngữcảnhkhôngđểýđếncách-viết-phân-biệt(casesensitivity)ngăncảnkhảnăngdễđọc(đặcbiệtlàcáchàm)1.1.1.1.ĐặĐặĐặĐặttttttttêêêênnnnbibibibiếếếếnnnn1.1.1.1.1.1.1.1.CCCCááááchchchchviviviviếếếếttttphphphphâââânnnnbibibibiệệệệttttTrongPHP,tênbiếncócáchviếtphânbiệt,nghĩalà$uservà$Userlàhoàntoànkhácnhau.Vàingườidùnglợidụngđiểmnà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ỗitênbiến,trongcùngtầmvực(scope),nêncólàtuyệtđốiduynhất.1.2.1.2.1.2.1.2.TTTTêêêênnnnququququáááángngngngắắắắnnnnNhiềungườisửdụngnhữngchữviếttắtđầu(crypticacronym)bíẩnchocácbiếncủahọ,đểrồisaunàyhốitiếcvìquênmấthọđãmuốnámchỉđiềugìkhiđó.Tênbiếnnênmôtảnộidungnó(sẽ)chứa,dùngnguyêntừhoặcnhữngchữviếttắtcóthểhiểuđược.1.3.1.3.1.3.1.3.TTTTêêêênnnnququququááááddddààààiiiiỞkhíacạnhkhác,vàingườilạisửdụngtênbiếnquádài.Nóichung,tênbiếnkhôngnêndàiquáhaitừ.Haitừcóthểđượctáchbiệtbằngdấuphâncách"_"hoặclàviếthoachữđầucủatừthứhai.1.4.1.4.1.4.1.4.ThThThThóóóóiiiiquenquenquenquenttttốốốốttttDướ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);PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology11111111Dormitory204.B518:20PMApril7,20061.5.1.5.1.5.1.5.ThThThThóóóóiiiiquenquenquenquenxxxxấấấấuuuuDướ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.ĐặĐặĐặĐặttttttttêêêênnnnhhhhààààmmmmMọikháiniệmápdụngchotênbiếncũngápdụngchođặttênhàm.Tuynhiên,ngữphápđóngvaitròđặcbiệttrongcáchàm.CáchàmPHP,địnhnghĩasẵnhoặcdongườidùngđịnhnghĩa,làkhông-phân-biệt-cách-viết(notcasesensitive)2.1.2.1.2.1.2.1.DDDDùùùùngngngngđộđộđộđộngngngngttttừừừừHàmcủaPHPtươngđươngvớimộtđộngtừkhinói.Tênhàm,dođó,nênđượchướnghànhđộng(actionoriented).Nócũngnênđượcdùngởthìhiệntại.Thídụ,bạncómộthàmtạomộtsốngẫunhiênvớiphânbốGausse(agaussianrandomnumber),bạnnênđặttênnólàgenerate_gaussian_rand().Chúýcácsửdụngđộngtừhànhđộngtrongtênhàm.Nósẽđặthàmvàongữcảnhthíchhợp<?phplist($num1,$num2)=generate_gaussian_rand();list($num3,$num4)=generate_gaussian_rand();?>Đểsosánh,hãyxemthídụ:<?phplist($num1,$num2)=gaussian_rand_generator();list($num1,$num2)=gaussian_rand_generator();?>Bạncóthấysựkhácbiệt?Thídụthứhaisửdụngdanhtừ,mặcdùvẫnchuyểntảiđượcmụctiêucủahàm,nhưngnóngănngườitađọcmộtcáchtrôichảy.Hãysửdụngđộngtừ!13.13.13.13.KhKhKhKhôôôôngngngngsuysuysuysuynghnghnghnghĩĩĩĩththththấấấấuuuuđáđáđáđáo:o:o:o:CSDLCSDLCSDLCSDL&&&&SQLSQLSQLSQLSốcáchngườitatruycậpcơsởdữliệu(CSDL-database)vàlấykếtquảnhiềuđếnmứcthựcsựngạcnhiên.Nhữngthídụtôiđãgặpbaogồmnhữngtổhợplệnhifvàvònglặpdo..while,cáccâugọinhiềulần,vàcáchàmsql_result()trongvòngfor.Nhữngngườinàycónghĩhọđanglàmgìkhông?Việcviếtcácmã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đúngcôngviệc,kếtquảlàlàmchocácôngchủquăngthờigianvàtiềnbạcrađường.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology12121212Dormitory204.B518:20PMApril7,2006Sựlấymẫukhôngchínhxáclàmộtthídụhayvềvấnđềnày.Vàingườiviếtlệnhkhôngdànhthờigianđểnghĩthấuđáo.Đúnglàkhôngchỉcóduynhấtmộtcách“đúng”đểlấymẫudữliệu,nhưngnócórấtnhiềucáchkhôngđúng.Phầnnàybaogồmcácchủđề:ÁpdụngsaicáchàmvềCSDLDùngsaiSQL:khônglấynhữngthứbạncầnDùngPHPđểsắpxếpkếtquả1.1.1.1.DDDDùùùùngngngngsaisaisaisaiccccáááácccchhhhààààmmmmCSDLCSDLCSDLCSDLMộtđoạnmãPHPđãdùngcúphápsauđểlấykếtquảtừCSDL(presentedbelowusingageneralizedsetofSQLfunctions):if(!($mautin=sql_fetch_row($truyvan))){print"Motloixayra:Khongtimthaymautinnao!";exit;}do{print"$mautin[0]:$mautin[1]\n<br>\n";}while($mautin=sql_fetch_row($truyvan));ChChChChúúúúýýýý::::Ởtrên,vàcácthídụsaunữa,$truyvandiễntảhandlehoặcpointerđếnmộttậpkế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ộtvàivấnđềvớiđoạnmãtrên:Nókiểmtracáctrườnghợp“khôngtìmthấy”("noincidents"case)bằngcáchlấymộtdòngNókhônglưukếtquảvàomảngliênkết(associativearray)1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratratrtrtrtrườườườườngngngnghhhhợợợợppppkhkhkhkhôôôôngngngngttttììììmmmmththththấấấấy:y:y:y:ccccááááchchchchllllààààmmmmsaisaisaisaiBằngcáchdùngsql_fetch_row(),PHPchủtrươngmộtcáchtiếpcậnhàmẩnchoviệcxácđịnhcókếtquảtìmthấyhaykhông.Mộtcáchkháctrựctiếpvàtườngminhlàđếmsốdòngcủakếtquảbằngsql_num_rows()nhưdướiđây:<?phpif(sql_num_rows($truyvan)<=0){print"Motloixayra:Khongtimthaymautinnao!";exit;}while($mautin=sql_fetch_row($truyvan)){print"$mautin[0]:$mautin[1]\n<br>\n";}?>1.2.1.2.1.2.1.2.TTTTừừừừbbbbỏỏỏỏvvvvòòòòngngngngllllặặặặppppDo..WhileDo..WhileDo..WhileDo..WhileTrướchếtvàtrênhết,vònglặpthôtụcdo..whilekhôngbaogiờcầnnữavìkhidùngsql_num_row(),chúngtakhôngphảilấydòngđầutiêncủakếtquảkhimuốnkiểmtrakếtquảtrống.Thídụcũđãdiễntảmộtthídụm trong ó,nếukếtquảkhôngrỗng,dòngđầutiênđãđượclấybằnghàmsql_fetch_row()trongcâulệnhif.Cấutrúcdo..whilecầnthiếttrongtrườnghợpnàyvìkhiđó,bộđếmcủaCSDLđãtănglênvàchuyểnsangdòngkếtiếp.Dođó,bạnphảixửlí(lệnhdo)dòngđầutiênvìnóđãđượclấy.Cáclệnhtiếptheolấycácdòngkế,vàcứthế.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology13131313Dormitory204.B518:20PMApril7,2006Tạisaovòngdo..whiledo..whiledo..whiledo..whilebịcoinhưthôtục,xấuxa(nasty)?Trongthídụtrên,chỉcó1lệnhinkếtquảtrongvònglặp.Hãytưởngtượng,nếucó10lệnh ,người ọcmãphảitìmđiềukiệnwhilesaucáccâulệnhđó.Mộtcôngviệcphiềntoái.ĐiềukiệnWhilebắtđầucấutrúcthườngxuyênhơnlàkếtthúc.Mộtnhànghiêncứusẽphảicẩnthậnhơnđểkhôngnhầmlẫnđiềukiệnwhilecuốivớiđiềukiệnwhileđầu.1.3.1.3.1.3.1.3.GiGiGiGiữữữữmmmmọọọọiiiiththththứứứứggggọọọọnnnnggggààààngngngngvvvvààààđơđơđơđơnnnngigigigiảảảảnnnnVớitrườnghợpkếtquảrỗng,sql_num_rows()đưađếnngaykếtquả,trongkhisql_fetch_row()thìkhôngsql_fetch_row()sql_fetch_row()sql_fetch_row()sql_fetch_row()nóirằng"Tôitìmthấy0dòngtrongtậpkếtquả.Điềunàynghĩalàcó0kếtquả”(Ifoundnorowsintheresultset.Thismustmeanthattherearenone.)sql_num_rows()sql_num_rows()sql_num_rows()sql_num_rows()nóirằng“Sốdòngtrongkếtquảlà0”(Thenumberofrowsintheresultsetis0).Nhưngđiềuđóthựcsựtạonênsựkhácbiệtnào?Xétcùngmộtsựsosánh,nhưngbâygiờlàtrongngữcảnhcủađiềukiệnifvàcủabiểuthức ,trong oạnlệnhgiả(Pseudo-code):****if(!($mautinif(!($mautinif(!($mautinif(!($mautin====sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan))){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}: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;$mautinkhôngphảilàzerovàcógiátrịlàTrue.Dođó!(True)=False,vàtiếptụcvớ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){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}:ođếmsốdòngtrongtậpkếtquả.oNếunhỏhơnhaybằng0,inthôngbáolỗi.oNếukhông,tiếptục.Biểuthứcnàodểhiểuhơn?Rõrànglàcáchđếmsẽtrựctiếpvàgọngànghơn.Sựkhácbiệtthựctếlàgì?Vớimộtlệnhifđơngiản,chúngtakhôngthuđượclợinhều.Tuynhiên,vớihơn10000dònglệnh,hãydànhthờigiannghĩđếncáchrõràngnhất,nósẽtiếtkiệmchongườiphântíchchươngtrìnhnhiềugiờsuynghĩa.Lợiíchkháccóthểkểđếnlàchươngtrìnhcủabạnsẽnhanhhơnvàdễpháttriểnhơn.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology14141414Dormitory204.B518:20PMApril7,20061.4.1.4.1.4.1.4.KhiKhiKhiKhimmmmààààDBMSDBMSDBMSDBMSccccủủủủaaaabbbbạạạạnnnnkhkhkhkhôôôôngngngnghhhhỗỗỗỗtrtrtrtrợợợợsql_num_row()sql_num_row()sql_num_row()sql_num_row()VàiDBMScóthểkhônghỗtrợhàmsql_num_row().TôixinchiasẻvớibạnnếuDBMScủabạnlàmộttrongsốđó.Bạnsẽphảitìmtrongkếtquảrỗngbằngcáchlấydòng.Tuynhiên,trongtrườnghợpnày,nónêndùngmộtbiếnbooleannhưsau:<?php$timthay=false;while($mautin=sql_fetch_array($truyvan)){$timthay=true;}if(!$timthay){print"Loi!";}?>1.5.1.5.1.5.1.5.LLLLấấấấyyyykkkkếếếếttttququququảảảả::::hhhhããããyyyychchchchọọọọnnnnccccááááchchchchccccóóóóííííchchchchVấnđềthứhaitrongđoạnmãnàylànódùngsql_fetch_row()đểlấytậpkếtquả.Hàmsql_fetch_row()chỉtrảvềmảngđánhchỉsố,trongkhiđósql_fetch_array()trảvềmảngđánhchỉsốvàmảngdùngchuỗi.$mautin=sql_fetch_array($truyvan);print$mautin[1];//Cotthu2print$mautin[name];//TencotChChChChúúúúýýýý::::Cónhiềuquyướckhácnhauvềviệcdùngdấunháykhithêmmộtđốisốkiểuchuỗi.Trongthídụvềtêncộtởtrên,vàsuốtbàiviếtnày,nósẽđượcbỏ.Từquanđiểmcủanhàpháttriển,hàmnàocólợihơn?Mảngdùngchuỗigiúpchongườiđọchiểuđượcbạnđanglấycáigìchỉthôngquaviệcđọcmã,nhưthídụđúngdướiđây:<?phpif(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.KhiKhiKhiKhinnnnààààoooosql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)nnnnêêêênnnnđượđượđượđượccccddddùùùùngngngngTôikhôngthựcsựlàfancủathesql_fetch_row().Tuynhiên,cómộttìnhhuốngmàdùngnókhônggiảmkhả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.Đôikhibạnđểchongườidùngtựđịnhnghĩacâutruyvấn.Trườnghợpnàybạnsẽkhôngbiếtcáccộttrongkếtquả.Dođó,dùnghàmsql_fetch_row()kèmvớicount()sẽxửlíhiệuquảcáccộttrongmộthàng:<?phpfor($i=0;$i<count($mautin);$i++){print"Column".($i+1).$mautin[$i]."\n<BR>\n";}?>2.2.2.2.DDDDùùùùngngngngsaisaisaisaiSQL:SQL:SQL:SQL:khkhkhkhôôôôngngngngllllấấấấyyyynhnhnhnhữữữữngngngngggggììììbbbbạạạạnnnnccccầầầầnnnnPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology15151515Dormitory204.B518:20PMApril7,2006Nhưlàvấnđềcủathựchành,đơngiảnlàsẽsailầmkhidùngPHPxửlímọidòngcủaCSDL.TôiđãbắtgặpngườitadùngPHPđểchạymộtchươngtrìnhtìmkiếmđơngiảntrên2MBdữliệuvàtựhỏitạisaocáingônngữnàychạylâuthế.Lấy2MBdữliệutừCSDLcóthểlàmbạnchờmãimãi.Ngônngữtruyvấnchuẩn(StandardStandardStandardStandardQueryQueryQueryQueryLanguageLanguageLanguageLanguage----SQLSQLSQLSQL)đượ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ằngmãSQLđangdùngchưađượctốiưuhoá.2.1.2.1.2.1.2.1.MMMMệệệệnhnhnhnhđềđềđềđềWHEREWHEREWHEREWHEREMộtthídụkinhđiểnvềsựhiểuquảcủaSQLliênquanđếnmệnhđềwhere.ĐoạnmãsausẽlấycáckếtquảvàinratênvàmãsinhviêncủasinhviêncóMASV='511203008':<?phpinclude(“includes/taptinketnoi.inc”);$strsql="SELECTMASV,HOTENFROMSINHVIEN";$truyvan=@sql_query($strsql,$ketnoi);if(!$truyvan){die(sprintf("LOI:[%d]:%s",sql_errno(),sql_error()));}if(@sql_num_rows($truyvan)<=0){die("KhongketquatimduoctuCSDL!");}while($mautin=@sql_fetch_array($truyvan)){if($mautin[MASV]==“511203008”){print"MASV:$mautin[MASV]\n<br>\n";print"Hoten:$mautin[HOTEN]\n<br>\n";break;}}?>Đoạnmãtrênchưađượctốiưu:chúngtađangdùngPHPđểtìmkiếmtrongtoànbộCSDL!NếunhưđiềunàykhôngquantrọngđốivớicácCSDLnhỏ,khikíchthướcCSDLtănglênbạnsẽcảmthấymộtcúđấmnặngnềvềhiệunăng.Lờigiảirấtđơngiản:sửacâuSQLđểchứamệnhđềWHERE:$strsql="SELECT*FROMSINHVIEN";$strsql.="WHEREMASV='511203008'";PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology16161616Dormitory204.B518:20PMApril7,2006MệnhđềWHEREchophépbạntìmkiếmchọnlọchơn.Giớihạnchọnlọccủamệnhđềwherechínhlàmộthàmvớiđốisốcủanó.Trongthídụtrênđốisốlà"MASV='511203008'".Bâygiờchúngtađãchọnđượcdữliệucầnthiết,bạnchỉviệcdùngPHPđểinrasauđó:if(@sql_num_rows($truyvan)!=1){die("KhongdungsomautinnhanduoctuCSDL!");}$mautin=@sql_fetch_array($truyvan);print"Hovaten:$mautin[HOTEN]\n<br>\n";print"MASV:$mautin[MASV]\n<br>\n";3.3.3.3.DDDDùùùùngngngngPHPPHPPHPPHPssssắắắắppppxxxxếếếếppppkkkkếếếếttttququququảảảảNhiềungườilấydữliệuởtìnhtrạngkhôngcóthứtự,nhưngrồiđoạnmãPHPtiếptheolạisắpthứtựchúng.NênchớrằngsắpxếpbằngSQLnhanhhơnPHP.DùngcúphápORDERBYcủaSQLđểsắpxếpthayvìhàmksort()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ệungayvàolúcnóđượcđịnhnghĩa?Nógiúpchúngtađỡphảiduyệtquatậpkếtquảlầnthứhai.Dovậy,bỏhàmksort()rakhỏichươngtrìnhtrênvàthayđoạnmãSQLbằngđoạndướiđây,códùngdùngcúphápORDERBY:$strsql="SELECTname,email,phoneFROMsome_table";$strsql.="WHEREnameISLIKE'%baggins'ORDERBYname";12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology17171717Dormitory204.B518:20PMApril7,2006KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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";}?>12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology18181818Dormitory204.B518:20PMApril7,2006Luônđảmbảorằng,khibạnlàmviệcvớicáctiếntrìnhhoặctậptinngoàiPHP,mọithứđềuvậnhànhđúng.Mộtthídụtuyệtvờilàviệckiểmtrađầuracủamộtlờigọihệthốngkhidùnghàmsql_connect().XácnhậnđầurađểkiểmtraliênkếtđếnCSDLlàđúng.Làmsaiđiềunàycóthểdẫnđếncáctruyvấnhỏngvàmấtdữliệutrongkhithậmchí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.ĐặĐặĐặĐặttttmmmmứứứứccccerror_reportingerror_reportingerror_reportingerror_reportingllllààààE_ALLE_ALLE_ALLE_ALLtrongtrongtrongtrongttttậậậậpppptintintintinphp.iniphp.iniphp.iniphp.iniHãyđảmbảobạncấuhìnhvớimứcđộbáolỗicaonhấtcóthể.Nếubạnkhôngđặtnóởmứccaonhất,ítnhấtlàtrongquátrìnhtìmlỗi(debugging),bạncóthểbỏquanhữnglỗinhưlàbiểuthứcchínhquy(regularexpressions)khônghợplệvàcácgiátrịkhôngchínhxác.XemlạilầnnữathídụtôiđãđưatrongphầnKiểmtrakếtquảlờigọihàm,ởdướiđây.Giảsửbạnđặterrorreportingởmứcthấp,E_ERROR.Chúýrằngkếtquảinrakhichươngtrìnhthihànhhàmdo_math:khôngcóthôngbáoillegaldivisionbyzerođãtừnghiệnralầntrước,phần$i=$j=0đơnthuầnkhônghiệnkếtquả.<?phperror_reporting(E_ERROR);mt_srand((double)microtime()*1000000);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";}?>Kếtquảhiệnra:-5148.25-5271-323.75-4931-7713.5?-4702.5-488.5-928.5-1394.752.2.2.2.BBBBộộộộququququảảảảnnnnllllííííllllỗỗỗỗiiiitutututuỳỳỳỳchchchchỉỉỉỉnhnhnhnhPHPthườ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àmset_error_handler().Hàmset_error_handler()cóthểđượcdùngđểghilạicáclỗixảyravớichươngtrìnhcủabạn.Thayvìlàmphiềnngườidùngvớicácthôngbáolỗi,bạncóthểghilạichoriêngbạn,bằngcáchđặtmộthàmquảnlílỗituỳchỉnh(acustomerrorhandlingfunction).PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology19191919Dormitory204.B518:20PMApril7,2006Trongthídụdưới,set_error_handler()đượcdùngđểchỉđịnhhàmerror_handler()làbộquảnlílỗimặcđịnh.Khimộtlỗixảyra,error_handler()đượcgọivàhàmPHPerror_log()đượcdùngđểghilỗivàotậptinerror_file.NếumàlỗithuộcloạiE_ERROR,chúngtasẽthoátchươngtrìnhvàinthôngbáolỗi.<?php//voiderror_handler(stringtype,stringmessage,stringfile,intline)//Customerrorhandler,setbytheset_error_handler()//function.functionerror_handler($type,$message,$file=__FILE__,$line=__LINE__){error_log("$message,$file,$line",3,'error_file');if($type&E_ERROR){print'Anerroroccurred,ithasbeenloggedanditwillbeaddressed.';exit;}}set_error_handler('error_handler');?>11.11.11.11.LLLLạạạạmmmmddddụụụụngngngngHHHHướướướướngngngngđốđốđốđốiiiittttượượượượngngngng(H(H(H(HĐĐĐĐT)T)T)T)Môhìnhhướngđốitượnglàmộtkháiniệmtuyệtvời.Nócórấtnhiềulợiđiểm,màđángchúýnhấtlàkhảnăngdùnglạimãdễdàng.Tuynhiê,theonhưchúngtađượchiểu:PHPkhôngphảilàmộtngônngữHĐT.MặcdùPHPcómộtsựhỗtrợđầyđủvềHĐT,nókhônghiệuquảlẫnkhôngkhônngoannếudùngtínhnăngHĐTcủanókhibạncócáchàmkhácđểđạtđượccùngkếtquả.LídolàsựhỗtrợHĐTcủaPHPkhôngđượcpháttriểnmạnh.Trongkhicóhầuhếtcácphầntửchínhyếu,PHPvẫncònthiếuvàitínhnăngcaocấp(nhưcáckháiniệmprotected,private)màmộtngônngữHĐTthựcsự(thídụnhưC++,Java)phảicó.CácmãhỗtrợHĐTcủaPHPkhôngđượctinhchỉnhvàcũngkhônghiệuquả.NghĩalànếubạndùngmôhìnhHĐTtrongPHP,bạncóthểlàmchậmchươngtrìnhđángkể.Nóichung,mộtứngdụngdùngHĐTsẽchậmđi,cũngnhưlàbạndùngeval()thìsẽchậmhơnlàdùngmãbìnhthường.ĐểminhhoạđầyđủhơnviệcHĐTcógìđókhôngtốt,tôiđãtừngphảidùngnhữngtínhnăngvàkháiniệmcaocấpcủaPHP,mộtvàitrongsốđóthậmchíchưacótàiliệuchỉdẫn.1.1.1.1.ChChChChúúúúngngngngtatatataccccóóóóththththểểểểllllààààmmmmggggììììmmmmààààkhkhkhkhôôôôngngngngccccầầầầnnnnHHHHĐĐĐĐ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ạpmà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ìnhrấtmạnhcóthểđượcviếtmàkhôngdùngmấtcứkháiniệmvàmôhìnhHĐTnào(PHPđượcviế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ạochươngtrìnhcótínhkếtdínhvàdễmởrộngmàkhôngdùngmôhìnhHĐT:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology20202020Dormitory204.B518:20PMApril7,2006TạomộtAPITạomộttrìnhtựtênNhómcáchàmliênquanvàomộttậptin1.1.1.1.1.1.1.1.TTTTạạạạoooommmmộộộộttttAPIAPIAPIAPIÁpdụng3lớpchochươngtrìnhcủabạn:Thứnhất,cáchàmthựcsựthựchiệncôngviệccủabạnThứhai,mộthàmAPI.ĐâylàhàmgiúpbạnxâydựngcácchươngtrìnhđặcthùChươngtrìnhMortgageRate.php<?php//Theinternalfunctionsarelayer1//Internalfunctiontocalculatethecorrect//interestratetobeusedgiventheamountpermonth//andthetimeitistobepaidinfunction_mort_find_interest_rate($total){if($total<30000)return(7.4);elseif($total>30000)return(3.2);elseif($total>50000)return(2.5);elsereturn(1.7);}//TheAPIislayer2//doublecalculate_mortgage_rate(intmoney,inttime,intmonth)//Calculatethemortgagerategiventhe//thetotalmoney,timeitspaidoverand//theintervalsfunctioncalculate_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//fromaforminclude_once'MortgageRate.php';$price=calculate_mortgage_rate($money,$time,$period);print"Your$periodmonthcostis$price";?> ... PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology1111Dormitory204.B518:20PMApril7,2006àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâmđếnviệctránhnhữnglỗithườnggặpkhisửdụngPHP .Người ọcphảibiếtcáccúphápcủaPHP,vànênbiếtcôngdụngcủacáchàmtrongPHP.MộttrongnhữngđiểmmạnhnhấtcủaPHPvôtìnhtrởthànhmộttrongnhữngđiểmyếunhấtcủanó:ttttíííínhnhnhnhddddễễễễssssửửửửddddụụụụngngngng.NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnrarằng:sửdụngđúngPHPPHPPHPPHPccccòòòònnnnkhkhkhkhóóóóhhhhơơơơnnnnccccááááccccngngngngôôôônnnnngngngngữữữữkhkhkhkháááácccc.Trongloạtbàinàysẽlầnlượtnêura21lỗi,từnhữngsailầmgiáokhoa(làmscripttrởnênchậmvàkhóquảnlí)đếnnhữngsailầmchếtngười-cóthểxemlànguồngốccủanhữngsailầmsơđẳng.PHẦN1:7LỖIGIÁOKHOA21.21.21.21.SSSSửửửửddddụụụụngngngngprintf()printf()printf()printf()khkhkhkhôôôôngngngngththththííííchchchchhhhhợợợợppppHàmprintf()dùngđểindữliệucóđịnhdạngNócóthểđượcdùng,thídụ,khibạnmộtinmộtsốkiểudoublevới2s lẻ, hoặctrongbấtkìtìnhhuốngnàobạnmuốnthayđổiđịnhdạngtrướckhiin.Thídụdướiđâyminhhoạcáchdùngđúngcủaprintf():địnhdạngsốPivớiđộchínhxáctheoýmuốnMMMMããããllllệệệệnhnhnhnh(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);?>ChChChChúúúúýýýý....Tôiđãtừnggặpnhữngngườisợdùngprintf(),thayvàođólạidùngnhữnghàmđịnhdạngtựviết,dàiđến30-40dòng ,trong imộtcâuprintf()cóthểlàmmọithứanhtamongmuốn.Nhiếulậptrìnhviêndùngsaiprintf():incácbiến,cácgiátrịtrảvềcủahàmhoặcthỉnhthoảng,chỉlàdữliệuthôngthường.Thườngxảyratronghaitìnhhuống:Câulệnhprint()thíchhợphơnHiểnthịgiátrịtrảvềcủamộthàm1.1.1.1.KhiKhiKhiKhinnnnààààooooprint()print()print()print()ththththííííchchchchhhhhợợợợpppphhhhơơơơn?n?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='khoa_computer2004@yahoo.com';printf("Tencuatuila:%s\n<br>\nHiendangla:%s,%s\n<br>\nLienhevoitoiquaEmail:%s\n<br>\n",$name,$nghenghiep,$diachi,$email);?>Hàmprint()print()print()print()cóthểdùngthaychoprintf()nhưsau:BPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology2222Dormitory204.B518:20PMApril7,2006printprintprintprint"Tencuatuila:$name\n\n\n\n<br>\n\n\n\nHiendangla:$nghenghiep,$diachi\n\n\n\n<br>\n\n\n\nLienhevoitoiquaEmail:$email\n\n\n\n<br>\n\n\n\n";;;;Khikhôngcầnđịnhdạngsửliệu,dùngprint()thaychoprintf()cónhữnglợiíchsau:ThiThiThiThihhhhàààànhnhnhnhnhanhnhanhnhanhnhanhhhhhơơơơn:n:n:n:hàmprintf()địnhdạngdữliệucủabạntrướckhihiểnthị,nósẽchậmhơnprint()hoặcecho()MMMMããããssssáááángngngngssssủủủủ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ến2.2.2.2.DDDDùùùùngngngngprintf()printf()printf()printf()đểđểđểđểxuxuxuxuấấấấttttddddữữữữlilililiệệệệuuuutrtrtrtrảảảảvvvvềềềềttttừừừừggggọọọọiiiihhhhààààmmmmMộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhàmđếmdướiđây:Khixuấtgiátrịdohàmtrảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây:Dùngtoántử.nhanhhơnviệcdùngprintf()20.20.20.20.ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaa(semantics)(semantics)(semantics)(semantics)NhiềulậptrìnhviênsửdụngPHPmàkhôngbiếtđếnnhữngđiểmtinhtếcủangônngữnày.Mộttrongnhữngđiểmđólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa(semantics).CCCCúúúúphphphphááááp:p:p:p:nhữngquytắcđịnhnghĩamộtphầntử.Thídụ:dấu$đểtrướcdùngđịnhnghĩabiến,dùngdấu()vàcácthamsốđịnhnghĩamộthàm...NgNgNgNgữữữữnghnghnghnghĩĩĩĩa:a:a:a:nhữngquytắcápdụngtrongcúpháp.Thídụ:mộthàmcó2biếnđịnhnghĩabởicúphápcủanó,haibiếnnàycókiểustring-đólàngữnghĩa.TrongmộtngônngữlỏnglẻonhưPHP,bạncónhiềulựachọnđểviếtlệnh.Cácbiếnkhôngcầncókiểuxácđịnh...Thídụsaumởtậptinvàintừngdòng:Thídụtrênsẽtạolỗi:Warning:Warning:Warning:Warning:SuppliedSuppliedSuppliedSuppliedargumentargumentargumentargumentisisisisnotnotnotnotaaaavalidvalidvalidvalidFile-HandleFile-HandleFile-HandleFile-HandleresourceresourceresourceresourceininininC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpC:\Inetpub\wwwroot\tst.phpononononlinelinelineline4.4.4.4.<?printfprintfprintfprintf("%doccurrencesof%sfound.",count($truyvan),$search_term);?><?printprintprintprintcount($truyvan)."occurrencesof$search_termfound.";?><?$fp=@fopen('vanban.txt','r')ordie('Khongthemofilevanban.txt');while($line=@fgets("$fp",1024))//Loi{print$line;}@fclose("$fp")//Loiordie('Khongthedongvanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology3333Dormitory204.B518:20PMApril7,2006Đólàdobiến$fpđặttrongdấunháyképnênđượcchuyểnthànhchuỗi.Thếmàhàmfopen()nhậnmộtđịnhdanhtàinguyên(resourceidentifier)trongthamsốđầucủanó,chứkhôngnhậnmộtchuỗi.Đểgiảiquyếtvấnđề,bạnchỉđơngiảnbỏdấunháyképđi1.1.1.1.CCCCóóóóththththểểểểtrtrtrtráááánhnhnhnhviviviviệệệệccccááááppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩa?a?a?a?Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomizeyourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoreticallypossibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđượckhông?Thídụtrêncủachúngtatạoramộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncácscriptđểthíchhợpvớimộtkịchbảnkhácthườnghoặcvớicácđòihỏicủathôngtinra.Dođó,ítnhấttrênlíthuyết,bạncókhảnăngtránhviệcápdụngsaingữnghĩa.Vậy,bạncầnbiếtnhữnghậuquảcóthểcó(possibleoutcomes)nếubạnquyếtđịnhhọcvềngữnghĩa.Ápdụngsaidẫnđếnnhữnglỗikhátinhvinếubạnkhôngchúý.Nếubạnmuốntuỳbiếnscript,bạncầnhiểunhữngchủđềchínhsau:KiKiKiKiểểểểu:u:u:u:trongPHP,mỗibiếncómộtkiểuxácđịnhởmộtthờiđiểmxácđịnh,chodùbạncóthểtựdochuyểnđổikiểumộtbiến.Nóimộtcáchkhác,khôngcóbiếnnàolạikhôngkèmtheotínhchấtcủakiểucủanó.PHPcó7kiểucơbản:boolean,resource,integer,double,string,arrayvàobject.TTTTầầầầmmmmvvvvựựựực:c:c:c:trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiếncóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbảnvề"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ằngkhô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.19.19.ThiThiThiThiếếếếuuuughighighighichchchchúúúúTheoýtôi,mãnguồnthiếughichúlàcănnguyêncủasựlậptrìnhíchkỉ.Nódẫntớinhữnghiệuchỉnhsailầm,hiểusaiýnghĩavàlàmngườiđọcmệtmỏi.Nóichung,lậptrìnhghichú(inlinedocumentation)đượcmọingườikhẳngnhậnlàđiềutốt,nhưnghiếmkhinótồntại.Mộtvấnđềkháclàquánhiềughichú.Dùhiếmgặp,nhưngnólàmchocácđoạnmã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";//Vonglapforinratatcatuoitruocdofor($idx=0;$idx<$age;$idx++){<?$fp=@fopen('vanban.txt','r')ordie(‘Khongthemofiletailieuphp.txt');while($line=@fgets($fp,1024)){print$line;}@fclose($fp)ordie(Khongthedongfilevanban.txt');?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology4444Dormitory204.B518:20PMApril7,2006//Inratuoicanhanprint"$idxyearsold\n<br>\n";}//KetthucmaPHP?>1.1.1.1.BaoBaoBaoBaonhinhinhinhiêêêêuuuughighighighichchchchúúúúththththììììđủđủđủđủ????Nhiếuđếnmứcnào,điềuđótuỳthuộcngânsáchcủabạn,vàochínhsáchcủacôngtyvàvàođộphứctạpcủachươngtrình.Tuynhiên,cũngcómộtvàigợiýchobạnLuôncómộtmôtảngắnvềmụcđíchcủahàmngaytrướcđịnhnghĩacủahàmđóThêmghichúvàonhữngchỗcóthểbịhack,hoặcnhữngchỗtưởngrằngsainhưnglạichạyđúngNếumộtđoạnmãnàođócóthểgâynhầmlẫn,hãythêmmộtítghichúvềmụcđíchcủađoạnđó.SaunàybạnsẽthấyđượclợiíchcủanóDùngmộtkiểughichúnhấtquán,/*/*/*/**/*/*/*/hoặclà////////(tr(tr(tr(tráááánhnhnhnhddddùùùùngngngng#)#)#)#)Dướiđâylàmộtthídụvềghichútốt:<?//Random_Numbers.lib//Generatedifferenttypesofrandomnumbers.mt_srand((double)microtime()*1000000);//mixedrandom_element(arrayelements[,arrayweights])//Extractarandomelementfromelements.Weightsis//therelativeprobabilitythateachelementwillbe//selected.functionrandom_element($elements,$weights=array()){//Theremustbeexactlythesameamountofelementsas//thereareweightsforthisalgorithmtoworkproperlyif(count($weights)==count($elements)){foreach($elementsas$element){foreach($weightsas$idx){//Note:wedon'tuse$idx,sincewe//don'twanttooverrideelements.$randomAr[]=$element;}}}else{$randomAr=$elements;}$random_element=mt_rand(0,count($randomAr)-1);return$randomAr[$random_element];}?>18.18.18.18.NhiNhiNhiNhiềềềềuuuubibibibiếếếến,n,n,n,ttttốốốốnnnnnhinhinhinhiềềềềuuuuththththờờờờiiiigiangiangiangianCóvàingườibịámảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthểviếtnhưthếnày:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology5555Dormitory204.B518:20PMApril7,2006Tạisaophảidùngbiếntrunggian?NókhôngcầnthiếtRủithay,cóvẻnhưrấtnhiềungườikhóbỏđượcthóiquenxấunày.Biếntạmlàmchậmthờigianthihànhchươngtìnhcủabạn.Tốthơnlànênbỏquađóvàgộpcáclờigọihàmvớinhau.Nhữngngườidùngbiếntạmthườnglàmchươngcủahọchạychậmđến25%.Mộtlídokhácđểtránhcóquánhiềubiếntạmlàvìtrôngnókhôngđượcđẹpmắt.Tronghaithídụtrên,thídụnàosúctíchhơn?Thídụnàolàmconmắtdễchịuhơn?Dùngquánhiềubiếntạmcóthểdẫnđếnmãchươngtrìnhkhóđọcvàkhôngsúctích.1.1.1.1.LLLLợợợợiiiiđđđđiiiiểểểểmmmmccccủủủủaaaaddddùùùùngngngngbibibibiếếếếnnnnttttạạạạmmmmCácbiếntạmcólợitrongviệcthaythếcáchàmhaybiểuthứcdàilêthê.Nócóvaitrònhưbídanhgiả.Điềunàyđặcbiệtđúngkhibạndùngmộthàmhaybiểuthứcnhiềulần.Xemxétthídụđây,nókhôngdùngnhiềubiếnhơnmứctốithiểuNộidungtronghàmimplode()dàivàdođókhóđọc.Dùngmộthoặcnhiềubiếntạmcóthểgiúpchúngta:2.2.2.2.CCCCáááácccclulululuậậậậttttchungchungchungchungccccủủủủaaaangngngngóóóónnnntaytaytaytayccccááááiiiiKhiquyếtđịnhcódùngbiếntạmhoặckhông,bạnnênsuynghĩvề2câuhỏi:Bạncódùngbiếnđóítnhấthailần?Tínhđọcđượccủamãcótăngđángkểkhông?Nếuítnhấtmộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợpcáchàmlại(nếucần).17.17.17.17.ViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnMộtsốnơiphổbiếnmãnguồncácscriptPHPchủtrươngđổitêncáchàmsẵncóđểtạosựdễdàngchocáclậptrìnhviênchuyểntừVBsang.Thídụ:<?$tmp=date("Fd,h:ia");/*ieJanuary3,2:30pm*/print$tmp;?><?printdate("Fd,h:ia");?>//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){returnimplode("",array_reverse(preg_split("//",$str)));}//stringreverse_characters(stringstr)//Reverseallofthecharactersinastring.functionreverse_characters($str){$characters=preg_split("//",$str);$characters=array_reverse($characters);returnimplode("",$characters);}<?functionlen($str){PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology6666Dormitory204.B518:20PMApril7,2006LạicómộtsốngườicốgắngviếtlạicáchàmPHPthô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àmchonhữngngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcảmthấycóquánhiềuhàmdưthừa.Họtựhỏitạisaobạnlạiđiđịnhnghĩahàmtheokiểuđó,thayvìsửdụngcáchàmđịnhnghĩasẵnbởiPHP.Thứhai,địnhnghĩahàmnhưvậycũngsẽlàmchậmchươngtrìnhcủabạn(mộtcáchkhôngcầnthiết).Khôngchỉphảixửlínhiềumãhơn,màmỗilầngọihàmdobạnđịnhnghĩa,bạnđãtốnthờigianchochínhhàmđó,trướckhihàmnguyênthuỷđượcgọi.1.1.1.1.TrTrTrTráááánhnhnhnhviviviviếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnHãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên,mộtlậptrìnhviênkhôngthểtheokịpcáchàmcủaPHPngayđược.Vàaicóthờigianmàtracứu.Tạisaokhôngviếtlạichokhoẻ?CáchlàmcủatôilàluôncósẵnmộttàiliệuchỉdẫnPHP(PHPmanual)mỗikhiviếtchươngtrình(tácgiảbàinàydùngmộtbảnPDFcótạochỉmục,riêngtôi,ngườidịch,thìdùngmộttàiliệuCHMđầyđủthôngtinvàcócảgópýcủangườisửdụngmàbạncóthểlấyởhttp://www.php.net/docs.php).Sauđó,mỗikhiđịnhviếtmộthàmmởrộngchoPHP,tôiđọclướtquatàiliệuđểxemhàmđócóchưa.Tuynhiên,cầnchúýlà,dobảnchấtmãnguồnmởcủaPHP,bạncóthểtìmđượccáchàmdongườidùngđịnhnghĩatrướckhinóđượcthêmvàoPHP(thídụnhưhàmtìmphầntửkhácnhaugiữahaimảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlạimã(Thisdoesn'tnecessarilymeanthatyoushouldhavetocorrectthecode.-don'tunderstand)16.16.16.16.KhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnserverserverserverservervvvvààààclientclientclientclientVàilậptrìnhviêncốkếtnốicảchươngtrìnhvớinhau,nghĩalàghépchungmãHTML(client-side-phầnkhách)vớimãPHP(server-side-phầnchủ)vàotrongmộttậptinlớn.Mặcdùđiềunàytốtchocácsitenhỏ,nhưngnócóthểtrởthànhvấnđềlớnkhicácsiteđótrởnênlớnhơnvàđượcbổsungthêmtínhnăng.Lậptrìnhtheocáchnàylàmnảysinhvấnđềkhóbảotrìvàcáctậptintrởnêncồngkềnh.1.1.1.1.HHHHààààmmmmAPIAPIAPIAPIKhimuốntáchbiệtphầnkhách-chủ,bạncóvàilựachọn.Mộtcáchlàviếtnhữnghàmhiểnthịnộidunglinhđộngvàđặtchúngđúngchỗtrongtrangweb.Thídụdướiđâyminhhoạđiềunày:index.phpindex.phpindex.phpindex.php-phầnkháchreturnstrlen($str);}?>HTMLHTMLHTMLHTML<?phpinclude_once("site.lib");?><html><head><title><?phpprint_header();?></title></head><body><h1><?phpprint_header();?></h1><tableborder="0"cellpadding="0"cellspacing="0"><tr>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology7777Dormitory204.B518:20PMApril7,2006site.libsite.libsite.libsite.lib-phầnchủNhưbạnthấytrongthídụtrên,táchbiệtkháchchủlàmtăngtínhdễđọctrongchươngtrìnhcủabạn.MộtlợiíchkháclàmộtkhibạnđãcócáchàmAPIhiểnthịnộidung,bạncóthểđểchothiếtkếviênthamgiathayđổibốcụcmàkhôngcầnsửamãchươngtrình.1.1.1.1.1.1.1.1.LLLLợợợợiiiiííííchchchchccccủủủủaaaahhhhààààmmmmAPIAPIAPIAPITươngđốisángsủaNhanh,hầunhưkhônglãngphíthờigian(overhead)1.2.1.2.1.2.1.2.BBBBấấấấttttllllợợợợiiii<tdwidth="25%"><?phpprint_links();?></td><td><?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(){global$site_info;print$site_info->header;}functionprint_body(){global$site_info;printnl2br($site_info->body);}functionprint_links(){global$site_info;$links=explode("\n",$site_info->links);$names=explode("\n",$site_info->link_names);for($i=0;$i<count($links);$i++){print"\t\t\t<axhref=\"$links[$i]\">$names[$i]</a>\n<br>\n";}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology8888Dormitory204.B518:20PMApril7,2006Khôngsángsủavàdễdàngbằnghệthốngmẫu(templatesystem)CầnmộtítkiếnthứcPHPđểsửamẫu2.2.2.2.HHHHệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuMộtcáchkhácđểtáchbiệtkháchchủlàdùnghệthốngkhuônmẫu.Nghĩalà,cómộtsốđánhdấunộidungsauđódùngchươngtrìnhphântích,thaythếcácđánhdấuđóbằngthôngtincầnthiết.Thídụ,bạncóthểtạomộ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ônmẫukhátốtlàlớpFastTemplate,cóởwww.thewebmasters.net2.1.2.1.2.1.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmccccủủủủaaaahhhhệệệệththththốốốốngngngngkhukhukhukhuôôôônnnnmmmmẫẫẫẫuuuuRấttrongsángKhôngcầnkiếnthứcPHPđểsửakhuônmẫu2.2.2.2.2.2.2.2.NhNhNhNhượượượượccccđđđđiiiiểểểểmmmmChậmhơn,bạncầnphântáchtậptinkhuônmẫu,sauđóxuấtraViệchiệnthựcphứctạphơn15.15.15.15.DDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiiiCónhiềungườicứdùngmãicácmãvàthưviệnlỗithời.ThídụnhưhọđãviếtmộthàmdùngởPHP2,vàvẫncòndùngnóởPHP4,mặcdùmộthàmcócùngmụcđíchnhưthếđãđượcthêmvàoởPHP3Dùngcáccấutrúclỗithờicóthểlàmchậmchươngtrìnhcủabạn,cũngnhưlàmchonótrởnênkhóhiểu .Người ọccácchươngtrìnhcủabạncóthểkhôngquenvớicáchàmlỗithờicủaPHP.Tuynhiên,khipháthiệnmộtđoạnmã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ắmlấy,làcúphápbeginControlStructurebeginControlStructurebeginControlStructurebeginControlStructure........endControlStructureendControlStructureendControlStructureendControlStructure;HTMLHTMLHTMLHTML<html><head><title>%%PAGE_TITLE%%</title></head><body%%BODY_PROPERTIES%%><h1>%%PAGE_TITLE%%</h1><tableborder="0"cellpadding="0"cellspacing="0"><tr><tdwidth="25%">%%PAGE_LINKS%%</td><td>%%PAGE_CONTENT%%</td></tr></table></body></html><?PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology9999Dormitory204.B518:20PMApril7,2006ĐâylàmộtthóiquenxấuvìNókhôngđượcdùngrộngrãi,chonênnhiềungườihọcsẽbịlẫnlộngiữahaicúphápNókhôngtươngthíchvớingônngữkhác,nghĩalànótrởnênkhóđọcđốivớinhữngngườitronggiaiđoạnquáđộ(mớichuyểntừmộtngônngữnàođósangPHP)Quantrọngnhất,làmộtngàynàođótínhnăngnàysẽbịxoáxổ,bắtbuộcbạnphảiviếtlạitoànbộmãcódùngnó.DấungoặcnhọnluônluônlàmộtphầncủangônngữPHP.Ởtrênchỉlàmộtthídụvềcấutrúclỗithời.Nócònnhiềunữa.Nhưmộtquytắc,bạnnêntheonhữngcácviếttrongtàiliệuPHP.Hầuhếtnóđượccậpnhậtmới.NócũngdùngcáchàmmớinhấtcủaPHPtrongthídụcủamình.NênthườngxuyênkiểmtratàiliệukhibạncóýmuốnmởrộngtínhnăngnàođócủaPHP.Theocáchnày,bạnsẽkhôngphảiviếtlạicáchàmcósẵn.TTTTổổổổngngngngkkkkếếếếttttTrongbàinàybạnđãđiqua7trêntổngsố21lỗimàlậptrìnhviênPHPmắcphải.Nhữnglỗigiáokhoanàybaogồm:SSSSửửửửddddụụụụngngngngsaisaisaisaihhhhààààmmmmprintf()printf()printf()printf()ÁÁÁÁppppddddụụụụngngngngsaisaisaisaingngngngữữữữnghnghnghnghĩĩĩĩaaaaThiThiThiThiếếếếuuuuttttààààiiiililililiệệệệuuuutrongtrongtrongtrongmmmmããããngungungunguồồồồnnnnDDDDùùùùngngngngququququáááánhinhinhinhiềềềềuuuubibibibiếếếếnnnnttttạạạạmmmmViViViViếếếếttttllllạạạạiiiiccccáááácccchhhhààààmmmmccccóóóóssssẵẵẵẵnnnnKhKhKhKhôôôôngngngngttttááááchchchchbibibibiệệệệttttphphphphầầầầnnnnkhkhkhkháááách/chch/chch/chch/chủủủủDDDDùùùùngngngngccccááááccccccccấấấấuuuutrtrtrtrúúúúccccllllỗỗỗỗiiiiththththờờờờiiii//Bad/OutdatedPracticewhile(1):print"5";if($idx++==5):break;endif;endwhile;//BetterPractice//(thecodecouldbeoptimizedthough)while(1){print"5";if($idx++==5){break;}}?>PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology10101010Dormitory204.B518:20PMApril7,2006PHẦN2–LỖINGHIÊMTRỌNG14.14.14.14.KhKhKhKhôôôôngngngngtutututuâââânnnnththththủủủủccccááááccccquyquyquyquyướướướướccccđặđặđặđặttttttttêêêênnnnMộttrongnhữnglỗinghiêmtrọngmàngườilậptrìnhcóthểphạmphảilàđịnhnghĩamộtquyướcđặttêntồi.Tôiđãtiếpquảnnhiềudựánm 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đếnmộtdựánmàngườilậptrìnhcũđãquyếtđịnhđưavàotoànbộchươngtrìnhmộtkiểuđặttênkìlạ(aFlinstonesnamingtheme),khôngphảitôiđùađâu.Cáchbạnđặttênbiếnvàhàmlàtrungtâmcủaviệcxâydựngmộtchươngtrìnhdễđọc.Cónhiềulậptrìnhviênphạmlỗikhiđặttênbiếnvàhàmmànó:quádàihoặcquángắnkhôngliênquanđếnngữcảnhkhôngđểýđếncách-viết-phân-biệt(casesensitivity)ngăncảnkhảnăngdễđọc(đặcbiệtlàcáchàm)1.1.1.1.ĐặĐặĐặĐặttttttttêêêênnnnbibibibiếếếếnnnn1.1.1.1.1.1.1.1.CCCCááááchchchchviviviviếếếếttttphphphphâââânnnnbibibibiệệệệttttTrongPHP,tênbiếncócáchviếtphânbiệt,nghĩalà$uservà$Userlàhoàntoànkhácnhau.Vàingườidùnglợidụngđiểmnà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ỗitênbiến,trongcùngtầmvực(scope),nêncólàtuyệtđốiduynhất.1.2.1.2.1.2.1.2.TTTTêêêênnnnququququáááángngngngắắắắnnnnNhiềungườisửdụngnhữngchữviếttắtđầu(crypticacronym)bíẩnchocácbiếncủahọ,đểrồisaunàyhốitiếcvìquênmấthọđãmuốnámchỉđiềugìkhiđó.Tênbiếnnênmôtảnộidungnó(sẽ)chứa,dùngnguyêntừhoặcnhữngchữviếttắtcóthểhiểuđược.1.3.1.3.1.3.1.3.TTTTêêêênnnnququququááááddddààààiiiiỞkhíacạnhkhác,vàingườilạisửdụngtênbiếnquádài.Nóichung,tênbiếnkhôngnêndàiquáhaitừ.Haitừcóthểđượctáchbiệtbằngdấuphâncách"_"hoặclàviếthoachữđầucủatừthứhai.1.4.1.4.1.4.1.4.ThThThThóóóóiiiiquenquenquenquenttttốốốốttttDướ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);PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology11111111Dormitory204.B518:20PMApril7,20061.5.1.5.1.5.1.5.ThThThThóóóóiiiiquenquenquenquenxxxxấấấấuuuuDướ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.ĐặĐặĐặĐặttttttttêêêênnnnhhhhààààmmmmMọikháiniệmápdụngchotênbiếncũngápdụngchođặttênhàm.Tuynhiên,ngữphápđóngvaitròđặcbiệttrongcáchàm.CáchàmPHP,địnhnghĩasẵnhoặcdongườidùngđịnhnghĩa,làkhông-phân-biệt-cách-viết(notcasesensitive)2.1.2.1.2.1.2.1.DDDDùùùùngngngngđộđộđộđộngngngngttttừừừừHàmcủaPHPtươngđươngvớimộtđộngtừkhinói.Tênhàm,dođó,nênđượchướnghànhđộng(actionoriented).Nócũngnênđượcdùngởthìhiệntại.Thídụ,bạncómộthàmtạomộtsốngẫunhiênvớiphânbốGausse(agaussianrandomnumber),bạnnênđặttênnólàgenerate_gaussian_rand().Chúýcácsửdụngđộngtừhànhđộngtrongtênhàm.Nósẽđặthàmvàongữcảnhthíchhợp<?phplist($num1,$num2)=generate_gaussian_rand();list($num3,$num4)=generate_gaussian_rand();?>Đểsosánh,hãyxemthídụ:<?phplist($num1,$num2)=gaussian_rand_generator();list($num1,$num2)=gaussian_rand_generator();?>Bạncóthấysựkhácbiệt?Thídụthứhaisửdụngdanhtừ,mặcdùvẫnchuyểntảiđượcmụctiêucủahàm,nhưngnóngănngườitađọcmộtcáchtrôichảy.Hãysửdụngđộngtừ!13.13.13.13.KhKhKhKhôôôôngngngngsuysuysuysuynghnghnghnghĩĩĩĩththththấấấấuuuuđáđáđáđáo:o:o:o:CSDLCSDLCSDLCSDL&&&&SQLSQLSQLSQLSốcáchngườitatruycậpcơsởdữliệu(CSDL-database)vàlấykếtquảnhiềuđếnmứcthựcsựngạcnhiên.Nhữngthídụtôiđãgặpbaogồmnhữngtổhợplệnhifvàvònglặpdo..while,cáccâugọinhiềulần,vàcáchàmsql_result()trongvòngfor.Nhữngngườinàycónghĩhọđanglàmgìkhông?Việcviếtcácmã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đúngcôngviệc,kếtquảlàlàmchocácôngchủquăngthờigianvàtiềnbạcrađường.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology12121212Dormitory204.B518:20PMApril7,2006Sựlấymẫukhôngchínhxáclàmộtthídụhayvềvấnđềnày.Vàingườiviếtlệnhkhôngdànhthờigianđểnghĩthấuđáo.Đúnglàkhôngchỉcóduynhấtmộtcách“đúng”đểlấymẫudữliệu,nhưngnócórấtnhiềucáchkhôngđúng.Phầnnàybaogồmcácchủđề:ÁpdụngsaicáchàmvềCSDLDùngsaiSQL:khônglấynhữngthứbạncầnDùngPHPđểsắpxếpkếtquả1.1.1.1.DDDDùùùùngngngngsaisaisaisaiccccáááácccchhhhààààmmmmCSDLCSDLCSDLCSDLMộtđoạnmãPHPđãdùngcúphápsauđểlấykếtquảtừCSDL(presentedbelowusingageneralizedsetofSQLfunctions):if(!($mautin=sql_fetch_row($truyvan))){print"Motloixayra:Khongtimthaymautinnao!";exit;}do{print"$mautin[0]:$mautin[1]\n<br>\n";}while($mautin=sql_fetch_row($truyvan));ChChChChúúúúýýýý::::Ởtrên,vàcácthídụsaunữa,$truyvandiễntảhandlehoặcpointerđếnmộttậpkế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ộtvàivấnđềvớiđoạnmãtrên:Nókiểmtracáctrườnghợp“khôngtìmthấy”("noincidents"case)bằngcáchlấymộtdòngNókhônglưukếtquảvàomảngliênkết(associativearray)1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratratrtrtrtrườườườườngngngnghhhhợợợợppppkhkhkhkhôôôôngngngngttttììììmmmmththththấấấấy:y:y:y:ccccááááchchchchllllààààmmmmsaisaisaisaiBằngcáchdùngsql_fetch_row(),PHPchủtrươngmộtcáchtiếpcậnhàmẩnchoviệcxácđịnhcókếtquảtìmthấyhaykhông.Mộtcáchkháctrựctiếpvàtườngminhlàđếmsốdòngcủakếtquảbằngsql_num_rows()nhưdướiđây:<?phpif(sql_num_rows($truyvan)<=0){print"Motloixayra:Khongtimthaymautinnao!";exit;}while($mautin=sql_fetch_row($truyvan)){print"$mautin[0]:$mautin[1]\n<br>\n";}?>1.2.1.2.1.2.1.2.TTTTừừừừbbbbỏỏỏỏvvvvòòòòngngngngllllặặặặppppDo..WhileDo..WhileDo..WhileDo..WhileTrướchếtvàtrênhết,vònglặpthôtụcdo..whilekhôngbaogiờcầnnữavìkhidùngsql_num_row(),chúngtakhôngphảilấydòngđầutiêncủakếtquảkhimuốnkiểmtrakếtquảtrống.Thídụcũđãdiễntảmộtthídụm trong ó,nếukếtquảkhôngrỗng,dòngđầutiênđãđượclấybằnghàmsql_fetch_row()trongcâulệnhif.Cấutrúcdo..whilecầnthiếttrongtrườnghợpnàyvìkhiđó,bộđếmcủaCSDLđãtănglênvàchuyểnsangdòngkếtiếp.Dođó,bạnphảixửlí(lệnhdo)dòngđầutiênvìnóđãđượclấy.Cáclệnhtiếptheolấycácdòngkế,vàcứthế.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology13131313Dormitory204.B518:20PMApril7,2006Tạisaovòngdo..whiledo..whiledo..whiledo..whilebịcoinhưthôtục,xấuxa(nasty)?Trongthídụtrên,chỉcó1lệnhinkếtquảtrongvònglặp.Hãytưởngtượng,nếucó10lệnh ,người ọcmãphảitìmđiềukiệnwhilesaucáccâulệnhđó.Mộtcôngviệcphiềntoái.ĐiềukiệnWhilebắtđầucấutrúcthườngxuyênhơnlàkếtthúc.Mộtnhànghiêncứusẽphảicẩnthậnhơnđểkhôngnhầmlẫnđiềukiệnwhilecuốivớiđiềukiệnwhileđầu.1.3.1.3.1.3.1.3.GiGiGiGiữữữữmmmmọọọọiiiiththththứứứứggggọọọọnnnnggggààààngngngngvvvvààààđơđơđơđơnnnngigigigiảảảảnnnnVớitrườnghợpkếtquảrỗng,sql_num_rows()đưađếnngaykếtquả,trongkhisql_fetch_row()thìkhôngsql_fetch_row()sql_fetch_row()sql_fetch_row()sql_fetch_row()nóirằng"Tôitìmthấy0dòngtrongtậpkếtquả.Điềunàynghĩalàcó0kếtquả”(Ifoundnorowsintheresultset.Thismustmeanthattherearenone.)sql_num_rows()sql_num_rows()sql_num_rows()sql_num_rows()nóirằng“Sốdòngtrongkếtquảlà0”(Thenumberofrowsintheresultsetis0).Nhưngđiềuđóthựcsựtạonênsựkhácbiệtnào?Xétcùngmộtsựsosánh,nhưngbâygiờlàtrongngữcảnhcủađiềukiệnifvàcủabiểuthức ,trong oạnlệnhgiả(Pseudo-code):****if(!($mautinif(!($mautinif(!($mautinif(!($mautin====sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan)))sql_fetch_row($truyvan))){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}: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;$mautinkhôngphảilàzerovàcógiátrịlàTrue.Dođó!(True)=False,vàtiếptụcvớ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){{{{PrintPrintPrintPrintErrorErrorErrorError}:}:}:}:ođếmsốdòngtrongtậpkếtquả.oNếunhỏhơnhaybằng0,inthôngbáolỗi.oNếukhông,tiếptục.Biểuthứcnàodểhiểuhơn?Rõrànglàcáchđếmsẽtrựctiếpvàgọngànghơn.Sựkhácbiệtthựctếlàgì?Vớimộtlệnhifđơngiản,chúngtakhôngthuđượclợinhều.Tuynhiên,vớihơn10000dònglệnh,hãydànhthờigiannghĩđếncáchrõràngnhất,nósẽtiếtkiệmchongườiphântíchchươngtrìnhnhiềugiờsuynghĩa.Lợiíchkháccóthểkểđếnlàchươngtrìnhcủabạnsẽnhanhhơnvàdễpháttriểnhơn.PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology14141414Dormitory204.B518:20PMApril7,20061.4.1.4.1.4.1.4.KhiKhiKhiKhimmmmààààDBMSDBMSDBMSDBMSccccủủủủaaaabbbbạạạạnnnnkhkhkhkhôôôôngngngnghhhhỗỗỗỗtrtrtrtrợợợợsql_num_row()sql_num_row()sql_num_row()sql_num_row()VàiDBMScóthểkhônghỗtrợhàmsql_num_row().TôixinchiasẻvớibạnnếuDBMScủabạnlàmộttrongsốđó.Bạnsẽphảitìmtrongkếtquảrỗngbằngcáchlấydòng.Tuynhiên,trongtrườnghợpnày,nónêndùngmộtbiếnbooleannhưsau:<?php$timthay=false;while($mautin=sql_fetch_array($truyvan)){$timthay=true;}if(!$timthay){print"Loi!";}?>1.5.1.5.1.5.1.5.LLLLấấấấyyyykkkkếếếếttttququququảảảả::::hhhhããããyyyychchchchọọọọnnnnccccááááchchchchccccóóóóííííchchchchVấnđềthứhaitrongđoạnmãnàylànódùngsql_fetch_row()đểlấytậpkếtquả.Hàmsql_fetch_row()chỉtrảvềmảngđánhchỉsố,trongkhiđósql_fetch_array()trảvềmảngđánhchỉsốvàmảngdùngchuỗi.$mautin=sql_fetch_array($truyvan);print$mautin[1];//Cotthu2print$mautin[name];//TencotChChChChúúúúýýýý::::Cónhiềuquyướckhácnhauvềviệcdùngdấunháykhithêmmộtđốisốkiểuchuỗi.Trongthídụvềtêncộtởtrên,vàsuốtbàiviếtnày,nósẽđượcbỏ.Từquanđiểmcủanhàpháttriển,hàmnàocólợihơn?Mảngdùngchuỗigiúpchongườiđọchiểuđượcbạnđanglấycáigìchỉthôngquaviệcđọcmã,nhưthídụđúngdướiđây:<?phpif(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.KhiKhiKhiKhinnnnààààoooosql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)sql_fetch_row($truyvan)nnnnêêêênnnnđượđượđượđượccccddddùùùùngngngngTôikhôngthựcsựlàfancủathesql_fetch_row().Tuynhiên,cómộttìnhhuốngmàdùngnókhônggiảmkhả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.Đôikhibạnđểchongườidùngtựđịnhnghĩacâutruyvấn.Trườnghợpnàybạnsẽkhôngbiếtcáccộttrongkếtquả.Dođó,dùnghàmsql_fetch_row()kèmvớicount()sẽxửlíhiệuquảcáccộttrongmộthàng:<?phpfor($i=0;$i<count($mautin);$i++){print"Column".($i+1).$mautin[$i]."\n<BR>\n";}?>2.2.2.2.DDDDùùùùngngngngsaisaisaisaiSQL:SQL:SQL:SQL:khkhkhkhôôôôngngngngllllấấấấyyyynhnhnhnhữữữữngngngngggggììììbbbbạạạạnnnnccccầầầầnnnnPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology15151515Dormitory204.B518:20PMApril7,2006Nhưlàvấnđềcủathựchành,đơngiảnlàsẽsailầmkhidùngPHPxửlímọidòngcủaCSDL.TôiđãbắtgặpngườitadùngPHPđểchạymộtchươngtrìnhtìmkiếmđơngiảntrên2MBdữliệuvàtựhỏitạisaocáingônngữnàychạylâuthế.Lấy2MBdữliệutừCSDLcóthểlàmbạnchờmãimãi.Ngônngữtruyvấnchuẩn(StandardStandardStandardStandardQueryQueryQueryQueryLanguageLanguageLanguageLanguage----SQLSQLSQLSQL)đượ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ằngmãSQLđangdùngchưađượctốiưuhoá.2.1.2.1.2.1.2.1.MMMMệệệệnhnhnhnhđềđềđềđềWHEREWHEREWHEREWHEREMộtthídụkinhđiểnvềsựhiểuquảcủaSQLliênquanđếnmệnhđềwhere.ĐoạnmãsausẽlấycáckếtquảvàinratênvàmãsinhviêncủasinhviêncóMASV='511203008':<?phpinclude(“includes/taptinketnoi.inc”);$strsql="SELECTMASV,HOTENFROMSINHVIEN";$truyvan=@sql_query($strsql,$ketnoi);if(!$truyvan){die(sprintf("LOI:[%d]:%s",sql_errno(),sql_error()));}if(@sql_num_rows($truyvan)<=0){die("KhongketquatimduoctuCSDL!");}while($mautin=@sql_fetch_array($truyvan)){if($mautin[MASV]==“511203008”){print"MASV:$mautin[MASV]\n<br>\n";print"Hoten:$mautin[HOTEN]\n<br>\n";break;}}?>Đoạnmãtrênchưađượctốiưu:chúngtađangdùngPHPđểtìmkiếmtrongtoànbộCSDL!NếunhưđiềunàykhôngquantrọngđốivớicácCSDLnhỏ,khikíchthướcCSDLtănglênbạnsẽcảmthấymộtcúđấmnặngnềvềhiệunăng.Lờigiảirấtđơngiản:sửacâuSQLđểchứamệnhđềWHERE:$strsql="SELECT*FROMSINHVIEN";$strsql.="WHEREMASV='511203008'";PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology16161616Dormitory204.B518:20PMApril7,2006MệnhđềWHEREchophépbạntìmkiếmchọnlọchơn.Giớihạnchọnlọccủamệnhđềwherechínhlàmộthàmvớiđốisốcủanó.Trongthídụtrênđốisốlà"MASV='511203008'".Bâygiờchúngtađãchọnđượcdữliệucầnthiết,bạnchỉviệcdùngPHPđểinrasauđó:if(@sql_num_rows($truyvan)!=1){die("KhongdungsomautinnhanduoctuCSDL!");}$mautin=@sql_fetch_array($truyvan);print"Hovaten:$mautin[HOTEN]\n<br>\n";print"MASV:$mautin[MASV]\n<br>\n";3.3.3.3.DDDDùùùùngngngngPHPPHPPHPPHPssssắắắắppppxxxxếếếếppppkkkkếếếếttttququququảảảảNhiềungườilấydữliệuởtìnhtrạngkhôngcóthứtự,nhưngrồiđoạnmãPHPtiếptheolạisắpthứtựchúng.NênchớrằngsắpxếpbằngSQLnhanhhơnPHP.DùngcúphápORDERBYcủaSQLđểsắpxếpthayvìhàmksort()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ệungayvàolúcnóđượcđịnhnghĩa?Nógiúpchúngtađỡphảiduyệtquatậpkếtquảlầnthứhai.Dovậy,bỏhàmksort()rakhỏichươngtrìnhtrênvàthayđoạnmãSQLbằngđoạndướiđây,códùngdùngcúphápORDERBY:$strsql="SELECTname,email,phoneFROMsome_table";$strsql.="WHEREnameISLIKE'%baggins'ORDERBYname";12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology17171717Dormitory204.B518:20PMApril7,2006KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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";}?>12.12.12.12.ThiThiThiThiếếếếuuuussssựựựựkikikikiểểểểmmmmllllỗỗỗỗiiiiTôiđãthấynhiềuchươngtrìnhthiếumộtlượngkiểmtralỗiđầyđủ.Nguyênnhânphầnlớnlàdolậptrìnhviênkhôngdànhthờigianđểlênmộtkếhoạchthíchhợpchochươngtrìnhcủamình,vàxácđịnhnhữngvịtrícóthểdẫnđếnlỗi.Kiểmtralỗikhôngnênthựchiệnsaukhiviếtchươngtrình.Sựthiếusóttrongtầmnhìntrướccóthểdẫnđếnnhữnglỗinghiêmtrọng,khôngnhữnggâyrakếtquảsaimàthậmchícònlàmhỏnghệthống(evencauseyoursystemtocrash)!1.1.1.1.MongMongMongMongđợđợđợđợiiiiđđđđiiiiềềềềuuuuttttệệệệnhnhnhnhấấấấttttMọichươngtrìnhđềucókhảnănghưhỏngtrongnhữngtìnhhuốngsai.Đểgiảmthiểunhữngrủironhưthế,bạncầnlênkếhoạchđể:KiểmtrakếtquảlờigọihàmKiểmtrakếtquảlờigọihệthốngĐặtmứcerror_reportinglàE_ALLtrongtậptinphp.ini1.1.1.1.1.1.1.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhààààmmmmMỗikhibạngọimộthàmlàmthayđổinhiềudữliệu,luônkiểmtrađểđảmbảorằngkếtquảtrảvềtrongphạmvigiátrịđượcchấpnhận(arangeofallowablevalues).Trongthídụdướiđây,mộtlỗiillegaldivisionbyzerosinhratronglầnlặpthứ6củavòngfor($iđượctănglên1trongkhi$jbịgiảmđi1).Vàolầnthứ6,khiđó$i=$j=0.<?phpmt_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.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttququququảảảảllllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngPHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology18181818Dormitory204.B518:20PMApril7,2006Luônđảmbảorằng,khibạnlàmviệcvớicáctiếntrìnhhoặctậptinngoàiPHP,mọithứđềuvậnhànhđúng.Mộtthídụtuyệtvờilàviệckiểmtrađầuracủamộtlờigọihệthốngkhidùnghàmsql_connect().XácnhậnđầurađểkiểmtraliênkếtđếnCSDLlàđúng.Làmsaiđiềunàycóthểdẫnđếncáctruyvấnhỏngvàmấtdữliệutrongkhithậmchí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.ĐặĐặĐặĐặttttmmmmứứứứccccerror_reportingerror_reportingerror_reportingerror_reportingllllààààE_ALLE_ALLE_ALLE_ALLtrongtrongtrongtrongttttậậậậpppptintintintinphp.iniphp.iniphp.iniphp.iniHãyđảmbảobạncấuhìnhvớimứcđộbáolỗicaonhấtcóthể.Nếubạnkhôngđặtnóởmứccaonhất,ítnhấtlàtrongquátrìnhtìmlỗi(debugging),bạncóthểbỏquanhữnglỗinhưlàbiểuthứcchínhquy(regularexpressions)khônghợplệvàcácgiátrịkhôngchínhxác.XemlạilầnnữathídụtôiđãđưatrongphầnKiểmtrakếtquảlờigọihàm,ởdướiđây.Giảsửbạnđặterrorreportingởmứcthấp,E_ERROR.Chúýrằngkếtquảinrakhichươngtrìnhthihànhhàmdo_math:khôngcóthôngbáoillegaldivisionbyzerođãtừnghiệnralầntrước,phần$i=$j=0đơnthuầnkhônghiệnkếtquả.<?phperror_reporting(E_ERROR);mt_srand((double)microtime()*1000000);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";}?>Kếtquảhiệnra:-5148.25-5271-323.75-4931-7713.5?-4702.5-488.5-928.5-1394.752.2.2.2.BBBBộộộộququququảảảảnnnnllllííííllllỗỗỗỗiiiitutututuỳỳỳỳchchchchỉỉỉỉnhnhnhnhPHPthườ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àmset_error_handler().Hàmset_error_handler()cóthểđượcdùngđểghilạicáclỗixảyravớichươngtrìnhcủabạn.Thayvìlàmphiềnngườidùngvớicácthôngbáolỗi,bạncóthểghilạichoriêngbạn,bằngcáchđặtmộthàmquảnlílỗituỳchỉnh(acustomerrorhandlingfunction).PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology19191919Dormitory204.B518:20PMApril7,2006Trongthídụdưới,set_error_handler()đượcdùngđểchỉđịnhhàmerror_handler()làbộquảnlílỗimặcđịnh.Khimộtlỗixảyra,error_handler()đượcgọivàhàmPHPerror_log()đượcdùngđểghilỗivàotậptinerror_file.NếumàlỗithuộcloạiE_ERROR,chúngtasẽthoátchươngtrìnhvàinthôngbáolỗi.<?php//voiderror_handler(stringtype,stringmessage,stringfile,intline)//Customerrorhandler,setbytheset_error_handler()//function.functionerror_handler($type,$message,$file=__FILE__,$line=__LINE__){error_log("$message,$file,$line",3,'error_file');if($type&E_ERROR){print'Anerroroccurred,ithasbeenloggedanditwillbeaddressed.';exit;}}set_error_handler('error_handler');?>11.11.11.11.LLLLạạạạmmmmddddụụụụngngngngHHHHướướướướngngngngđốđốđốđốiiiittttượượượượngngngng(H(H(H(HĐĐĐĐT)T)T)T)Môhìnhhướngđốitượnglàmộtkháiniệmtuyệtvời.Nócórấtnhiềulợiđiểm,màđángchúýnhấtlàkhảnăngdùnglạimãdễdàng.Tuynhiê,theonhưchúngtađượchiểu:PHPkhôngphảilàmộtngônngữHĐT.MặcdùPHPcómộtsựhỗtrợđầyđủvềHĐT,nókhônghiệuquảlẫnkhôngkhônngoannếudùngtínhnăngHĐTcủanókhibạncócáchàmkhácđểđạtđượccùngkếtquả.LídolàsựhỗtrợHĐTcủaPHPkhôngđượcpháttriểnmạnh.Trongkhicóhầuhếtcácphầntửchínhyếu,PHPvẫncònthiếuvàitínhnăngcaocấp(nhưcáckháiniệmprotected,private)màmộtngônngữHĐTthựcsự(thídụnhưC++,Java)phảicó.CácmãhỗtrợHĐTcủaPHPkhôngđượctinhchỉnhvàcũngkhônghiệuquả.NghĩalànếubạndùngmôhìnhHĐTtrongPHP,bạncóthểlàmchậmchươngtrìnhđángkể.Nóichung,mộtứngdụngdùngHĐTsẽchậmđi,cũngnhưlàbạndùngeval()thìsẽchậmhơnlàdùngmãbìnhthường.ĐểminhhoạđầyđủhơnviệcHĐTcógìđókhôngtốt,tôiđãtừngphảidùngnhữngtínhnăngvàkháiniệmcaocấpcủaPHP,mộtvàitrongsốđóthậmchíchưacótàiliệuchỉdẫn.1.1.1.1.ChChChChúúúúngngngngtatatataccccóóóóththththểểểểllllààààmmmmggggììììmmmmààààkhkhkhkhôôôôngngngngccccầầầầnnnnHHHHĐĐĐĐ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ạpmà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ìnhrấtmạnhcóthểđượcviếtmàkhôngdùngmấtcứkháiniệmvàmôhìnhHĐTnào(PHPđượcviế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ạochươngtrìnhcótínhkếtdínhvàdễmởrộngmàkhôngdùngmôhìnhHĐT:PHPprogrammingdynamicwebforewreybody21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology20202020Dormitory204.B518:20PMApril7,2006TạomộtAPITạomộttrìnhtựtênNhómcáchàmliênquanvàomộttậptin1.1.1.1.1.1.1.1.TTTTạạạạoooommmmộộộộttttAPIAPIAPIAPIÁpdụng3lớpchochươngtrìnhcủabạn:Thứnhất,cáchàmthựcsựthựchiệncôngviệccủabạnThứhai,mộthàmAPI.ĐâylàhàmgiúpbạnxâydựngcácchươngtrìnhđặcthùChươngtrìnhMortgageRate.php<?php//Theinternalfunctionsarelayer1//Internalfunctiontocalculatethecorrect//interestratetobeusedgiventheamountpermonth//andthetimeitistobepaidinfunction_mort_find_interest_rate($total){if($total<30000)return(7.4);elseif($total>30000)return(3.2);elseif($total>50000)return(2.5);elsereturn(1.7);}//TheAPIislayer2//doublecalculate_mortgage_rate(intmoney,inttime,intmonth)//Calculatethemortgagerategiventhe//thetotalmoney,timeitspaidoverand//theintervalsfunctioncalculate_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//fromaforminclude_once'MortgageRate.php';$price=calculate_mortgage_rate($money,$time,$period);print"Your$periodmonthcostis$price";?>...