Những sai lầm trong lập trình PHP pot

27 422 0
Những sai lầm trong lập trình PHP pot

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 1 1 1 1 Dormitory204.B518:20 PM April 7, 2006 àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâ m đếnviệctránhnhữnglỗi thườnggặpkhisửdụngPHP.NgườiđọcphảibiếtcáccúphápcủaPHP,vànênbiết côngdụngcủacáchà m trongPHP. Mộttrongnhữngđiể mm ạnhnhấtcủaPHPvôtìnhtrởthành m ộttrongnhữngđiể m yếu nhấtcủanó:t t t t í í í í nh nh nh nh d d d d ễ ễ ễ ễ s s s s ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng .NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnra rằng:sửdụngđúngPHP PHP PHP PHP c c c c ò ò ò ò n n n n kh kh kh kh ó ó ó ó h h h h ơ ơ ơ ơ n n n n c c c c á á á á c c c c ng ng ng ng ô ô ô ô n n n n ng ng ng ng ữ ữ ữ ữ kh kh kh kh á á á á c c c c . Trongloạtbàinàysẽlầnlượtnêura21lỗi,từnhữngsailầ m giáokhoa(là m scripttrở nênchậ m vàkhóquảnlí)đếnnhữngsailầ m chếtngười-cóthểxemlànguồngốccủanhững sailầ m sơđẳng. PHẦN1:7LỖIGIÁOKHOA  21. 21. 21. 21. S S S S ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng printf() printf() printf() printf() kh kh kh kh ô ô ô ô ng ng ng ng th th th th í í í í ch ch ch ch h h h h ợ ợ ợ ợ p p p p Hà m printf()dùngđểindữliệucóđịnhdạng Nócóthểđượcdùng,thídụ,khibạn m ộtin m ộtsốkiểudoublevới2sốlẻ,hoặctrong bấ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ác theoýmuốn M M M M ã ã ã ã l l l l ệ ệ ệ ệ nh nh nh nh (PHP) <? /*ThethreefacesofΠ*/ printf("Piis:%.2f\n<br>\n",M_PI); printf("Piisalso:%.3f\n<br>\n",M_PI); printf("Piisalso:%.4f\n<br>\n",M_PI); ?> Ch Ch Ch Ch ú ú ú ú ý ý ý ý . . . . 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đi m ộtcâuprintf()cóthểlà mm ọithứanhta mongmuốn. Nhiếulậptrìnhviêndùngsaiprintf():incácbiến,cácgiátrịtrảvềcủahà m hoặcthỉnh thoảng,chỉlàdữliệuthôngthường.Thườngxảyratronghaitìnhhuống: Câulệnhprint()thíchhợphơn  Hiểnthịgiátrịtrảvềcủa m ộthà m 1. 1. 1. 1. Khi Khi Khi Khi n n n n à à à à o o o o print() print() print() print() th th th th í í í í ch ch ch ch h h h h ợ ợ ợ ợ p p p p h h h h ơ ơ ơ ơ 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>\n Hiendangla:%s,%s\n<br>\n LienhevoitoiquaEmail:%s\n<br>\n", $name,$nghenghiep,$diachi,$email); ?> Hà m print() print() print() print() cóthểdùngthaychoprintf()nhưsau: B PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 2 2 2 2 Dormitory204.B518:20 PM April 7, 2006 print print print print "Tencuatuila:$name\n \n \n \n <br>\n \n \n \n Hiendangla:$nghenghiep,$diachi\n \n \n \n <br>\n \n \n \n LienhevoitoiquaEmail:$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: Thi Thi Thi Thi h h h h à à à à nh nh nh nh nhanh nhanh nhanh nhanh h h h h ơ ơ ơ ơ n: n: n: n: hàmprintf()địnhdạngdữliệucủabạntrướckhihiểnthị, nósẽchậmhơnprint()hoặcecho()  M M M M ã ã ã ã s s s s á á á á ng ng ng ng s s s s ủ ủ ủ ủ a: a: a: a: hãyxem,dùnghàmprintf()sẽlàmchongườiđọchơibịlẫnlộn (tấtnhiêntrừkhihọcónềntảngC).Nóđòihỏikiếnthứcvềcúphápprintf()(thídụ, %sthaychochuỗicòn%dlàsố)vàvềkiểubiến 2. 2. 2. 2. D D D D ù ù ù ù ng ng ng ng printf() printf() printf() printf() để để để để xu xu xu xu ấ ấ ấ ấ t t t t d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u tr tr tr tr ả ả ả ả v v v v ề ề ề ề t t t t ừ ừ ừ ừ g g g g ọ ọ ọ ọ i i i i h h h h à à à à m m m m Mộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhà m đế m dướiđây: Khixuấtgiátrịdohà m trảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây: Dùngtoántử.nhanhhơnviệcdùngprintf() 20. 20. 20. 20. Á Á Á Á p p p p d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai ng ng ng ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a (semantics) (semantics) (semantics) (semantics) NhiềulậptrìnhviênsửdụngPHP m àkhôngbiếtđếnnhữngđiể m tinhtếcủangônngữ này.Mộttrongnhữngđiể m đólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa (semantics). C C C C ú ú ú ú ph ph ph ph á á á á p: p: p: p: nhữngquytắcđịnhnghĩamộtphầntử.Thídụ:dấu$đểtrướcdùngđịnh nghĩabiến,dùngdấu()vàcácthamsốđịnhnghĩamộthàm  Ng Ng Ng Ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a: a: a: a: nhữngquytắcápdụngtrongcúpháp.Thídụ:mộthàmcó2biếnđịnh nghĩabởicúphápcủanó,haibiếnnàycókiểustring-đólàngữnghĩa. Trong m ộtngônngữlỏnglẻonhưPHP,bạncónhiềulựachọnđểviếtlệnh.Cácbiến khôngcầncókiểuxácđịnh Thídụsau m ởtậptinvàintừngdòng: Thídụtrênsẽtạolỗi: Warning: Warning: Warning: Warning: Supplied Supplied Supplied Supplied argument argument argument argument is is is is not not not not a a a a valid valid valid valid File-Handle File-Handle File-Handle File-Handle resource resource resource resource in in in in C:\Inetpub\wwwroot\tst.php C:\Inetpub\wwwroot\tst.php C:\Inetpub\wwwroot\tst.php C:\Inetpub\wwwroot\tst.php on on on on line line line line 4. 4. 4. 4. <? printf printf printf printf ("%doccurrencesof%sfound.", count($truyvan),$search_term); ?> <? print print print print count($truyvan). "occurrencesof$search_termfound."; ?> <? $fp=@fopen('vanban.txt','r') ordie('Khongthemofilevanban.txt'); while($line=@fgets("$fp",1024))//Loi{ print$line; } @fclose("$fp")//Loi ordie('Khongthedongvanban.txt'); ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 3 3 3 3 Dormitory204.B518:20 PM April 7, 2006 Đólàdobiến$fpđặttrongdấunháyképnênđượcchuyểnthànhchuỗi.Thế m àhà m fopen()nhận m ộtđịnhdanhtàinguyên(resourceidentifier)trongthamsốđầucủanó,chứ khôngnhận m ộtchuỗi.Đểgiảiquyếtvấnđề,bạnchỉđơngiảnbỏdấunháyképđi 1. 1. 1. 1. C C C C ó ó ó ó th th th th ể ể ể ể tr tr tr tr á á á á nh nh nh nh vi vi vi vi ệ ệ ệ ệ c c c c á á á á p p p p d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai ng ng ng ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a? a? a? a? Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomize yourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoretically possibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđược không? Thídụtrêncủachúngtatạora m ộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncác scriptđểthíchhợpvới m ộ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ọc về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: Ki Ki Ki Ki ể ể ể ể 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ào lạikhôngkèmtheotínhchấtcủakiểucủanó.PHPcó7kiểucơbản:boolean, resource,integer,double,string,arrayvàobject.  T T T T ầ ầ ầ ầ m m m m v v v v ự ự ự ự c: c: c: c: trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiến cóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbản về"tầmvực"dẫnđếnnhữnglỗisaitinhtếvàcảnhữnglỗilớn.  php.ini: php.ini: php.ini: php.ini: khiviếtmộtscriptchạyởnhiềumôitrườngkhácnhau,cầnbiếtrằng khôngphảimọicấuhìnhPHPđềunhưnhau.Dođó,cầnthiếtnhữnglệnhkiểmtra đểđảmbảoscriptcủabạnchạytốttrongcấuhìnhPHPcủangườikhác. 19. 19. 19. 19. Thi Thi Thi Thi ế ế ế ế u u u u ghi ghi ghi ghi ch ch ch ch ú ú ú ú Theoýtôi, m ãnguồnthiếughichúlàcănnguyêncủasựlậptrìnhíchkỉ.Nódẫntới nhữnghiệuchỉnhsailầm,hiểusaiýnghĩavàlà m ngườiđọc m ệt m ỏi.Nóichung,lậptrìnhghi chú(inlinedocumentation)được m ọingườikhẳngnhậnlàđiềutốt,nhưnghiế m khinótồntại. Mộtvấnđềkháclàquánhiềughichú.Dùhiế m gặp,nhưngnólà m chocácđoạn m ãbị cắtvụn,gâyrasựkhótheodõi.Dướiđâylà m ộtthídụ: <? //BatdaumaPHP $age=18;//Gan18den$age $age++;//Tang$agelen1donvi //INradoantextthongbao: print"Youarenow19,whichmeansyouhavebeen:"; print"\n<br>\n<br>\n"; //Vonglapforinratatcatuoitruocdo for($idx=0;$idx<$age;$idx++){ <? $fp=@fopen('vanban.txt','r') ordie(‘Khongthemofiletailieuphp.txt'); while($line=@fgets($fp,1024)){ print$line; } @fclose($fp) ordie(Khongthedongfilevanban.txt'); ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 4 4 4 4 Dormitory204.B518:20 PM April 7, 2006 //Inratuoicanhan print"$idxyearsold\n<br>\n"; }//KetthucmaPHP ?> 1. 1. 1. 1. Bao Bao Bao Bao nhi nhi nhi nhi ê ê ê ê u u u u ghi ghi ghi ghi ch ch ch ch ú ú ú ú th th th th ì ì ì ì đủ đủ đủ đủ ? ? ? ? Nhiếuđến m ứ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ạn  Luô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ưng lạichạyđúng Nế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 á á á á nh nh nh nh d d d d ù ù ù ù ng ng ng ng #) #) #) #) 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 //thereareweightsforthisalgorithmtoworkproperly if(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. Nhi Nhi Nhi Nhi ề ề ề ề u u u u bi bi bi bi ế ế ế ế n, n, n, n, t t t t ố ố ố ố n n n n nhi nhi nhi nhi ề ề ề ề u u u u th th th th ờ ờ ờ ờ i i i i gian gian gian gian Cóvàingườibịá m ảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthể viếtnhưthếnày: PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 5 5 5 5 Dormitory204.B518:20 PM April 7, 2006 Tạisaophảidùngbiếntrunggian?Nókhôngcầnthiết Rủithay,cóvẻnhưrấtnhiềungườikhóbỏđượcthóiquenxấunày. Biếntạ m là m chậ m thờigianthihànhchươngtìnhcủabạn.Tốthơnlànênbỏquađóvà gộpcáclờigọihà m vớinhau.Nhữngngườidùngbiếntạ m thườnglà m chươngcủahọchạy chậ m đến25%. Mộtlídokhácđểtránhcóquánhiềubiếntạ m làvìtrôngnókhôngđượcđẹp m ắt.Trong haithídụtrên,thídụnàosúctíchhơn?Thídụnàolà m con m ắtdễchịuhơn?Dùngquánhiều biếntạ m cóthểdẫnđến m ãchươngtrìnhkhóđọcvàkhôngsúctích. 1. 1. 1. 1. L L L L ợ ợ ợ ợ i i i i đ đ đ đ i i i i ể ể ể ể m m m m c c c c ủ ủ ủ ủ a a a a d d d d ù ù ù ù ng ng ng ng bi bi bi bi ế ế ế ế n n n n t t t t ạ ạ ạ ạ m m m m Cácbiếntạ m cólợitrongviệcthaythếcáchà m haybiểuthứcdàilêthê.Nócóvaitrò nhưbídanhgiả.Điềunàyđặcbiệtđúngkhibạndùng m ộthà m haybiểuthứcnhiềulần. Xemxétthídụđây,nókhôngdùngnhiềubiếnhơn m ứctốithiểu Nộidungtronghà m implode()dàivàdođókhóđọc.Dùng m ộthoặcnhiềubiếntạ m có thểgiúpchúngta: 2. 2. 2. 2. C C C C á á á á c c c c lu lu lu lu ậ ậ ậ ậ t t t t chung chung chung chung c c c c ủ ủ ủ ủ a a a a ng ng ng ng ó ó ó ó n n n n tay tay tay tay c c c c á á á á i i i i Khiquyếtđịnhcódùngbiếntạ m hoặckhông,bạnnênsuynghĩvề2câuhỏi: Bạncódùngbiếnđóítnhấthailần? Tínhđọcđượccủa m ãcótăngđángkểkhông? Nếuítnhất m ộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợp cáchà m lại(nếucần). 17. 17. 17. 17. Vi Vi Vi Vi ế ế ế ế t t t t l l l l ạ ạ ạ ạ i i i i c c c c á á á á c c c c h h h h à à à à m m m m c c c c ó ó ó ó s s s s ẵ ẵ ẵ ẵ n n n n Mộtsốnơiphổbiến m ãnguồncácscriptPHPchủtrươngđổitêncáchà m sẵncóđểtạo sự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){ PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 6 6 6 6 Dormitory204.B518:20 PM April 7, 2006 Lạicó m ộtsốngườicốgắngviếtlạicáchà m PHPthôngdụngthayvìđihọcvềhà m đó trongcáctàiliệuPHPcungcấp. Cóítnhất2lídođểkhôngnênlà m điềunày.Thứnhất,vàtrênnhất,nólà m chonhững ngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcả m thấycóquánhiềuhà m dưthừa.Họ tựhỏitạisaobạnlạiđiđịnhnghĩahà m theokiểuđó,thayvìsửdụngcáchà m địnhnghĩasẵn bởiPHP. Thứhai,địnhnghĩahà m nhưvậycũngsẽlà m chậ m chươngtrìnhcủabạn(mộtcách khôngcầnthiết).Khôngchỉphảixửlínhiều m ãhơn, m à m ỗilầngọihà m dobạnđịnhnghĩa, bạnđãtốnthờigianchochínhhà m đó,trướckhihà m nguyênthuỷđượcgọi. 1. 1. 1. 1. Tr Tr Tr Tr á á á á nh nh nh nh vi vi vi vi ế ế ế ế t t t t l l l l ạ ạ ạ ạ i i i i c c c c á á á á c c c c h h h h à à à à m m m m c c c c ó ó ó ó s s s s ẵ ẵ ẵ ẵ n n n n Hãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên, m ộtlậptrình viênkhôngthểtheokịpcáchà m củaPHPngayđược.Vàaicóthờigian m àtracứu.Tạisao khôngviếtlạichokhoẻ? Cáchlà m củatôilàluôncósẵn m ộttàiliệuchỉdẫnPHP( PHPmanual ) m ỗikhiviết chươngtrình(tácgiảbàinàydùng m ộtbảnPDFcótạochỉ m ục,riêngtôi,ngườidịch,thìdùng m ộttàiliệuCHMđầyđủthôngtinvàcócảgópýcủangườisửdụng m àbạncóthểlấyở http://www.php.net/docs.php).Sauđó, m ỗikhiđịnhviết m ộthà m mởrộng choPHP,tôiđọc lướtquatàiliệuđểxemhà m đócóchưa. Tuynhiên,cầnchúýlà,dobảnchất m ãnguồn m ởcủaPHP,bạncóthểtì m đượccác hà m dongườidùngđịnhnghĩatrướckhinóđượcthê m vàoPHP(thídụnhưhà m tì m phầntử khácnhaugiữahai m ảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlại m ã(Thisdoesn't necessarilymeanthatyoushouldhavetocorrectthecode don'tunderstand) 16. 16. 16. 16. Kh Kh Kh Kh ô ô ô ô ng ng ng ng t t t t á á á á ch ch ch ch bi bi bi bi ệ ệ ệ ệ t t t t ph ph ph ph ầ ầ ầ ầ n n n n server server server server v v v v à à à à client client client client Vàilậptrìnhviêncốkếtnốicảchươngtrìnhvớinhau,nghĩalàghépchung m ãHTML (client-side-phầnkhách)với m ãPHP(server-side-phầnchủ)vàotrong m ộ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ê m tínhnăng.Lậptrìnhtheocáchnàylà m nảysinhvấn đềkhóbảotrìvàcáctậptintrởnêncồngkềnh. 1. 1. 1. 1. H H H H à à à à m m m m API API API API Khimuốntáchbiệtphầnkhách-chủ,bạncóvàilựachọn.Mộtcáchlàviếtnhữnghà m hiểnthịnộidunglinhđộngvàđặtchúngđúngchỗtrongtrangweb. Thídụdướiđâyminhhoạđiềunày: index.php index.php index.php index.php -phầnkhách returnstrlen($str); } ?> HTML HTML HTML HTML < ?phpinclude_once("site.lib");?> < html > < head > < title > <?phpprint_header();?> < /title > < /head > < body > < h1 >< ?phpprint_header();? >< /h1 > < tableborder="0"cellpadding="0"cellspacing="0"> < tr > PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 7 7 7 7 Dormitory204.B518:20 PM April 7, 2006 site.lib site.lib site.lib site.lib -phầnchủ Nhưbạnthấytrongthídụtrên,táchbiệtkháchchủlà m tăngtínhdễđọctrongchương trìnhcủabạn.Mộtlợiíchkháclà m ộtkhibạnđãcócáchà m APIhiểnthịnộidung,bạncóthể đểchothiếtkếviênthamgiathayđổibốcục m àkhôngcầnsửa m ãchươngtrình. 1.1. 1.1. 1.1. 1.1. L L L L ợ ợ ợ ợ i i i i í í í í ch ch ch ch c c c c ủ ủ ủ ủ a a a a h h h h à à à à m m m m API API API API Tươngđốisángsủa  Nhanh,hầunhưkhônglãngphíthờigian(overhead) 1.2. 1.2. 1.2. 1.2. B B B B ấ ấ ấ ấ t t t t l l l l ợ ợ ợ ợ i i i i < 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"; } } ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 8 8 8 8 Dormitory204.B518:20 PM April 7, 2006 Khôngsángsủavàdễdàngbằnghệthống m ẫu(templatesystem)  Cần m ộtítkiếnthứcPHPđểsửa m ẫu 2. 2. 2. 2. H H H H ệ ệ ệ ệ th th th th ố ố ố ố ng ng ng ng khu khu khu khu ô ô ô ô n n n n m m m m ẫ ẫ ẫ ẫ u u u u Mộtcáchkhácđểtáchbiệtkháchchủlàdùnghệthốngkhuôn m ẫu.Nghĩalà,có m ộtsố đánhdấunộidungsauđódùngchươngtrìnhphântích,thaythếcácđánhdấuđóbằngthông tincầnthiết. Thídụ,bạncóthểtạo m ộttậptinnhưthếnày: Sauđócóthểviếtchươngtrìnhphântáchtậptin,thaythếcácthôngtintrongdấucách %%bằngcácthôngtinthíchhợp. Ghichú: m ộtlớphỗtrợhệthốngkhuôn m ẫukhátốtlàlớpFastTemplate,cóở www.thewebmasters.net 2.1. 2.1. 2.1. 2.1. Ư Ư Ư Ư u u u u đ đ đ đ i i i i ể ể ể ể m m m m c c c c ủ ủ ủ ủ a a a a h h h h ệ ệ ệ ệ th th th th ố ố ố ố ng ng ng ng khu khu khu khu ô ô ô ô n n n n m m m m ẫ ẫ ẫ ẫ u u u u Rấttrongsáng KhôngcầnkiếnthứcPHPđểsửakhuôn m ẫu 2.2. 2.2. 2.2. 2.2. Nh Nh Nh Nh ượ ượ ượ ượ c c c c đ đ đ đ i i i i ể ể ể ể m m m m  Chậ m hơn,bạncầnphântáchtậptinkhuôn m ẫu,sauđóxuấtra Việchiệnthựcphứctạphơn 15. 15. 15. 15. D D D D ù ù ù ù ng ng ng ng c c c c á á á á c c c c c c c c ấ ấ ấ ấ u u u u tr tr tr tr ú ú ú ú c c c c l l l l ỗ ỗ ỗ ỗ i i i i th th th th ờ ờ ờ ờ i i i i Cónhiềungườicứdùng m ãicác m ãvàthưviệnlỗithời.Thídụnhưhọđãviết m ộthà m dùngởPHP2,vàvẫncòndùngnóởPHP4, m ặcdù m ộthà m cócùng m ụcđíchnhưthếđã đượcthê m vàoởPHP3 Dùngcáccấutrúclỗithờicóthểlà m chậ m chươngtrìnhcủabạn,cũngnhưlà m chonó trởnênkhóhiểu.Ngườiđọccácchươngtrìnhcủabạncóthểkhôngquenvớicáchà m lỗithời củaPHP.Tuynhiên,khipháthiện m ộtđoạn m ãlạchậu,bạnđừngnghĩrằngcầnphảithaythế nó.Chỉcầnchắcchắnrằngbạnsẽkhôngdùngnóchocácchươngtrìnhviếttrongtươnglai. Mộtthídụvềcấutrúclỗithời, m ànhiềungườicóvẻcốnắ m lấy,làcúpháp beginControlStructure beginControlStructure beginControlStructure beginControlStructure endControlStructure endControlStructure endControlStructure endControlStructure ; HTML HTML HTML HTML < 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 > <? PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 9 9 9 9 Dormitory204.B518:20 PM April 7, 2006 Đâylà m ộtthóiquenxấuvì  Nókhôngđượcdùngrộngrãi,chonênnhiềungườihọcsẽbịlẫnlộngiữahaicúpháp Nókhôngtươngthíchvớingônngữkhác,nghĩalànótrởnênkhóđọcđốivớinhững ngườ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ải viế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ên theonhữngcácviếttrongtàiliệuPHP.Hầuhếtnóđượccậpnhật m ới.Nócũngdùngcáchà m m ớinhấtcủaPHPtrongthídụcủa m ình.Nênthườngxuyênkiể m tratàiliệukhibạncóýmuốn m ởrộngtínhnăngnàođócủaPHP.Theocáchnày,bạnsẽkhôngphảiviếtlạicáchà m cósẵn. T T T T ổ ổ ổ ổ ng ng ng ng k k k k ế ế ế ế t t t t Trongbàinàybạnđãđiqua7trêntổngsố21lỗi m àlậptrìnhviênPHP m ắcphải.Những lỗigiáokhoanàybaogồm:     S S S S ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai h h h h à à à à m m m m printf() printf() printf() printf()     Á Á Á Á p p p p d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai ng ng ng ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a     Thi Thi Thi Thi ế ế ế ế u u u u t t t t à à à à i i i i li li li li ệ ệ ệ ệ u u u u trong trong trong trong m m m m ã ã ã ã ngu ngu ngu ngu ồ ồ ồ ồ n n n n     D D D D ù ù ù ù ng ng ng ng qu qu qu qu á á á á nhi nhi nhi nhi ề ề ề ề u u u u bi bi bi bi ế ế ế ế n n n n t t t t ạ ạ ạ ạ m m m m     Vi Vi Vi Vi ế ế ế ế t t t t l l l l ạ ạ ạ ạ i i i i c c c c á á á á c c c c h h h h à à à à m m m m c c c c ó ó ó ó s s s s ẵ ẵ ẵ ẵ n n n n     Kh Kh Kh Kh ô ô ô ô ng ng ng ng t t t t á á á á ch ch ch ch bi bi bi bi ệ ệ ệ ệ t t t t ph ph ph ph ầ ầ ầ ầ n n n n kh kh kh kh á á á á ch/ch ch/ch ch/ch ch/ch ủ ủ ủ ủ     D D D D ù ù ù ù ng ng ng ng c c c c á á á á c c c c c c c c ấ ấ ấ ấ u u u u tr tr tr tr ú ú ú ú c c c c l l l l ỗ ỗ ỗ ỗ i i i i th th th th ờ ờ ờ ờ i i i i //Bad/OutdatedPractice while(1): print"5"; if($idx++==5): break; endif; endwhile; //BetterPractice //(thecodecouldbeoptimizedthough) while(1){ print"5"; if($idx++==5){ break; } } ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 10 10 10 10 Dormitory204.B518:20 PM April 7, 2006 PHẦN2–LỖINGHIÊMTRỌNG             14. 14. 14. 14. Kh Kh Kh Kh ô ô ô ô ng ng ng ng tu tu tu tu â â â â n n n n th th th th ủ ủ ủ ủ c c c c á á á á c c c c quy quy quy quy ướ ướ ướ ướ c c c c đặ đặ đặ đặ t t t t t t t t ê ê ê ê n n n n Mộttrongnhữnglỗinghiê m trọng m àngườilậptrìnhcóthểphạ m phảilàđịnhnghĩa m ột quyướcđặttêntồi.Tôiđãtiếpquảnnhiềudựán m àtrongđótôiphảibỏrarấtnhiềuthờigiờ chỉđểhiểuchươngtrình,dolậptrìnhviênđặttêncácbiếnlà$fredvà$barneythaycho $emailvà$name.Tôiđangđềcậpđến m ộtdựán m àngườilậptrìnhcũđãquyếtđịnhđưavào toànbộ chươngtrình m ộtkiểuđặttênkìlạ(aFlinstonesnamingtheme),khôngphảitôiđùa đâu. Cáchbạnđặttênbiếnvàhà m làtrungtâ m củaviệcxâydựng m ộtchươngtrìnhdễđọc. Cónhiềulậptrìnhviênphạ m lỗikhiđặttênbiếnvàhà mm ànó: quádàihoặcquángắn khôngliênquanđếnngữcảnh khô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. Đặ Đặ Đặ Đặ t t t t t t t t ê ê ê ê n n n n bi bi bi bi ế ế ế ế n n n n 1.1. 1.1. 1.1. 1.1. C C C C á á á á ch ch ch ch vi vi vi vi ế ế ế ế t t t t ph ph ph ph â â â â n n n n bi bi bi bi ệ ệ ệ ệ t t t t TrongPHP,tênbiếncócáchviếtphânbiệt,nghĩalà$uservà$Userlàhoàntoànkhác nhau.Vàingườidùnglợidụngđiể m nàyđểđặtcácbiêncùngtênnhưngkháccáchviết.Đâylà m ộtthóiquentồitệ.Cáchviếtkhôngbaogiờnêndùngđểphânbiệtcácbiếnkhácnhau.Mỗi tênbiến,trongcùngtầ m vực(scope),nêncólàtuyệtđốiduynhất. 1.2. 1.2. 1.2. 1.2. T T T T ê ê ê ê n n n n qu qu qu qu á á á á ng ng ng ng ắ ắ ắ ắ n n n n Nhiềungườisửdụngnhữngchữviếttắtđầu(crypticacronym)bíẩnchocácbiếncủahọ, đểrồisaunàyhốitiếcvìquên m ấthọđãmuốná m chỉđiềugìkhiđó.Tênbiếnnên m ôtảnội dungnó(sẽ)chứa,dùngnguyêntừhoặcnhữngchữviếttắtcóthểhiểuđược. 1.3. 1.3. 1.3. 1.3. T T T T ê ê ê ê n n n n qu qu qu qu á á á á d d d d à à à à i i i i Ởkhíacạnhkhác,vàingườilạisửdụngtênbiếnquádài.Nóichung,tênbiếnkhôngnên dàiquáhaitừ.Haitừcóthểđượctáchbiệtbằngdấuphâncách"_"hoặclàviếthoachữđầu củatừthứhai. 1.4. 1.4. 1.4. 1.4. Th Th Th Th ó ó ó ó i i i i quen quen quen quen t t t t ố ố ố ố t t t t Dướiđâylànhữngthídụtốtvềtênbiến $username='phanthanhkieu'; $password='bimat'; $teachers=array('Sadlon', 'Lane', 'Patterson', 'Perry', 'Sandler', 'Mendick', 'Zung'); foreach($teachersas$teacher); [...]... làm thế nào để lập trình PHP Vài nơi tốt nhất là  Zend.com bản gốc của bài viết này là ở đó  Professional PHP một trong những sách toàn diện tốt nhất về PHP, tốt cho cả lập trình viên và kh ông -lập trình viên  Web Application Development with PHP Một quy ển sách tuyệt vời dạy bạn cả cách phát triển web lẫn vài tính năng cao cấp của PHP Bao gồm các tài liệu chính thức về Zend API  The PHP Developer's... chuỗi lớn 9 Lập tr ình PHP nh ư các ng ôn ng ữ kh ác trì như ngô ngữ Nhi ều người bắt đầu PHP sau khi đã thuần thục một ngôn ngữ khác như Perl, C, Java hay ASP Làm như vậy, họ cũng mang theo những mô hình mà có thể không luôn luôn được dùng bởi PHP Kh ông may thay, vài cá nhân trong số hày kh ông chịu bỏ thời gian để học cách lập trình PHP theo cách phù hợp với PHP Thay vào đó, họ thích PHP hoạt động... xác định những vị trí có thể dẫn đến lỗi Ki ểm tra lỗi kh ông nên thực hiện sau khi viết chương trình Sự thiếu sót trong tầm nhìn trước có thể dẫn đến những lỗi nghi êm trọng, không những gây ra kết quả sai mà thậm chí còn làm hỏng hệ thống (even cause your system to crash)! 1 Mong đợ i điều tệ nh ất đợi nhấ Mọi chương trình đều có kh ả năng hư hỏng trong những tình huống sai Để giảm thiểu những rủi... thấy nhi ều chương trình thiếu một lượng kiểm tra lỗi đầy đủ Nguy ên nhân phần lớn là do lập trình viên không dành thời gian để lên một kế hoạch thích hợp cho chương trình của mình, và xác định những vị trí có thể dẫn đến lỗi Ki ểm tra lỗi không nên thực hiện sau khi viết chương trình Sự thiếu sót trong tầm nhìn trước có thể dẫn đến những lỗi nghi êm trọng, không những gây ra kết quả sai mà thậm chí còn... đó, họ thích PHP hoạt động với các ít khái niệm mới càng tốt Khi bạn lập trình PHP như là trong các ngôn ngữ khác, nó thường dẫn đến việc làm chương trình chậm hơn và khó bảo trì mã Bạn sẽ thường thấy họ phạm vào một trong các lỗi sau: Perl "1 d òng" PHP là một ngôn ngữ kh ông thực sự tối ưu cho cách tiếp cận 1 dòng khi viết chương trình Thay vào đó, nó mở rộng các tập hàm phức tạp và các biểu thức... April 7, 2006 22 PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes Kh ông d ùng các hàm sẵn có Nhi ều lập trình viên PHP có nền tảng C có vẻ không nhận ra rằng PHP cung cấp nhiều hàm sẵn có giúp thay thế các đoạn mã dài Nếu bạn đến với PHP từ C, tôi khuy ên bạn nên đọc qua tài liệu trước khi viết một khối lệnh để xem PHP có sẵn hàm... chương trình đều có kh ả năng hư hỏng trong những tình huống sai Để giảm thiểu những rủi ro như thế, bạn cần lên kế hoạch để:  Ki ểm tra kết quả lời gọi hàm  Ki ểm tra kết quả lời gọi hệ thống  Đặt mức error _reporting là E_ALL trong tập tin php. ini 1.1 Ki ểm tra kết qu ả l ời gọ i hàm Kiể quả Mỗi khi bạn gọi một hàm làm thay đổi nhi ều dữ liệu, luôn kiểm tra để đảm bảo rằng kết quả trả về trong. .. DepartmentOf Information Technology Dormitory 204.B5 18:20 PM April 7, 2006 14 PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes Nh ư là vấn đề của thực hành, đơn giản là sẽ sai lầm khi dùng PHP xử lí mọi dòng của CSDL Tôi đã bắt gặp người ta dùng PHP để chạy một chương trình tìm ki ếm đơn giản trên 2MB dữ liệu và tự hỏi tại sao cái ngôn... kh ông Đổ i tên các h àm PHP đã có Đổi Tôi đã thấy người ta đổi tên các hàm đã có của PHP chỉ để giúp họ dễ nhớ hơn Điều này không chỉ làm chậm chương trình, mà làm cho đoạn mã khó đọc hơn Dù ng hướng đối tượng qu á mức ướng đối ượng quá PHP kh ông phải là một ngôn ngữ HĐT, dù nó cung cấp các tính năng HĐT Bạn cần luôn nhận thức rằng HĐT trong PHP sẽ làm chậm đáng kể chương trình 1 Lấy thông tin ở đâu?... trợ HĐT của PHP không được tinh chỉnh và cũng không hiệu quả Ngh ĩa là nếu bạn dùng mô hình HĐT trong PHP, bạn có thể làm chậm chương trình đáng kể Nói chung, một ứng dụng dùng HĐT sẽ chậm đi, cũng như là bạn dùng eval() thì sẽ chậm hơn là dùng mã bình thường Để minh hoạ đầy đủ hơn việc HĐT có gì đó không tốt, tôi đã từng phải dùng những tính năng và kh ái niệm cao cấp của PHP, một vài trong số đó . PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 1 1 1 1 Dormitory204.B518:20 PM April 7, 2006 àiviếtnàydànhchonhữnglậptrìnhviênPHPquantâ m đếnviệctránhnhữnglỗi thườnggặpkhisửdụngPHP.NgườiđọcphảibiếtcáccúphápcủaPHP,vànênbiết côngdụngcủacáchà m trongPHP. Mộttrongnhữngđiể mm ạnhnhấtcủaPHPvôtìnhtrởthành m ộttrongnhữngđiể m yếu nhấtcủanó:t t t t í í í í nh nh nh nh d d d d ễ ễ ễ ễ s s s s ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng .NhiếungườichọnPHPvìtínhdễsửdụng,đãkhôngnhậnra rằng:sửdụngđúngPHP PHP PHP PHP c c c c ò ò ò ò n n n n kh kh kh kh ó ó ó ó h h h h ơ ơ ơ ơ n n n n c c c c á á á á c c c c ng ng ng ng ô ô ô ô n n n n ng ng ng ng ữ ữ ữ ữ kh kh kh kh á á á á c c c c . Trongloạtbàinàysẽlầnlượtnêura21lỗi,từnhữngsailầ m giáokhoa(là m scripttrở nênchậ m vàkhóquảnlí)đếnnhữngsailầ m chếtngười-cóthểxemlànguồngốccủanhững sailầ m sơđẳng. PHẦN1:7LỖIGIÁOKHOA  21. 21. 21. 21. S S S S ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng printf() printf() printf() printf() kh kh kh kh ô ô ô ô ng ng ng ng th th th th í í í í ch ch ch ch h h h h ợ ợ ợ ợ p p p p Hà m printf()dùngđểindữliệucóđịnhdạng Nócóthểđượcdùng,thídụ,khibạn m ộtin m ộtsốkiểudoublevới2sốlẻ,hoặctrong bấ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ác theoýmuốn M M M M ã ã ã ã l l l l ệ ệ ệ ệ nh nh nh nh (PHP) <? /*ThethreefacesofΠ*/ printf("Piis:%.2f <br> ",M_PI); printf("Piisalso:%.3f <br> ",M_PI); printf("Piisalso:%.4f <br> ",M_PI); ?> Ch Ch Ch Ch ú ú ú ú ý ý ý ý . . . . 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 i m ộtcâuprintf()cóthểlà mm ọithứanhta mongmuốn. Nhiếulậptrìnhviêndùngsaiprintf():incácbiến,cácgiátrịtrảvềcủahà m hoặcthỉnh thoảng,chỉlàdữliệuthôngthường.Thườngxảyratronghaitìnhhuống: Câulệnhprint()thíchhợphơn  Hiểnthịgiátrịtrảvềcủa m ộthà m 1. 1. 1. 1. Khi Khi Khi Khi n n n n à à à à o o o o print() print() print() print() th th th th í í í í ch ch ch ch h h h h ợ ợ ợ ợ p p p p h h h h ơ ơ ơ ơ 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 <br> Hiendangla:%s,%s <br> LienhevoitoiquaEmail:%s <br> ", $name,$nghenghiep,$diachi,$email); ?> Hà m print() print() print() print() cóthểdùngthaychoprintf()nhưsau: B PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 2 2 2 2 Dormitory204.B518:20 PM April 7, 2006 print print print print "Tencuatuila:$name <br> Hiendangla:$nghenghiep,$diachi <br> LienhevoitoiquaEmail:$email <br> "; ; ; ; Khikhôngcầnđịnhdạngsửliệu,dùngprint()thaychoprintf()cónhữnglợiíchsau: Thi Thi Thi Thi h h h h à à à à nh nh nh nh nhanh nhanh nhanh nhanh h h h h ơ ơ ơ ơ n: n: n: n: hàmprintf()địnhdạngdữliệucủabạntrướckhihiểnthị, nósẽchậmhơnprint()hoặcecho()  M M M M ã ã ã ã s s s s á á á á ng ng ng ng s s s s ủ ủ ủ ủ a: a: a: a: hãyxem,dùnghàmprintf()sẽlàmchongườiđọchơibịlẫnlộn (tấtnhiêntrừkhihọcónềntảngC).Nóđòihỏikiếnthứcvềcúphápprintf()(thídụ, %sthaychochuỗicòn%dlàsố)vàvềkiểubiến 2. 2. 2. 2. D D D D ù ù ù ù ng ng ng ng printf() printf() printf() printf() để để để để xu xu xu xu ấ ấ ấ ấ t t t t d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u tr tr tr tr ả ả ả ả v v v v ề ề ề ề t t t t ừ ừ ừ ừ g g g g ọ ọ ọ ọ i i i i h h h h à à à à m m m m Mộtlỗithườnggặpkháclàdùnprintf()đểxuấtdữliệutrảvềtừgọihàm,thídụnhưhà m đế m dướiđây: Khixuấtgiátrịdohà m trảvề,toántử.nêndùngđểnốitrongprint(),nhưdướiđây: Dùngtoántử.nhanhhơnviệcdùngprintf() 20. 20. 20. 20. Á Á Á Á p p p p d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai ng ng ng ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a (semantics) (semantics) (semantics) (semantics) NhiềulậptrìnhviênsửdụngPHP m àkhôngbiếtđếnnhữngđiể m tinhtếcủangônngữ này.Mộttrongnhữngđiể m đólàsựkhácnhaugiữacúpháp(syntax)vàngữnghĩa (semantics). C C C C ú ú ú ú ph ph ph ph á á á á p: p: p: p: nhữngquytắcđịnhnghĩamộtphầntử.Thídụ:dấu$đểtrướcdùngđịnh nghĩabiến,dùngdấu()vàcácthamsốđịnhnghĩamộthàm. Thídụsau m ởtậptinvàintừngdòng: Thídụtrênsẽtạolỗi: Warning: Warning: Warning: Warning: Supplied Supplied Supplied Supplied argument argument argument argument is is is is not not not not a a a a valid valid valid valid File-Handle File-Handle File-Handle File-Handle resource resource resource resource in in in in C:Inetpubwwwroot st .php C:Inetpubwwwroot st .php C:Inetpubwwwroot st .php C:Inetpubwwwroot st .php on on on on line line line line 4. 4. 4. 4. <? printf printf printf printf ("%doccurrencesof%sfound.", count($truyvan),$search_term); ?> <? print print print print count($truyvan). "occurrencesof$search_termfound."; ?> <? $fp=@fopen('vanban.txt','r') ordie('Khongthemofilevanban.txt'); while($line=@fgets("$fp",1024))//Loi{ print$line; } @fclose("$fp")//Loi ordie('Khongthedongvanban.txt'); ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 3 3 3 3 Dormitory204.B518:20 PM April 7, 2006 Đólàdobiến$fpđặttrongdấunháyképnênđượcchuyểnthànhchuỗi.Thế m àhà m fopen()nhận m ộtđịnhdanhtàinguyên(resourceidentifier)trongthamsốđầucủanó,chứ khôngnhận m ộtchuỗi.Đểgiảiquyếtvấnđề,bạnchỉđơngiảnbỏdấunháyképđi 1. 1. 1. 1. C C C C ó ó ó ó th th th th ể ể ể ể tr tr tr tr á á á á nh nh nh nh vi vi vi vi ệ ệ ệ ệ c c c c á á á á p p p p d d d d ụ ụ ụ ụ ng ng ng ng sai sai sai sai ng ng ng ng ữ ữ ữ ữ ngh ngh ngh ngh ĩ ĩ ĩ ĩ a? a? a? a? Ourexampleabovegeneratedanerrorstatement.ButPHPenablesyoutocustomize yourscriptstofitauniquescenariooroutputrequirement.So,itisatleasttheoretically possibleto"getaway"withmisapplyingasemantic.Tôikhônghiểu,nhưngdịchthếnàyđược không? Thídụtrêncủachúngtatạora m ộtthôngbáolỗi.NhưngPHPchophépbạntuỳbiếncác scriptđểthíchhợpvới m ộ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ọc về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: Ki Ki Ki Ki ể ể ể ể 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ào lạikhôngkèmtheotínhchấtcủakiểucủanó.PHPcó7kiểucơbản:boolean, resource,integer,double,string,arrayvàobject.  T T T T ầ ầ ầ ầ m m m m v v v v ự ự ự ự c: c: c: c: trongPHP,mỗibiếncómộttầmvựcriêng.Tầmvựcbiếnquyđịnhbiến cóthểđượctruycậptừđâu,tồntạitrongthờigiannào.Hiểusaikháiniệmcơbản về"tầmvực"dẫnđếnnhữnglỗisaitinhtếvàcảnhữnglỗilớn.  php. ini: php. ini: php. ini: php. ini: khiviếtmộtscriptchạyởnhiềumôitrườngkhácnhau,cầnbiếtrằng khôngphảimọicấuhìnhPHPđềunhưnhau.Dođó,cầnthiếtnhữnglệnhkiểmtra đểđảmbảoscriptcủabạnchạytốttrongcấuhìnhPHPcủangườikhác. 19. 19. 19. 19. Thi Thi Thi Thi ế ế ế ế u u u u ghi ghi ghi ghi ch ch ch ch ú ú ú ú Theoýtôi, m ãnguồnthiếughichúlàcănnguyêncủasựlậptrìnhíchkỉ.Nódẫntới nhữnghiệuchỉnhsailầm,hiểusaiýnghĩavàlà m ngườiđọc m ệt m ỏi.Nóichung,lậptrìnhghi chú(inlinedocumentation)được m ọingườikhẳngnhậnlàđiềutốt,nhưnghiế m khinótồntại. Mộtvấnđềkháclàquánhiềughichú.Dùhiế m gặp,nhưngnólà m chocácđoạn m ãbị cắtvụn,gâyrasựkhótheodõi.Dướiđâylà m ộtthídụ: <? //BatdaumaPHP $age=18;//Gan18den$age $age++;//Tang$agelen1donvi //INradoantextthongbao: print"Youarenow19,whichmeansyouhavebeen:"; print" <br> <br> "; //Vonglapforinratatcatuoitruocdo for($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'); ?> PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 4 4 4 4 Dormitory204.B518:20 PM April 7, 2006 //Inratuoicanhan print"$idxyearsold <br> "; }//KetthucmaPHP ?> 1. 1. 1. 1. Bao Bao Bao Bao nhi nhi nhi nhi ê ê ê ê u u u u ghi ghi ghi ghi ch ch ch ch ú ú ú ú th th th th ì ì ì ì đủ đủ đủ đủ ? ? ? ? Nhiếuđến m ứ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ạn  Luô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ưng lạichạyđúng Nế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 á á á á nh nh nh nh d d d d ù ù ù ù ng ng ng ng #) #) #) #) 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 //thereareweightsforthisalgorithmtoworkproperly if(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. Nhi Nhi Nhi Nhi ề ề ề ề u u u u bi bi bi bi ế ế ế ế n, n, n, n, t t t t ố ố ố ố n n n n nhi nhi nhi nhi ề ề ề ề u u u u th th th th ờ ờ ờ ờ i i i i gian gian gian gian Cóvàingườibịá m ảnhbởibiếntrunggian.Tôikhôngthểhiểunổitạisaoaiđócóthể viếtnhưthếnày: PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 5 5 5 5 Dormitory204.B518:20 PM April 7, 2006 Tạisaophảidùngbiếntrunggian?Nókhôngcầnthiết Rủithay,cóvẻnhưrấtnhiềungườikhóbỏđượcthóiquenxấunày. Biếntạ m là m chậ m thờigianthihànhchươngtìnhcủabạn.Tốthơnlànênbỏquađóvà gộpcáclờigọihà m vớinhau.Nhữngngườidùngbiếntạ m thườnglà m chươngcủahọchạy chậ m đến25%. Mộtlídokhácđểtránhcóquánhiềubiếntạ m làvìtrôngnókhôngđượcđẹp m ắt .Trong haithídụtrên,thídụnàosúctíchhơn?Thídụnàolà m con m ắtdễchịuhơn?Dùngquánhiều biếntạ m cóthểdẫnđến m ãchươngtrìnhkhóđọcvàkhôngsúctích. 1. 1. 1. 1. L L L L ợ ợ ợ ợ i i i i đ đ đ đ i i i i ể ể ể ể m m m m c c c c ủ ủ ủ ủ a a a a d d d d ù ù ù ù ng ng ng ng bi bi bi bi ế ế ế ế n n n n t t t t ạ ạ ạ ạ m m m m Cácbiếntạ m cólợitrongviệcthaythếcáchà m haybiểuthứcdàilêthê.Nócóvaitrò nhưbídanhgiả.Điềunàyđặcbiệtđúngkhibạndùng m ộthà m haybiểuthứcnhiềulần. Xemxétthídụđây,nókhôngdùngnhiềubiếnhơn m ứctốithiểu Nộidungtronghà m implode()dàivàdođókhóđọc.Dùng m ộthoặcnhiềubiếntạ m có thểgiúpchúngta: 2. 2. 2. 2. C C C C á á á á c c c c lu lu lu lu ậ ậ ậ ậ t t t t chung chung chung chung c c c c ủ ủ ủ ủ a a a a ng ng ng ng ó ó ó ó n n n n tay tay tay tay c c c c á á á á i i i i Khiquyếtđịnhcódùngbiếntạ m hoặckhông,bạnnênsuynghĩvề2câuhỏi: Bạncódùngbiếnđóítnhấthailần? Tínhđọcđượccủa m ãcótăngđángkểkhông? Nếuítnhất m ộtcâutrảlờilàcó,thìnêndùngbiếntạm.Cònkhông,vứtnóđivàtổhợp cáchà m lại(nếucần). 17. 17. 17. 17. Vi Vi Vi Vi ế ế ế ế t t t t l l l l ạ ạ ạ ạ i i i i c c c c á á á á c c c c h h h h à à à à m m m m c c c c ó ó ó ó s s s s ẵ ẵ ẵ ẵ n n n n Mộtsốnơiphổbiến m ãnguồncácscriptPHPchủtrươngđổitêncáchà m sẵncóđểtạo sự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){ PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 6 6 6 6 Dormitory204.B518:20 PM April 7, 2006 Lạicó m ộtsốngườicốgắngviếtlạicáchà m PHPthôngdụngthayvìđihọcvềhà m đó trongcáctàiliệuPHPcungcấp. Cóítnhất2lídođểkhôngnênlà m điềunày.Thứnhất,vàtrênnhất,nólà m chonhững ngườiđọc(vàsửa)chươngtrìnhcủabạnkhóhiểuvàcả m thấycóquánhiềuhà m dưthừa.Họ tựhỏitạisaobạnlạiđiđịnhnghĩahà m theokiểuđó,thayvìsửdụngcáchà m địnhnghĩasẵn bởiPHP. Thứhai,địnhnghĩahà m nhưvậycũngsẽlà m chậ m chươngtrìnhcủabạn(mộtcách khôngcầnthiết).Khôngchỉphảixửlínhiều m ãhơn, m à m ỗilầngọihà m dobạnđịnhnghĩa, bạnđãtốnthờigianchochínhhà m đó,trướckhihà m nguyênthuỷđượcgọi. 1. 1. 1. 1. Tr Tr Tr Tr á á á á nh nh nh nh vi vi vi vi ế ế ế ế t t t t l l l l ạ ạ ạ ạ i i i i c c c c á á á á c c c c h h h h à à à à m m m m c c c c ó ó ó ó s s s s ẵ ẵ ẵ ẵ n n n n Hãyđươngđầuvớinó.Đôikhithậtlàkhóđểtránhchuyệnnày.Trướctiên, m ộtlậptrình viênkhôngthểtheokịpcáchà m củaPHPngayđược.Vàaicóthờigian m àtracứu.Tạisao khôngviếtlạichokhoẻ? Cáchlà m củatôilàluôncósẵn m ộttàiliệuchỉdẫnPHP( PHPmanual ) m ỗikhiviết chươngtrình(tácgiảbàinàydùng m ộtbảnPDFcótạochỉ m ục,riêngtôi,ngườidịch,thìdùng m ộttàiliệuCHMđầyđủthôngtinvàcócảgópýcủangườisửdụng m àbạncóthểlấyở http://www .php. net/docs .php) .Sauđó, m ỗikhiđịnhviết m ộthà m mởrộng choPHP,tôiđọc lướtquatàiliệuđểxemhà m đócóchưa. Tuynhiên,cầnchúýlà,dobảnchất m ãnguồn m ởcủaPHP,bạncóthểtì m đượccác hà m dongườidùngđịnhnghĩatrướckhinóđượcthê m vàoPHP(thídụnhưhà m tì m phầntử khácnhaugiữahai m ảng).Điềunàykhôngcónghĩalàbạnphảihiệuchỉnhlại m ã(Thisdoesn't necessarilymeanthatyoushouldhavetocorrectthecode. ,$j++){ print$j/do_math($i,$j)." "; } ?> 1.2. 1.2. 1.2. 1.2. Ki Ki Ki Ki ể ể ể ể m m m m tra tra tra tra k k k k ế ế ế ế t t t t qu qu qu qu ả ả ả ả l l l l ờ ờ ờ ờ i i i i g g g g ọ ọ ọ ọ i i i i h h h h ệ ệ ệ ệ th th th th ố ố ố ố ng ng ng ng PHPprogrammingdynamicwebforewreybody 21FatalerrorsinprogrammingwithPHP–CollectfromwrittingofSterlingHughes NGUYENANHKHOA – Class27K0A – DepartmentOfInformationTechnology 18 18 18 18 Dormitory204.B518:20 PM April 7, 2006 Luônđả m bảorằng,khibạnlà m việcvớicáctiếntrìnhhoặctậptinngoàiPHP, m ọithứ đềuvậnhànhđúng. Mộtthídụtuyệtvờilàviệckiể m trađầuracủa m ộtlờigọihệthốngkhidùnghà m sql_connect().Xácnhậnđầurađểkiể m traliênkếtđếnCSDLlàđúng.Là m sai iềunàycóthể dẫnđếncáctruyvấnhỏngvà m ấtdữliệutrongkhithậ m chíbạnkhôngbiết. $ketnoi=@sql_connect($host,$user,$pass); if(!$ketnoi){ die(sprintf("Error[%d]:%s",sql_errno(),sql_error())); } 1.3. 1.3. 1.3. 1.3. Đặ Đặ Đặ Đặ t t t t m m m m ứ ứ ứ ứ c c c c error_reporting error_reporting error_reporting error_reporting l l l l à à à à E_ALL E_ALL E_ALL E_ALL trong trong trong trong t t t t ậ ậ ậ ậ p p p p tin tin tin tin php. ini php. ini php. ini php. ini Hãyđả m bảobạncấuhìnhvới m ứcđộbáolỗicaonhấtcóthể.Nếubạnkhôngđặtnóở m ứccaonhất,ítnhấtlàtrongquátrìnhtì m lỗ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ể m trakế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à m do_math:khôngcóthôngbáo illegaldivisionbyzerođãtừnghiệnralầntrước,phần$i=$j=0đơnthuầnkhônghiệnkếtquả. < ?php error_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

