... PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology23232323Dormitory204.B518:20PMApril7,2006KhKhKhKhôôôôngngngngddddùùùùngngngngccccáááácccchhhhààààmmmmssssẵẵẵẵnnnnccccóóóóNhiềulậptrìnhviênPHPcónềntảngCcóvẻkhôngnhậnrarằngPHPcungcấpnhiềuhàmsẵncógiúpthaythếcácđoạnmãdài.NếubạnđếnvớiPHPtừC,tôikhuyênbạnnênđọcquatàiliệutrướckhiviếtmộtkhốilệnhđểxemPHPcósẵnhàmnàogiúpcuộcsốngcủabạndễdànghơnkhông.ĐổĐổĐổĐổiiiittttêêêênnnnccccáááácccchhhhààààmmmmPHPPHPPHPPHPđãđãđãđãccccóóóóTôiđãthấyngườitađổitêncáchàmđãcócủaPHPchỉđểgiúphọdễnhớhơn.Điềunàykhôngchỉlàmchậmchươngtrình,màlàmchođoạnmãkhóđọchơn.DDDDùùùùngngngnghhhhướướướướngngngngđốđốđốđốiiiittttượượượượngngngngququququáááámmmmứứứứccccPHPkhôngphảilàmộtngônngữHĐT,dùnócungcấpcáctínhnăngHĐT.BạncầnluônnhậnthứcrằngHĐTtrongPHPsẽlàmchậmđángkểchươngtrình.1.1.1.1.LLLLấấấấyyyyththththôôôôngngngngtintintintinởởởởđâđâđâđâu?u?u?u?MaymắnlàcórấtnhiềuthôngtinvềviệclàmthếnàođểlậptrìnhPHP.VàinơitốtnhấtlàZend.combảngốccủabàiviếtnàylàởđóProfessionalPHPmộttrongnhữngsáchtoàndiệntốtnhấtvềPHP,tốtchocảlậptrìnhviênvàkhông-lậptrìnhviên.WebApplicationDevelopmentwithPHPMộtquyểnsáchtuyệtvờidạybạncảcáchpháttriểnweblẫnvàitínhnăngcaocấpcủaPHP.BaogồmcáctàiliệuchínhthứcvềZendAPI.ThePHPDeveloper'sCookbookMộtquyểnsáchthiênvềlờigiảiđápchocácvấnđềgặpphảitrongPHP(dotui-SterlingHughes-viếtcùngAndreiZmievski)8.8.8.8.KhKhKhKhôôôôngngngngnhnhnhnhậậậậnnnnththththứứứứccccđầđầđầđầyyyyđủđủđủđủvvvvềềềềbbbbảảảảoooommmmậậậậttttNhữngngườidùngkhôngphảilúcnàocũnglàmviệcvớihệthốngcủachúngta.Vớitưcáchlàlậptrìnhviên,tráchnhiệmcủachúngtalàthiếtkếmộthệthốngantoàn,dễchịucóthểlàmviệcđượcchungvớilỗicủangườidùng.Khithiếtkếhệthống,bạnphảiđặtmìnhvàovịtríngườidùng.Xemxétnhữngchỗhọcóthểgặplỗivàtìmkiếmnhữnglỗhổngbảomậttiềmtàng.Rồibạnthiếtkếchươngtrìnhcókhảnăngsửachữalỗinàyvàlấpcáclỗhổngbảomật.Mộtđiềukháccũngquantrọnglà:dùxảyrahưhỏnghayhệthốngbịtấncônglàdolỗicủangườidùng,chínhbạnlàngườichịutráchnhiệmnếubạnđãviếtchươngtrìnhcónhiềulỗihaythiếunhữngbướckiểmtracầnthiếtdẫnđếnhỏngdữliệu.Thídụ,tôiđãthấynhiềuchươngtrìnhkhôngdùnghàmđãcócủaPHPmail()vốnantoànmàlạiđidùngsendmailthôngquapopen().Nócóthểdẫnđếnnhiềulỗhổngbảomật(thídụnhư/etc/passwdđượcgửiđếnngườidùngcuối).Cóvàinơithườngxảyracácsựcốvềbảomật,hoặctiềmnănggâyrahỏngdữliệurấtlớn:Thựchiệnlờigọihệthống.Tôikhôngcócáchnàodiễntảđượcmứcđộnguyhiểmcủavấnđềnày.Luônđảmbảorằngmọidữliệungườidùngđưavàolàantoàntrướckhichuyểnnóchomộtlờigọihệthống.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINNGNGNGNGƯỜƯỜƯỜƯỜIIIIDDDDÙÙÙÙNGNGNGNGMMMMỘỘỘỘTTTTCCCCÁÁÁÁCHCHCHCHMMMMÙÙÙÙQUQUQUQUÁÁÁÁNGNGNGNGKHIKHIKHIKHIĐƯĐƯĐƯĐƯAAAADDDDỮỮỮỮLILILILIỆỆỆỆUUUUCCCCỦỦỦỦAAAAHHHHỌỌỌỌVVVVÀÀÀÀOOOOLLLLỜỜỜỜIIIIGGGGỌỌỌỌIIIIHHHHỆỆỆỆTHTHTHTHỐỐỐỐNGNGNGNGMMMMÀÀÀÀKHKHKHKHÔÔÔÔNGNGNGNGKIKIKIKIỂỂỂỂMMMMTRATRATRATRATRTRTRTRƯỚƯỚƯỚƯỚCCCC.Khiđăngkíngườidùng.Nếubạntrôngmongcókếtquảchínhxác,luônkiểmtravàđảmbảobảnđăngkíđượckiểmtranhữngchỗcầnthiết.Trướctiên,cónhiềucáchđểkiểmtramộtđịachỉe-mailhợplệ.Hơnnữa,bạnnênkiểmtratuổicủangườidùngcónằmtrongphạmvithíchhợpkhông.Vớimộtsựsuyrộng,bạncóPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology25252525Dormitory204.B518:20PMApril7,2006mộtnhómthưtín,haytrongmộtkhomãnguồnnàođó).Tuynhiên,mộtbiểuthứcchínhquykhôngđủnếubạnmuốncókếtquảchínhxác.Cóvàicáchantoànhơnmàbạncóthểdùng:2.1.2.1.2.1.2.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttnnnnốốốốiiii(socket(socket(socket(socketvalidation)validation)validation)validation)Mộtcáchđểkiểmđịnhđịachỉe-mailmàkhôngquấyrầytrựctiếpđếnngườidùnglàtạomộtkếtnốiđếnservernhậnđượctrongđịachỉe-mail,sauđótìmtênđăngkícủahọ.2.1.1.2.1.1.2.1.1.2.1.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmKhônggâybấttiệnchongườidùngvìnóđượctiếnhànhtrongsuốt.Pháthiệnnhiềuđịachỉmamàbiểuthứcchínhquykhôngbiết(nhưlàjoe@fgsdh.com).2.1.2.2.1.2.2.1.2.2.1.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmKhôngpháthiệnđượcđịachỉbịđánhcắp.Thídụ,nếuJohnDoeđưađịachỉe-mailcủatôi(phanthanhkieu@php.net),mọithứvẫntiếnhànhbìnhthường,dùnólàđịachỉcủatôichứkhôngphảicủahắnta.Kiểmtrachậmhơnbiểuthứcchínhquy.Mailservercủangườidùngcóthểtạmngưnghoạtđộngtrongthờigianngắn,làmchomộtđịachỉe-mailhợplệbịtừchối2.2.2.2.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrattttươươươươngngngngttttááááccccMộtcáchkhácđểkiểmđịnhđịachỉe-maillàgửimộtkhoáđặcbiệtđếnhộpthưngườidùng,vàbắthọnhậpkhoáđóđểtiếptục.Điềunàyđảmbảorằngkhôngnhữngđịachỉe-maillàhợplệ,màngườidùngcóquyềntruyxuấtvàođịachỉđó.2.2.1.2.2.1.2.2.1.2.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmLàcáchtốtnhấtđểkiểmtrangườidùngcómộtđịachỉe-mailhợplệ2.2.2.2.2.2.2.2.2.2.2.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmĐòihỏingườidùngphảitiếnhànhthêmbướcphụ.Điềunàyquấyrầymấyngườicóýđịnhlàmphiềnbạn.Giốngnhưmọicáchkhác,nókhôngđảmbảođượcchống-đánh-lừa.NgườidùngcóthểtạomộtđịachỉtạmởHotmailhayNetaddressvàsauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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:BPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology24242424Dormitory204.B518:20PMApril7,2006thểkhẳngđịnhkháchắcchắnrằngkhôngcómộtngười200tuổinàocókhảnăngdùngmáyvitính.Khichấpnhậnthẻtíndụng.Mộtsốlậptrìnhviênchỉdùngnhữngthuậttoánđơngiảnmàcóthểdễdàngbịđánhlừakhithựchiệnkiếmtrathẻtíndụng.Chỉchấpnhậnthẻcủacáccôngtylớnđểkiểmtratínhhợplệcủasốthẻtrướckhichấpnhậnthẻcủangườidùng.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINTTTTƯỞƯỞƯỞƯỞNGNGNGNGMMMMỘỘỘỘTTTTTHUTHUTHUTHUẬẬẬẬTTTTTOTOTOTOÁÁÁÁNNNN1.1.1.1.BBBBảảảảoooommmmậậậậttttccccủủủủaaaallllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngMỗikhibạnđưadữliệucủangườidùngvàolờigọihệthống,bạncầntỉnhtáokiểmtradữliệuđó.Đảmbảorằngkhôngcógìnguyhiểmnằmtrongdữliệuđócóthểlừaphỉnhhệthốngthựchiệnnhữnglệnhkhôngmongmuốn.PHPcungcấpmộthàmlàmđiềuđó:EscapeShellCmd()Bấtcứkhinàobạnchuyểnmộtlệnhcóchứadữliệunhạycảm,trốnthoátdữliệuđóbằnghàmEscapeShellCmdEscapeShellCmdEscapeShellCmdEscapeShellCmd():Trốnthoát(escaping)dữliệucónghĩalàthêmdấusổngược(backslash\)trướckítựcóthểlừaphìnhhệthống(chínhxáclàcáckítự#&;?'\"|*?~<>^()[]{}$\\\x0A\xFF).MMMMããããHTMLHTMLHTMLHTML<html><head><title>NameLookup</title></head><body><h1>NameLookup</h1><?phpif($name){system(EscapeShellCmd("lookup$name"));print"nn";}?><formaction="<[color=blue]?phpprint$PHP_SELF;?>[/color]"method="GET">Enteranametolookup:<inputtype="text"name="name"><inputtype="submit"value="LookupName"></form></body></html>DùEscapeShellCmd()làmộthàmtốtđểkiểmtralệnh,bạnvẫnnênthửvàthựchiệncáckiểmtrađặcthùphụthuộcvàoloạidữliệu.HàmEscapeShellCmd()sẽkhôngkiểmtratínhđúngđắncủadữliệuđượcđệtrình,nósẽchỉngăncảnngườidùnglàmcácviệckhôngđượcphép.1.1.1.1.1.1.1.1.ĐĐĐĐiiiixaxaxaxahhhhơơơơnnnnmmmmộộộộttttbbbbướướướướccccNhưmộtquyluật,nênkiểmtracáckítựđượcphéphơnlàkiểmcáckítựkhôngđượcphép.Thídụ,đảmbảorằng$namechỉchứacáckítựchữvàsố(alphanumericcharacters).Bằngcáchnày,rấtkhóđểkhaitháclỗhổngtronghệthốngcủabạn.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrađịđịđịđịaaaachchchchỉỉỉỉe-maile-maile-maile-mailMộttrongnhữnghìnhthứckiểmtraphổbiếnnhấtlàxemmộtđịachỉe-mailcóhợplệkhông.Mấytaymớivàonghềsẽchỉdùngcácbiểuthứcchínhquy(màhọlượmđượctrongPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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);PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology26262626Dormitory204.B518:20PMApril7,2006PHẦN3:7LỖICHẾTNGƯỜI7.7.7.7.ChChChChééééppppvvvvààààddddáááán:n:n:n:khkhkhkhôôôôngngngngphphphphảảảảiiiihhhhướướướướngngngngđđđđiiiittttốốốốttttTôiđãgặpnhiềutaylậptrìnhmớivàonghềđichépnhữngđoạnmã(thídụnhưlàkiểmtrađịachỉe-mail,gửie-mail,lấygiátrịtừformđểsoạne-mail).Họthườngdánchúngvàochươngtrìnhcủamìnhvàrồikếtquảlàmộtđốngnhữngcâulệnhgửiformkhôngantoàn.Dùrằngmộtđoạnmãchạyđượctrongnhữngđiềukiệntốiưu,nóthườnggặplỗitrongbấtkìsựkiểmtra"mãtốt"nàoCôngviệcchắpvásẽkhkhkhkhôôôôngngngngcócácưuđiểmsau:MMMMởởởởrrrrộộộộngngngngđượđượđượđược:c:c:c:đoạnmãtrôngnhưcácmảnhriêngrẽrápvávàonhau.Nếunhờmộtlậptrìnhviêncókinhnghiệmsửachươngtrìnhcủabạn,họthườngthíchviếtlạitoànbộĐoạnmãkhôngđọcđượcsẽkhôngmởrộngđược.AnAnAnAntotototoààààn:n:n:n:bạncóthểđangchépmãcủangườikhácvàochươngtrìnhcủamìnhmàlạikhônghiểurõràngđoạnmãđó.Hãytưởngtưởngxem.NếuđoạnmãđócómộtlỗilàmxoátoànbộđĩacủabạnHơnnữa,cùngmộtđoạnmãthìtínhantoànkhônggiốngnhautrêncáchệthốngkhácnhau.Cuốicùng,chươngtrìnhcủabạnsẽkếthừalỗicủangườikhác.Nhanh:Nhanh:Nhanh:Nhanh:khicắtdáncácđoạnmã,kếtquảthườngsẽchạykhôngnhanh,vìchúngkhôngcómộttiếntrìnhchunghợplí(đâylàđiềuquantrọngnhấtkhiviếtcácchươngtrìnhnhanh)1.1.1.1.LLLLààààmmmmđúđúđúđúngngngngphphphphươươươươngngngngphphphphááááp:p:p:p:ttttììììmmmmhihihihiểểểểuuuutrtrtrtrướướướước,c,c,c,saosaosaosaochchchchééééppppsausausausauNghiêncứumãcủangườikháckĩlưỡngtrướckhisaochép.Phântíchxemnólàmgì.Chỉkhinàođoạnmãấyđọcđược,nhấtquánvớilogicchươngtrìnhcủabạn,vàkhôngcólỗi,thìmớinênsaochépnó.Tiếnhànhlúcnàysẽgiúpbạnchỉnhsửanóphùhợpvớicácphầncònlạicủachươngtrìnhmộtcáchthoảimáihơn.2.2.2.2.CCCCááááccccththththưưưưviviviviệệệệnnnnrrrrấấấấttttttttốốốốttttChỉdùngcácthưviệnPHPtừcácnguồntincậynhưPEARhoặckhocáclớpcủaPHP(PHPClassesRepository).VớicácgóiAPIcósẵn,việcdùngcáchàmcủanócũngkhôngthànhvấnđề.Thựcra,nếubạntìmđượcmộtthưviệnviếtsẵnbởimộtnguồntincậy,thìthườngnósẽlàmộtlựachọntốtđểdùngchochươngtrình(thayvìtựviếtlấy).6.6.6.6.KhKhKhKhôôôôngngngngccccóóóóđườđườđườđườngngngngllllốốốốiiii((((guidelines))))chochochochođồđồđồđồáááánnnnMộtlầnkhitôimớibắtđầulậptrình,tôilàmviệctrênmộtđồánkhácơbản(vớiPerl)cùng3lậptìnhviênkhác.Vìtôicòntrẻ(vàkhôngphảitrưởngnhóm),chúngtôikhôngcóđườnglốiviếtmãchođồán.Mỗingườiđượcgiaomộtphầncôngviệc,vàlàmriêngrẽ.Khichúngtôinhậpchunglạiđểchạychươngtrìnhcuốicùng,mỗiphầncủađồánnhìnkháchẳnnhauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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 ... PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology23232323Dormitory204.B518:20PMApril7,2006KhKhKhKhôôôôngngngngddddùùùùngngngngccccáááácccchhhhààààmmmmssssẵẵẵẵnnnnccccóóóóNhiềulậptrìnhviênPHPcónềntảngCcóvẻkhôngnhậnrarằngPHPcungcấpnhiềuhàmsẵncógiúpthaythếcácđoạnmãdài.NếubạnđếnvớiPHPtừC,tôikhuyênbạnnênđọcquatàiliệutrướckhiviếtmộtkhốilệnhđểxemPHPcósẵnhàmnàogiúpcuộcsốngcủabạndễdànghơnkhông.ĐổĐổĐổĐổiiiittttêêêênnnnccccáááácccchhhhààààmmmmPHPPHPPHPPHPđãđãđãđãccccóóóóTôiđãthấyngườitađổitêncáchàmđãcócủaPHPchỉđểgiúphọdễnhớhơn.Điềunàykhôngchỉlàmchậmchươngtrình,màlàmchođoạnmãkhóđọchơn.DDDDùùùùngngngnghhhhướướướướngngngngđốđốđốđốiiiittttượượượượngngngngququququáááámmmmứứứứccccPHPkhôngphảilàmộtngônngữHĐT,dùnócungcấpcáctínhnăngHĐT.BạncầnluônnhậnthứcrằngHĐTtrongPHPsẽlàmchậmđángkểchươngtrình.1.1.1.1.LLLLấấấấyyyyththththôôôôngngngngtintintintinởởởởđâđâđâđâu?u?u?u?MaymắnlàcórấtnhiềuthôngtinvềviệclàmthếnàođểlậptrìnhPHP.VàinơitốtnhấtlàZend.combảngốccủabàiviếtnàylàởđóProfessionalPHPmộttrongnhữngsáchtoàndiệntốtnhấtvềPHP,tốtchocảlậptrìnhviênvàkhông-lậptrìnhviên.WebApplicationDevelopmentwithPHPMộtquyểnsáchtuyệtvờidạybạncảcáchpháttriểnweblẫnvàitínhnăngcaocấpcủaPHP.BaogồmcáctàiliệuchínhthứcvềZendAPI.ThePHPDeveloper'sCookbookMộtquyểnsáchthiênvềlờigiảiđápchocácvấnđềgặpphảitrongPHP(dotui-SterlingHughes-viếtcùngAndreiZmievski)8.8.8.8.KhKhKhKhôôôôngngngngnhnhnhnhậậậậnnnnththththứứứứccccđầđầđầđầyyyyđủđủđủđủvvvvềềềềbbbbảảảảoooommmmậậậậttttNhữngngườidùngkhôngphảilúcnàocũnglàmviệcvớihệthốngcủachúngta.Vớitưcáchlàlậptrìnhviên,tráchnhiệmcủachúngtalàthiếtkếmộthệthốngantoàn,dễchịucóthểlàmviệcđượcchungvớilỗicủangườidùng.Khithiếtkếhệthống,bạnphảiđặtmìnhvàovịtríngườidùng.Xemxétnhữngchỗhọcóthểgặplỗivàtìmkiếmnhữnglỗhổngbảomậttiềmtàng.Rồibạnthiếtkếchươngtrìnhcókhảnăngsửachữalỗinàyvàlấpcáclỗhổngbảomật.Mộtđiềukháccũngquantrọnglà:dùxảyrahưhỏnghayhệthốngbịtấncônglàdolỗicủangườidùng,chínhbạnlàngườichịutráchnhiệmnếubạnđãviếtchươngtrìnhcónhiềulỗihaythiếunhữngbướckiểmtracầnthiếtdẫnđếnhỏngdữliệu.Thídụ,tôiđãthấynhiềuchươngtrìnhkhôngdùnghàmđãcócủaPHPmail()vốnantoànmàlạiđidùngsendmailthôngquapopen().Nócóthểdẫnđếnnhiềulỗhổngbảomật(thídụnhư/etc/passwdđượcgửiđếnngườidùngcuối).Cóvàinơithườngxảyracácsựcốvềbảomật,hoặctiềmnănggâyrahỏngdữliệurấtlớn:Thựchiệnlờigọihệthống.Tôikhôngcócáchnàodiễntảđượcmứcđộnguyhiểmcủavấnđềnày.Luônđảmbảorằngmọidữliệungườidùngđưavàolàantoàntrướckhichuyểnnóchomộtlờigọihệthống.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINNGNGNGNGƯỜƯỜƯỜƯỜIIIIDDDDÙÙÙÙNGNGNGNGMMMMỘỘỘỘTTTTCCCCÁÁÁÁCHCHCHCHMMMMÙÙÙÙQUQUQUQUÁÁÁÁNGNGNGNGKHIKHIKHIKHIĐƯĐƯĐƯĐƯAAAADDDDỮỮỮỮLILILILIỆỆỆỆUUUUCCCCỦỦỦỦAAAAHHHHỌỌỌỌVVVVÀÀÀÀOOOOLLLLỜỜỜỜIIIIGGGGỌỌỌỌIIIIHHHHỆỆỆỆTHTHTHTHỐỐỐỐNGNGNGNGMMMMÀÀÀÀKHKHKHKHÔÔÔÔNGNGNGNGKIKIKIKIỂỂỂỂMMMMTRATRATRATRATRTRTRTRƯỚƯỚƯỚƯỚCCCC.Khiđăngkíngườidùng.Nếubạntrôngmongcókếtquảchínhxác,luônkiểmtravàđảmbảobảnđăngkíđượckiểmtranhữngchỗcầnthiết.Trướctiên,cónhiềucáchđểkiểmtramộtđịachỉe-mailhợplệ.Hơnnữa,bạnnênkiểmtratuổicủangườidùngcónằmtrongphạmvithíchhợpkhông.Vớimộtsựsuyrộng,bạncóPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology25252525Dormitory204.B518:20PMApril7,2006mộtnhómthưtín,haytrongmộtkhomãnguồnnàođó).Tuynhiên,mộtbiểuthứcchínhquykhôngđủnếubạnmuốncókếtquảchínhxác.Cóvàicáchantoànhơnmàbạncóthểdùng:2.1.2.1.2.1.2.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttnnnnốốốốiiii(socket(socket(socket(socketvalidation)validation)validation)validation)Mộtcáchđểkiểmđịnhđịachỉe-mailmàkhôngquấyrầytrựctiếpđếnngườidùnglàtạomộtkếtnốiđếnservernhậnđượctrongđịachỉe-mail,sauđótìmtênđăngkícủahọ.2.1.1.2.1.1.2.1.1.2.1.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmKhônggâybấttiệnchongườidùngvìnóđượctiếnhànhtrongsuốt.Pháthiệnnhiềuđịachỉmamàbiểuthứcchínhquykhôngbiết(nhưlàjoe@fgsdh.com).2.1.2.2.1.2.2.1.2.2.1.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmKhôngpháthiệnđượcđịachỉbịđánhcắp.Thídụ,nếuJohnDoeđưađịachỉe-mailcủatôi(phanthanhkieu@php.net),mọithứvẫntiếnhànhbìnhthường,dùnólàđịachỉcủatôichứkhôngphảicủahắnta.Kiểmtrachậmhơnbiểuthứcchínhquy.Mailservercủangườidùngcóthểtạmngưnghoạtđộngtrongthờigianngắn,làmchomộtđịachỉe-mailhợplệbịtừchối2.2.2.2.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrattttươươươươngngngngttttááááccccMộtcáchkhácđểkiểmđịnhđịachỉe-maillàgửimộtkhoáđặcbiệtđếnhộpthưngườidùng,vàbắthọnhậpkhoáđóđểtiếptục.Điềunàyđảmbảorằngkhôngnhữngđịachỉe-maillàhợplệ,màngườidùngcóquyềntruyxuấtvàođịachỉđó.2.2.1.2.2.1.2.2.1.2.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmLàcáchtốtnhấtđểkiểmtrangườidùngcómộtđịachỉe-mailhợplệ2.2.2.2.2.2.2.2.2.2.2.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmĐòihỏingườidùngphảitiếnhànhthêmbướcphụ.Điềunàyquấyrầymấyngườicóýđịnhlàmphiềnbạn.Giốngnhưmọicáchkhác,nókhôngđảmbảođượcchống-đánh-lừa.NgườidùngcóthểtạomộtđịachỉtạmởHotmailhayNetaddressvàsauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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:BPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology24242424Dormitory204.B518:20PMApril7,2006thểkhẳngđịnhkháchắcchắnrằngkhôngcómộtngười200tuổinàocókhảnăngdùngmáyvitính.Khichấpnhậnthẻtíndụng.Mộtsốlậptrìnhviênchỉdùngnhữngthuậttoánđơngiảnmàcóthểdễdàngbịđánhlừakhithựchiệnkiếmtrathẻtíndụng.Chỉchấpnhậnthẻcủacáccôngtylớnđểkiểmtratínhhợplệcủasốthẻtrướckhichấpnhậnthẻcủangườidùng.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINTTTTƯỞƯỞƯỞƯỞNGNGNGNGMMMMỘỘỘỘTTTTTHUTHUTHUTHUẬẬẬẬTTTTTOTOTOTOÁÁÁÁNNNN1.1.1.1.BBBBảảảảoooommmmậậậậttttccccủủủủaaaallllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngMỗikhibạnđưadữliệucủangườidùngvàolờigọihệthống,bạncầntỉnhtáokiểmtradữliệuđó.Đảmbảorằngkhôngcógìnguyhiểmnằmtrongdữliệuđócóthểlừaphỉnhhệthốngthựchiệnnhữnglệnhkhôngmongmuốn.PHPcungcấpmộthàmlàmđiềuđó:EscapeShellCmd()Bấtcứkhinàobạnchuyểnmộtlệnhcóchứadữliệunhạycảm,trốnthoátdữliệuđóbằnghàmEscapeShellCmdEscapeShellCmdEscapeShellCmdEscapeShellCmd():Trốnthoát(escaping)dữliệucónghĩalàthêmdấusổngược(backslash\)trướckítựcóthểlừaphìnhhệthống(chínhxáclàcáckítự#&;?'\"|*?~<>^()[]{}$\\\x0A\xFF).MMMMããããHTMLHTMLHTMLHTML<html><head><title>NameLookup</title></head><body><h1>NameLookup</h1><?phpif($name){system(EscapeShellCmd("lookup$name"));print"nn";}?><formaction="<[color=blue]?phpprint$PHP_SELF;?>[/color]"method="GET">Enteranametolookup:<inputtype="text"name="name"><inputtype="submit"value="LookupName"></form></body></html>DùEscapeShellCmd()làmộthàmtốtđểkiểmtralệnh,bạnvẫnnênthửvàthựchiệncáckiểmtrađặcthùphụthuộcvàoloạidữliệu.HàmEscapeShellCmd()sẽkhôngkiểmtratínhđúngđắncủadữliệuđượcđệtrình,nósẽchỉngăncảnngườidùnglàmcácviệckhôngđượcphép.1.1.1.1.1.1.1.1.ĐĐĐĐiiiixaxaxaxahhhhơơơơnnnnmmmmộộộộttttbbbbướướướướccccNhưmộtquyluật,nênkiểmtracáckítựđượcphéphơnlàkiểmcáckítựkhôngđượcphép.Thídụ,đảmbảorằng$namechỉchứacáckítựchữvàsố(alphanumericcharacters).Bằngcáchnày,rấtkhóđểkhaitháclỗhổngtronghệthốngcủabạn.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrađịđịđịđịaaaachchchchỉỉỉỉe-maile-maile-maile-mailMộttrongnhữnghìnhthứckiểmtraphổbiếnnhấtlàxemmộtđịachỉe-mailcóhợplệkhông.Mấytaymớivàonghềsẽchỉdùngcácbiểuthứcchínhquy(màhọlượmđượctrongPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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);PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology26262626Dormitory204.B518:20PMApril7,2006PHẦN3:7LỖICHẾTNGƯỜI7.7.7.7.ChChChChééééppppvvvvààààddddáááán:n:n:n:khkhkhkhôôôôngngngngphphphphảảảảiiiihhhhướướướướngngngngđđđđiiiittttốốốốttttTôiđãgặpnhiềutaylậptrìnhmớivàonghềđichépnhữngđoạnmã(thídụnhưlàkiểmtrađịachỉe-mail,gửie-mail,lấygiátrịtừformđểsoạne-mail).Họthườngdánchúngvàochươngtrìnhcủamìnhvàrồikếtquảlàmộtđốngnhữngcâulệnhgửiformkhôngantoàn.Dùrằngmộtđoạnmãchạyđượctrongnhữngđiềukiệntốiưu,nóthườnggặplỗitrongbấtkìsựkiểmtra"mãtốt"nàoCôngviệcchắpvásẽkhkhkhkhôôôôngngngngcócácưuđiểmsau:MMMMởởởởrrrrộộộộngngngngđượđượđượđược:c:c:c:đoạnmãtrôngnhưcácmảnhriêngrẽrápvávàonhau.Nếunhờmộtlậptrìnhviêncókinhnghiệmsửachươngtrìnhcủabạn,họthườngthíchviếtlạitoànbộĐoạnmãkhôngđọcđượcsẽkhôngmởrộngđược.AnAnAnAntotototoààààn:n:n:n:bạncóthểđangchépmãcủangườikhácvàochươngtrìnhcủamìnhmàlạikhônghiểurõràngđoạnmãđó.Hãytưởngtưởngxem.NếuđoạnmãđócómộtlỗilàmxoátoànbộđĩacủabạnHơnnữa,cùngmộtđoạnmãthìtínhantoànkhônggiốngnhautrêncáchệthốngkhácnhau.Cuốicùng,chươngtrìnhcủabạnsẽkếthừalỗicủangườikhác.Nhanh:Nhanh:Nhanh:Nhanh:khicắtdáncácđoạnmã,kếtquảthườngsẽchạykhôngnhanh,vìchúngkhôngcómộttiếntrìnhchunghợplí(đâylàđiềuquantrọngnhấtkhiviếtcácchươngtrìnhnhanh)1.1.1.1.LLLLààààmmmmđúđúđúđúngngngngphphphphươươươươngngngngphphphphááááp:p:p:p:ttttììììmmmmhihihihiểểểểuuuutrtrtrtrướướướước,c,c,c,saosaosaosaochchchchééééppppsausausausauNghiêncứumãcủangườikháckĩlưỡngtrướckhisaochép.Phântíchxemnólàmgì.Chỉkhinàođoạnmãấyđọcđược,nhấtquánvớilogicchươngtrìnhcủabạn,vàkhôngcólỗi,thìmớinênsaochépnó.Tiếnhànhlúcnàysẽgiúpbạnchỉnhsửanóphùhợpvớicácphầncònlạicủachươngtrìnhmộtcáchthoảimáihơn.2.2.2.2.CCCCááááccccththththưưưưviviviviệệệệnnnnrrrrấấấấttttttttốốốốttttChỉdùngcácthưviệnPHPtừcácnguồntincậynhưPEARhoặckhocáclớpcủaPHP(PHPClassesRepository).VớicácgóiAPIcósẵn,việcdùngcáchàmcủanócũngkhôngthànhvấnđề.Thựcra,nếubạntìmđượcmộtthưviệnviếtsẵnbởimộtnguồntincậy,thìthườngnósẽlàmộtlựachọntốtđểdùngchochươngtrình(thayvìtựviếtlấy).6.6.6.6.KhKhKhKhôôôôngngngngccccóóóóđườđườđườđườngngngngllllốốốốiiii((((guidelines))))chochochochođồđồđồđồáááánnnnMộtlầnkhitôimớibắtđầulậptrình,tôilàmviệctrênmộtđồánkhácơbản(vớiPerl)cùng3lậptìnhviênkhác.Vìtôicòntrẻ(vàkhôngphảitrưởngnhóm),chúngtôikhôngcóđườnglốiviếtmãchođồán.Mỗingườiđượcgiaomộtphầncôngviệc,vàlàmriêngrẽ.Khichúngtôinhậpchunglạiđểchạychươngtrìnhcuốicùng,mỗiphầncủađồánnhìnkháchẳnnhauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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 ... PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology23232323Dormitory204.B518:20PMApril7,2006KhKhKhKhôôôôngngngngddddùùùùngngngngccccáááácccchhhhààààmmmmssssẵẵẵẵnnnnccccóóóóNhiềulậptrìnhviênPHPcónềntảngCcóvẻkhôngnhậnrarằngPHPcungcấpnhiềuhàmsẵncógiúpthaythếcácđoạnmãdài.NếubạnđếnvớiPHPtừC,tôikhuyênbạnnênđọcquatàiliệutrướckhiviếtmộtkhốilệnhđểxemPHPcósẵnhàmnàogiúpcuộcsốngcủabạndễdànghơnkhông.ĐổĐổĐổĐổiiiittttêêêênnnnccccáááácccchhhhààààmmmmPHPPHPPHPPHPđãđãđãđãccccóóóóTôiđãthấyngườitađổitêncáchàmđãcócủaPHPchỉđểgiúphọdễnhớhơn.Điềunàykhôngchỉlàmchậmchươngtrình,màlàmchođoạnmãkhóđọchơn.DDDDùùùùngngngnghhhhướướướướngngngngđốđốđốđốiiiittttượượượượngngngngququququáááámmmmứứứứccccPHPkhôngphảilàmộtngônngữHĐT,dùnócungcấpcáctínhnăngHĐT.BạncầnluônnhậnthứcrằngHĐTtrongPHPsẽlàmchậmđángkểchươngtrình.1.1.1.1.LLLLấấấấyyyyththththôôôôngngngngtintintintinởởởởđâđâđâđâu?u?u?u?MaymắnlàcórấtnhiềuthôngtinvềviệclàmthếnàođểlậptrìnhPHP.VàinơitốtnhấtlàZend.combảngốccủabàiviếtnàylàởđóProfessionalPHPmộttrongnhữngsáchtoàndiệntốtnhấtvềPHP,tốtchocảlậptrìnhviênvàkhông-lậptrìnhviên.WebApplicationDevelopmentwithPHPMộtquyểnsáchtuyệtvờidạybạncảcáchpháttriểnweblẫnvàitínhnăngcaocấpcủaPHP.BaogồmcáctàiliệuchínhthứcvềZendAPI.ThePHPDeveloper'sCookbookMộtquyểnsáchthiênvềlờigiảiđápchocácvấnđềgặpphảitrongPHP(dotui-SterlingHughes-viếtcùngAndreiZmievski)8.8.8.8.KhKhKhKhôôôôngngngngnhnhnhnhậậậậnnnnththththứứứứccccđầđầđầđầyyyyđủđủđủđủvvvvềềềềbbbbảảảảoooommmmậậậậttttNhữngngườidùngkhôngphảilúcnàocũnglàmviệcvớihệthốngcủachúngta.Vớitưcáchlàlậptrìnhviên,tráchnhiệmcủachúngtalàthiếtkếmộthệthốngantoàn,dễchịucóthểlàmviệcđượcchungvớilỗicủangườidùng.Khithiếtkếhệthống,bạnphảiđặtmìnhvàovịtríngườidùng.Xemxétnhữngchỗhọcóthểgặplỗivàtìmkiếmnhữnglỗhổngbảomậttiềmtàng.Rồibạnthiếtkếchươngtrìnhcókhảnăngsửachữalỗinàyvàlấpcáclỗhổngbảomật.Mộtđiềukháccũngquantrọnglà:dùxảyrahưhỏnghayhệthốngbịtấncônglàdolỗicủangườidùng,chínhbạnlàngườichịutráchnhiệmnếubạnđãviếtchươngtrìnhcónhiềulỗihaythiếunhữngbướckiểmtracầnthiếtdẫnđếnhỏngdữliệu.Thídụ,tôiđãthấynhiềuchươngtrìnhkhôngdùnghàmđãcócủaPHPmail()vốnantoànmàlạiđidùngsendmailthôngquapopen().Nócóthểdẫnđếnnhiềulỗhổngbảomật(thídụnhư/etc/passwdđượcgửiđếnngườidùngcuối).Cóvàinơithườngxảyracácsựcốvềbảomật,hoặctiềmnănggâyrahỏngdữliệurấtlớn:Thựchiệnlờigọihệthống.Tôikhôngcócáchnàodiễntảđượcmứcđộnguyhiểmcủavấnđềnày.Luônđảmbảorằngmọidữliệungườidùngđưavàolàantoàntrướckhichuyểnnóchomộtlờigọihệthống.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINNGNGNGNGƯỜƯỜƯỜƯỜIIIIDDDDÙÙÙÙNGNGNGNGMMMMỘỘỘỘTTTTCCCCÁÁÁÁCHCHCHCHMMMMÙÙÙÙQUQUQUQUÁÁÁÁNGNGNGNGKHIKHIKHIKHIĐƯĐƯĐƯĐƯAAAADDDDỮỮỮỮLILILILIỆỆỆỆUUUUCCCCỦỦỦỦAAAAHHHHỌỌỌỌVVVVÀÀÀÀOOOOLLLLỜỜỜỜIIIIGGGGỌỌỌỌIIIIHHHHỆỆỆỆTHTHTHTHỐỐỐỐNGNGNGNGMMMMÀÀÀÀKHKHKHKHÔÔÔÔNGNGNGNGKIKIKIKIỂỂỂỂMMMMTRATRATRATRATRTRTRTRƯỚƯỚƯỚƯỚCCCC.Khiđăngkíngườidùng.Nếubạntrôngmongcókếtquảchínhxác,luônkiểmtravàđảmbảobảnđăngkíđượckiểmtranhữngchỗcầnthiết.Trướctiên,cónhiềucáchđểkiểmtramộtđịachỉe-mailhợplệ.Hơnnữa,bạnnênkiểmtratuổicủangườidùngcónằmtrongphạmvithíchhợpkhông.Vớimộtsựsuyrộng,bạncóPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology25252525Dormitory204.B518:20PMApril7,2006mộtnhómthưtín,haytrongmộtkhomãnguồnnàođó).Tuynhiên,mộtbiểuthứcchínhquykhôngđủnếubạnmuốncókếtquảchínhxác.Cóvàicáchantoànhơnmàbạncóthểdùng:2.1.2.1.2.1.2.1.KiKiKiKiểểểểmmmmtratratratrakkkkếếếếttttnnnnốốốốiiii(socket(socket(socket(socketvalidation)validation)validation)validation)Mộtcáchđểkiểmđịnhđịachỉe-mailmàkhôngquấyrầytrựctiếpđếnngườidùnglàtạomộtkếtnốiđếnservernhậnđượctrongđịachỉe-mail,sauđótìmtênđăngkícủahọ.2.1.1.2.1.1.2.1.1.2.1.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmKhônggâybấttiệnchongườidùngvìnóđượctiếnhànhtrongsuốt.Pháthiệnnhiềuđịachỉmamàbiểuthứcchínhquykhôngbiết(nhưlàjoe@fgsdh.com).2.1.2.2.1.2.2.1.2.2.1.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmKhôngpháthiệnđượcđịachỉbịđánhcắp.Thídụ,nếuJohnDoeđưađịachỉe-mailcủatôi(phanthanhkieu@php.net),mọithứvẫntiếnhànhbìnhthường,dùnólàđịachỉcủatôichứkhôngphảicủahắnta.Kiểmtrachậmhơnbiểuthứcchínhquy.Mailservercủangườidùngcóthểtạmngưnghoạtđộngtrongthờigianngắn,làmchomộtđịachỉe-mailhợplệbịtừchối2.2.2.2.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrattttươươươươngngngngttttááááccccMộtcáchkhácđểkiểmđịnhđịachỉe-maillàgửimộtkhoáđặcbiệtđếnhộpthưngườidùng,vàbắthọnhậpkhoáđóđểtiếptục.Điềunàyđảmbảorằngkhôngnhữngđịachỉe-maillàhợplệ,màngườidùngcóquyềntruyxuấtvàođịachỉđó.2.2.1.2.2.1.2.2.1.2.2.1.ƯƯƯƯuuuuđđđđiiiiểểểểmmmmLàcáchtốtnhấtđểkiểmtrangườidùngcómộtđịachỉe-mailhợplệ2.2.2.2.2.2.2.2.2.2.2.2.KhuyKhuyKhuyKhuyếếếếttttđđđđiiiiểểểểmmmmĐòihỏingườidùngphảitiếnhànhthêmbướcphụ.Điềunàyquấyrầymấyngườicóýđịnhlàmphiềnbạn.Giốngnhưmọicáchkhác,nókhôngđảmbảođượcchống-đánh-lừa.NgườidùngcóthểtạomộtđịachỉtạmởHotmailhayNetaddressvàsauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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:BPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology24242424Dormitory204.B518:20PMApril7,2006thểkhẳngđịnhkháchắcchắnrằngkhôngcómộtngười200tuổinàocókhảnăngdùngmáyvitính.Khichấpnhậnthẻtíndụng.Mộtsốlậptrìnhviênchỉdùngnhữngthuậttoánđơngiảnmàcóthểdễdàngbịđánhlừakhithựchiệnkiếmtrathẻtíndụng.Chỉchấpnhậnthẻcủacáccôngtylớnđểkiểmtratínhhợplệcủasốthẻtrướckhichấpnhậnthẻcủangườidùng.ĐỪĐỪĐỪĐỪNGNGNGNGBAOBAOBAOBAOGIGIGIGIỜỜỜỜTINTINTINTINTTTTƯỞƯỞƯỞƯỞNGNGNGNGMMMMỘỘỘỘTTTTTHUTHUTHUTHUẬẬẬẬTTTTTOTOTOTOÁÁÁÁNNNN1.1.1.1.BBBBảảảảoooommmmậậậậttttccccủủủủaaaallllờờờờiiiiggggọọọọiiiihhhhệệệệththththốốốốngngngngMỗikhibạnđưadữliệucủangườidùngvàolờigọihệthống,bạncầntỉnhtáokiểmtradữliệuđó.Đảmbảorằngkhôngcógìnguyhiểmnằmtrongdữliệuđócóthểlừaphỉnhhệthốngthựchiệnnhữnglệnhkhôngmongmuốn.PHPcungcấpmộthàmlàmđiềuđó:EscapeShellCmd()Bấtcứkhinàobạnchuyểnmộtlệnhcóchứadữliệunhạycảm,trốnthoátdữliệuđóbằnghàmEscapeShellCmdEscapeShellCmdEscapeShellCmdEscapeShellCmd():Trốnthoát(escaping)dữliệucónghĩalàthêmdấusổngược(backslash\)trướckítựcóthểlừaphìnhhệthống(chínhxáclàcáckítự#&;?'\"|*?~<>^()[]{}$\\\x0A\xFF).MMMMããããHTMLHTMLHTMLHTML<html><head><title>NameLookup</title></head><body><h1>NameLookup</h1><?phpif($name){system(EscapeShellCmd("lookup$name"));print"nn";}?><formaction="<[color=blue]?phpprint$PHP_SELF;?>[/color]"method="GET">Enteranametolookup:<inputtype="text"name="name"><inputtype="submit"value="LookupName"></form></body></html>DùEscapeShellCmd()làmộthàmtốtđểkiểmtralệnh,bạnvẫnnênthửvàthựchiệncáckiểmtrađặcthùphụthuộcvàoloạidữliệu.HàmEscapeShellCmd()sẽkhôngkiểmtratínhđúngđắncủadữliệuđượcđệtrình,nósẽchỉngăncảnngườidùnglàmcácviệckhôngđượcphép.1.1.1.1.1.1.1.1.ĐĐĐĐiiiixaxaxaxahhhhơơơơnnnnmmmmộộộộttttbbbbướướướướccccNhưmộtquyluật,nênkiểmtracáckítựđượcphéphơnlàkiểmcáckítựkhôngđượcphép.Thídụ,đảmbảorằng$namechỉchứacáckítựchữvàsố(alphanumericcharacters).Bằngcáchnày,rấtkhóđểkhaitháclỗhổngtronghệthốngcủabạn.2.2.2.2.KiKiKiKiểểểểmmmmtratratratrađịđịđịđịaaaachchchchỉỉỉỉe-maile-maile-maile-mailMộttrongnhữnghìnhthứckiểmtraphổbiếnnhấtlàxemmộtđịachỉe-mailcóhợplệkhông.Mấytaymớivàonghềsẽchỉdùngcácbiểuthứcchínhquy(màhọlượmđượctrongPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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);PHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–CollectfromwrittingofSterlingHughesNGUYENANHKHOA–Class27K0A–DepartmentOfInformationTechnology26262626Dormitory204.B518:20PMApril7,2006PHẦN3:7LỖICHẾTNGƯỜI7.7.7.7.ChChChChééééppppvvvvààààddddáááán:n:n:n:khkhkhkhôôôôngngngngphphphphảảảảiiiihhhhướướướướngngngngđđđđiiiittttốốốốttttTôiđãgặpnhiềutaylậptrìnhmớivàonghềđichépnhữngđoạnmã(thídụnhưlàkiểmtrađịachỉe-mail,gửie-mail,lấygiátrịtừformđểsoạne-mail).Họthườngdánchúngvàochươngtrìnhcủamìnhvàrồikếtquảlàmộtđốngnhữngcâulệnhgửiformkhôngantoàn.Dùrằngmộtđoạnmãchạyđượctrongnhữngđiềukiệntốiưu,nóthườnggặplỗitrongbấtkìsựkiểmtra"mãtốt"nàoCôngviệcchắpvásẽkhkhkhkhôôôôngngngngcócácưuđiểmsau:MMMMởởởởrrrrộộộộngngngngđượđượđượđược:c:c:c:đoạnmãtrôngnhưcácmảnhriêngrẽrápvávàonhau.Nếunhờmộtlậptrìnhviêncókinhnghiệmsửachươngtrìnhcủabạn,họthườngthíchviếtlạitoànbộĐoạnmãkhôngđọcđượcsẽkhôngmởrộngđược.AnAnAnAntotototoààààn:n:n:n:bạncóthểđangchépmãcủangườikhácvàochươngtrìnhcủamìnhmàlạikhônghiểurõràngđoạnmãđó.Hãytưởngtưởngxem.NếuđoạnmãđócómộtlỗilàmxoátoànbộđĩacủabạnHơnnữa,cùngmộtđoạnmãthìtínhantoànkhônggiốngnhautrêncáchệthốngkhácnhau.Cuốicùng,chươngtrìnhcủabạnsẽkếthừalỗicủangườikhác.Nhanh:Nhanh:Nhanh:Nhanh:khicắtdáncácđoạnmã,kếtquảthườngsẽchạykhôngnhanh,vìchúngkhôngcómộttiếntrìnhchunghợplí(đâylàđiềuquantrọngnhấtkhiviếtcácchươngtrìnhnhanh)1.1.1.1.LLLLààààmmmmđúđúđúđúngngngngphphphphươươươươngngngngphphphphááááp:p:p:p:ttttììììmmmmhihihihiểểểểuuuutrtrtrtrướướướước,c,c,c,saosaosaosaochchchchééééppppsausausausauNghiêncứumãcủangườikháckĩlưỡngtrướckhisaochép.Phântíchxemnólàmgì.Chỉkhinàođoạnmãấyđọcđược,nhấtquánvớilogicchươngtrìnhcủabạn,vàkhôngcólỗi,thìmớinênsaochépnó.Tiếnhànhlúcnàysẽgiúpbạnchỉnhsửanóphùhợpvớicácphầncònlạicủachươngtrìnhmộtcáchthoảimáihơn.2.2.2.2.CCCCááááccccththththưưưưviviviviệệệệnnnnrrrrấấấấttttttttốốốốttttChỉdùngcácthưviệnPHPtừcácnguồntincậynhưPEARhoặckhocáclớpcủaPHP(PHPClassesRepository).VớicácgóiAPIcósẵn,việcdùngcáchàmcủanócũngkhôngthànhvấnđề.Thựcra,nếubạntìmđượcmộtthưviệnviếtsẵnbởimộtnguồntincậy,thìthườngnósẽlàmộtlựachọntốtđểdùngchochươngtrình(thayvìtựviếtlấy).6.6.6.6.KhKhKhKhôôôôngngngngccccóóóóđườđườđườđườngngngngllllốốốốiiii((((guidelines))))chochochochođồđồđồđồáááánnnnMộtlầnkhitôimớibắtđầulậptrình,tôilàmviệctrênmộtđồánkhácơbản(vớiPerl)cùng3lậptìnhviênkhác.Vìtôicòntrẻ(vàkhôngphảitrưởngnhóm),chúngtôikhôngcóđườnglốiviếtmãchođồán.Mỗingườiđượcgiaomộtphầncôngviệc,vàlàmriêngrẽ.Khichúngtôinhậpchunglạiđểchạychươngtrìnhcuốicùng,mỗiphầncủađồánnhìnkháchẳnnhauPHP programming dynamicwebforewreybody21Fatalerrorsin programming withPHP–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...