Ngày đăng: 13/07/2014, 14:20

Mục lục

  • 18.Nhiềubiến,tốnnhiềuthờigian

    • 1.Lợiđiểmcủadùngbiếntạm

    • 2.Cácluậtchungcủangóntaycái

    • 17.Viếtlạicáchàmcósẵn

      • 1.Tránhviếtlạicáchàmcósẵn

      • 16.Khôngtáchbiệtphầnservervàclient

        • 1.HàmAPI

          • 1.1.LợiíchcủahàmAPI

          • 1.2.Bấtlợi

          • 2.Hệthốngkhuônmẫu

            • 2.1.Ưuđiểmcủahệthốngkhuônmẫu

            • 2.2.Nhượcđiểm

            • 15.Dùngcáccấutrúclỗithời

            • Tổngkết

            • PHẦN2–LỖINGHIÊMTRỌNG

            • 

              • 14.Khôngtuânthủcácquyướcđặttên

                • 1.Đặttênbiến

                  • 1.1.Cáchviếtphânbiệt

                  • 1.2.Tênquángắn

                  • 1.3.Tênquádài

                  • 1.4.Thóiquentốt

                  • 1.5.Thóiquenxấu

                  • 2.Đặttênhàm

                    • 2.1.Dùngđộngtừ

                    • 13.Khôngsuynghĩthấuđáo:CSDL&SQL

                      • 1.DùngsaicáchàmCSDL

                        • BàiviếtnàydànhchonhữnglậptrìnhviênPHPqu

                        • 1.2.TừbỏvònglặpDo..While

                        • 1.3.Giữmọithứgọngàngvàđơngiản

                        • BàiviếtnàydànhchonhữnglậptrìnhviênPHPqu

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan