Jump to content


- - - - -

PHP սխալների պարզաբանում և քննարկումներ


11 replies to this topic

#1 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 30 June 2010 - 01:12 PM

Որպես index.php ունեմ հետևյալ սկրիպտը՝

<body leftmargin="5" marginwidth="5" topmargin="5" marginheight="5">  


<table width="100%" border=0 cellpadding=0 cellspacing=0 summary="">
  
<tr><td> <?php
			require("header_am.inc");
	  ?></td></tr>
  
<TR><TD><?php
			   require("menu_am.inc")
	 ?>
 </TD>
</tr>
<tr>
<td>
	<?php
		 $ce=$_GET['c'];
				  if ($ce != "") {
					 include("".$ce.".inc");
				  } else {
					 include("home_am.inc");
				  }
			   ?>
</td>
</tr>
  
<tr>
<td>	<?php
			require("footer_am.inc");
		  ?>
</TD>
</TR>

</TABLE>

   
</body>

Ամեն ինչ նորմալ է, ըստ իս, բայց browser–ով բացելիս ամեն տողից հետո մի մեծ բաց տեղ է մնում,
այսինքն ունեմ

header
դատարկ տեղ
menu
դատարկ տեղ
home
դատարկ տեղ
footer

Կխնդրեի գրել ինչպե՞ս անել, որ տողերի միջև արանք չմնա

header
menu
home
footer
Ողջ լերուք...

#2 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 03 July 2010 - 01:19 AM

Այստեղ կարող ենք քննարկել տարատեսակ լուծումներ ու օգնություն ստանալ սխալների պարզաբանման ու որակյալ ծրագրեր գրելու հարցում։
Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի

#3 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 03 July 2010 - 02:30 AM

Ես ոչ մի տարօրինակ բան չեմ տեսնում քո գրած կոդի մեջ ու կարող եմ ենթադրել, որ տարածությունները քո օգտագործած բրոուզերից է, որը white space (space, tab, line return) նշանները պարզապես սխալ է հասկանում։ Ավելի լավ է մեկ այլ ճանապարհով գնանք ու ես քեզ փորձեմ ներկայացնել այն փոքրիկ սխալները, որոնք արել ես ծրագրում։ Դա շատ ավելի օգտակար կլինի ու համոզված եմ կուղղի դատարկ տարածության խնդիրը։

<body leftmargin="5" marginwidth="5" topmargin="5" marginheight="5">
Ներկայումս շատ ուժեղ տենդենց կա ծրագրի ներկայացումը բաժանել ստրուկտուրայից։ Օրինակ < body > թագը դա ստրուկտուրայի մասն է, որը ծրագիրը կարդացող համակարգին հուշում է, որ այդտեղից սկսելու է էջը։ leftmargin="5" marginwidth="5" topmargin="5" marginheight="5" էջի ներկայացման մասն է, այսինքն ներկայացնում է տվյալ թագի դիրքը, դասավորվածությունը էջի վրա։ Բացի այդ leftmargin="5" և topmargin="5" MSIE բրոուզերի (Internet Explorer) համար է միայն իսկ marginwidth="5" և marginheight="5" նույն բանն է ուղղակի Mozilla բրոուզերի (Netscape) համար։ Հիմա կհարցնես իսկ որն է ավելի ճիշտ ձևը նույն բանը անելու, որ չխառնվի ներկայացումն ու ստրուկտուրան։ Դրա հմար պիտի օգտագործես CSS:

<style type="text/css">
	body {margine: 5px;}
</style>

<body>...</body>
Տվյալ լուծումը հարմար է ու ավելի գործածական։

Հաջորդը վերաբերում է հետևյալ տողին։
<table width="100%" border=0 cellpadding=0 cellspacing=0 summary="">
Պարամետրերը միշտ պետք է լինեն չակերտների մեջ ըստ ստանդարտի։ Եթե ուղղենք այն կունենա հետևյալ տեսքը։
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">

http://www.htmlcodetutorial.com/document/_..._TOPMARGIN.html

Սովորաբար շատ լավ սովորություն է փոքրատառերով գրել HTML կոդը։ Եթե դա ել ուղղենք ապա՝
<TR><TD>
փոխարեն կստացվի
<tr><td>

Վերջին խորհուրդս վերաբերում է white space (space, tab, line return) նշանների օգտագործմանը։ Շատ հաճախ դրանց անտեղի օգտագործումը բերում է տարօրինակ արդյունքների, ինչպիսին տվյալ դեպքում է։ Այսինքն խուսափի այդ նշանների անտեղի օգտագործումից։ Եթե մենք դա ել ուղղենք ապա՝
<TR><TD><?php
			   require("menu_am.inc")
	 ?>
</TD>
փոխարեն կստացվի
<tr><td><?php require("menu_am.inc");?></td>

Հաշվի առնելով այս բոլոր խորհուրդները PHP կոդի վերջնական տեսքը կստացվի՝
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>My Program</title>
		<style type="text/css">
			body {margine: 5px;}
		</style>
</head>
<body>
	<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
		<tr>
			<td> <?php require("header_am.inc");?></td>
		</tr>
		<tr>
			<td><?php require("menu_am.inc");?></td>
		</tr>
		<tr>
			<td><?php
				  $ce=$_GET['c'];
				  if ($ce != "") {
					 include("".$ce.".inc");
				  } else {
					 include("home_am.inc");
				  }
			   ?></td>
	   </tr>
	   <tr>
		   <td><?php require("footer_am.inc");?></td>
	   </tr>
	</table>
</body>
</html>

Բացի այս փոփոխությունից նաեվ պիտի հետևես, որ ներառված ֆայլերում՝ header_am.inc, home_am.inc, footer_am.inc, նույնպես ավելորդ white space (space, tab, line return) նշաններ չլինեն օգտագործված։ Համոզված եմ այսքանը ուղղելուց հետո այս խնդիրը կվերանա, այլապես փորձիր ծրագիրը բացել այլ բորոուզերով ու նկատված տարբերությունները գրի այստեղ, որ կարողանանք ավելի մանրազնին ուսումնասիրել կոդը ու պարզել սխալլի պատճառը։ Բացի այդ շատ ավելի օգտակար կլինի նաև ներառված ֆայլերը նույնպես այստեղ ներկայացնելը, ոանի որ դրանք նույնպես կարող են այս խնդրի պատճառ հանդիսանալ։

Հուսով եմ օգնությունս սպառիչ էր ու հասկանալի, այլապես կխնդրեի ներկայացնես թե ինչը կուզենաիր ավելի մանրակրկիտ բացատրեի։
Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի

#4 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 03 July 2010 - 03:19 AM

Մի փոքր կցանկանայի խոսել հետևյալ հատվածի վրա, որը շատ կոպիտ սխալ է պարունակում, ինչը թույլ կտա հանգիստ "հակ" անել թե ծրագիրդ և թե սերվերդ։
<?php
$ce=$_GET['c'];
if ($ce != "") {
include("".$ce.".inc");
} else {
include("home_am.inc");
}
?>
Հիմա եթե քո PHP մեջ թույլատրվի արտաքին, հեռակա (remote) ֆայլերի ներառումը, ապա եթե $ce = http://www.armtown.com/badfile/my ապա ծրագիրը կատարելով տողի միացումը կստանա`
include("http://www.armtown.com/badfile/my".".inc")
Այսինքն ես կաշխատացնեմ իմ գրած my.inc ֆայլը քո սերվերի վրա, որը հավասարազոր է ինքնասպանության :)

Նման միջադեպերից խուսափելու համար միշտ անհրաժեշտ է ստուգել բոլոր պարամետրերը նախքան օգտագործելը ու մինիմալի հասցնել դրանք արտաքինից փոխելու հնարավորությունը։

Օրինակ այս նույն կոդը կարելի է գրել ավելի ապահով ձևով՝
<?php
	$ce = empty($_GET['c']) ? 0 : intval($_GET['c']);
	switch($ce) {
		case 1: 
			include("file1.inc"); 
			break;
		case 2: 
			include("file2.inc");
			break;
		case 3: 
			include("file3.inc"); 
			break;
		default: 
			include("file4.inc");
	}
Տվյալ կոդի տարբերությունը նրանում է, որ առաջինը այն $ce պարամետրին տալիս է կանխորոշված արժեք՝ 0։ Բացի այդ փոխակերպում է պարամետրը իրական թվի։ Այսինքն անկախ մուտքագրված պարամետրի այն կարող է լինել 0, եթե պարամետրը դատարկ է կամ հավասար 0–ի կամ ել նորից 0, եթե պարամետրը իրական թվի չի փոխակերպվում (intval("abc") == 0) կամ ել իրական թիվ, որը ծրագրի շարնակության մեջ ստուգվում է ու ներառվում համապատասխան ֆայլը։

Ստացվում է, որ ցանկացած պարամետրի դեպքում արդյունքը կանխատեսելի է, որը մեր գերնպատակը պիտի լինի ծրագրավորելիս։
Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի

#5 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 05 July 2010 - 06:52 PM

Սերգե ջան, շատ–շատ շնորհակալ եմ սխալների ուղղման և շատ օգտակար խորհուրդների համար։
ԱՊՐԵՍ։

PHP-ն իմ համար հետաքրքիր հոբբի է ու քո խորհուրդները ինձ տվյալ դեպքում կօգնեն։
Հենց փոփոխեմ, արդյունքները կգրեմ։
Ողջ լերուք...

#6 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 06 July 2010 - 04:05 PM

View PostՀայք, on Jul 5 2010, 11:52 AM, said:

Սերգե ջան, շատ–շատ շնորհակալ եմ սխալների ուղղման և շատ օգտակար խորհուրդների համար։
ԱՊՐԵՍ։

PHP-ն իմ համար հետաքրքիր հոբբի է ու քո խորհուրդները ինձ տվյալ դեպքում կօգնեն։
Հենց փոփոխեմ, արդյունքները կգրեմ։
Ես գիտեմ, որ հոբբի է ու դրա համար ել նման մանրակրկիտ եմ փորձում բացատրել, հնարավորինս շոշափելով հարցի կարևոր անկյունները։
Շատ հետաքրքիր լուծումներ կան, որոնք ձեռք են բերվում փորձի միջոցով, որը մի քանի տողով փոխանցելը այնքան ել հեշտ գործ չէ։

Բացի այդ ծրագրավորումը դա անհասկանալի բառերի ու թվերի համադրման կարողություն չէ այլ մտածելակերպ է։
Երբ այն ձեռք բերես, այլևս մեծ դյվարություն չի լինի մի լեզվից մյուսին անցնելը։
Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի

#7 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 07 July 2010 - 08:51 AM

Այս կերպ փոփոխելով կոդը, ոչինչ չփոխվեց՝

Quote

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Transitional//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html   xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
	 <meta   http-equiv="content-type" content="text/html; charset=utf-8" />
	 <title>My   Program</title>
		 <style type="text/css">
			 body   {margine: 5px;}
		 </style>
 </head>
 <body>
	 <table   width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
		 <tr>
			 <td>   <?php require("header_am.inc");?></td>
		 </tr>
		 <tr>
			 <td><?php   require("menu_am.inc");?></td>
		 </tr>
		 <tr>
			 <td><?php
				   $ce=$_GET['c'];
				   if   ($ce != "") {
					  include("".$ce.".inc");
				   }   else {
					  include("home_am.inc");
				   }
				  ?></td>
		</tr>
		<tr>
			  <td><?php require("footer_am.inc");?></td>
		  </tr>
	 </table>
 </body>
 </html>

Ողջ լերուք...

#8 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 08 July 2010 - 03:21 PM

Սերգե ջան, մի լրացում հարցիս, այս խնդիրը առաջացել է այն ժամանակ երբ կոդավորումը փոխել եմ charset=utf-8
դրանից առաջ կոդավորումը charset=windows-1250 էր

Կարո՞ղ է դրա հետ կապված լինի։
Ողջ լերուք...

#9 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 08 July 2010 - 04:10 PM

View PostՀայք, on Jul 8 2010, 08:21 AM, said:

Սերգե ջան, մի լրացում հարցիս, այս խնդիրը առաջացել է այն ժամանակ երբ կոդավորումը փոխել եմ charset=utf-8
դրանից առաջ կոդավորումը charset=windows-1250 էր

Կարո՞ղ է դրա հետ կապված լինի։
Սա այն քայլերն են, որոնք պիտի անես այլ հանգամանքները բացառելու ու խնդիրը նեղացնելու համար, որ կարողանանք հայտնաբերել բուն պատճառը։
Փոխի առաջվա կոդավորման ու եթե տարածությունները կկորեն, ապա.
  • Ստուգի ինչ ենկոդինգով են պահպանված ներառվող ֆայլերդ (գուգլ արա "How check file encoding" կամ ես օրինակ EditPlus եմ օգտագործում, որտեղ շատ հեշտ է տեսնելը պահպանված ֆայլի կոդավորումը)։ Եթե UTF-8 ես պատրաստվում օգտագործել, ապա պահպանված ֆայլերը նույնպես պիտի լինեն այդ կոդավորման՝ եթե դրանցում Unicode տեքստեր կան, այլապես պարտադիր չէ։
  • Ստուգիր արդյոք ներառված ֆայլերի սկզբում կամ վերջում բաց տարածություններ կան (whitespace characters), ապա մաքրի դրանք։
  • Ստուդիր արդյոք տպման հրամաններում (echo, print, <<<HTML) կան բաց տարածություններ (հիմնականում սկզբում կամ վերջում)։

Եթե տարածությունները չկորեն ապա փորձիր կամ ժամանակավորապես ջնջել <?php ...?> մասերը կամ դրանք քոմենթ անել <?php //include...?>։ Եթե կկորի տարածությունը, ապա խնդիրը ներառված ֆայլերի մեջ է, այլապես էջի դեկլարացիայի կամ ինչ որ պատճառով բրոուզերի վատ ըմբռնման մեջ։ Սակայն արի առաջ չվազենք ու հերթով բացառենք հնարավոր շեղումները։
Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի

#10 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 25 October 2010 - 05:10 PM

Սերգե ջան կոդավորումը լրիվ նորմալ է արված։

Կարծում եմ խնդիրն այստեղ է, քանի որ սա անելուց հետո տարածությունը չի վերանում։

Quote

փորձիր կամ ժամանակավորապես ջնջել <?php ...?> մասերը կամ դրանք քոմենթ անել <?php //include...?>։ Եթե կկորի տարածությունը, ապա խնդիրը ներառված ֆայլերի մեջ է, այլապես էջի դեկլարացիայի կամ ինչ որ պատճառով բրոուզերի վատ ըմբռնման մեջ։

Quote


Ողջ լերուք...

#11 Հայք

    Member

  • Members
  • PipPip
  • 262 posts

Posted 25 October 2010 - 05:14 PM

Կուզեի միայն այս մասը ուղղեիր՝

<?php
				   $ce=$_GET['c'];
				   if ($ce != "") {
					  include("".$ce.".inc");
				   } else {
					  include("home_am.inc");
				   }
				?>

Դու էստեղ տվել ես ոնց որ թե, բայց շատ բաներ չեմ հասկանում՝

<?php
	$ce = empty($_GET['c']) ? 0 : intval($_GET['c']);
	switch($ce) {
		case 1:
			include("file1.inc");
			break;
		case 2:
			include("file2.inc");
			break;
		case 3:
			include("file3.inc");
			break;
		default:
			include("file4.inc");
	}?>

օրինակ կբացատրե՞ս case 1, case 2, case 3 ... իմաստը։
Ես ոնց որ հասկանում եմ default–ի տակ պետք է գրել հիմնակա՞ն էջի "անունը", ասենք "home.inc", իսկ case–երի տակ երկրորդական էջերի անուները, ասենք "price.inc", "news.inc", թե պետք է բոլոր ֆայլերս անվանափոխեմ file1.inc, file2.inc ...
Ողջ լերուք...

#12 SkyFlyer

    Administrator

  • Admin
  • PipPip
  • 940 posts

Posted 08 November 2010 - 06:17 PM

Առաջին մասը պիտի լինի այսպես, եթե որոշես այդ ճանապարհով գնալ, որը սխալ է ու ռիսկային՝
<?php
		$ce=$_GET['c'];
		if ($ce != "") {
			 include($ce.".inc");
		} else {
			 include("home_am.inc");
		}
?>

Ինչ վերաբերում է select...case հրամանին, ապա դրա հիմնական նպատակը ծրագրի ճյուղավորումն է։ Այսինքն կախված տրված պարամետրից ($ce) ծրագիրը կընտրի տարբեր ճանապարհներ։


Այն մոտավորապես ասում է.
  • եթե $ce = 1 ապա կատարիր include("file1.inc");
  • եթե $ce = 2 ապա կատարիր include("file2.inc");
  • եթե $ce = 3 ապա կատարիր include("file3.inc");
  • եթե $ce այլ արժեք ունի (բոլոր այն մնացյալ արժեքները, որոնց համար չկա case, ասենք 5 կամ "կարմիր") ապա կատարիր include("file4.inc");
Այնպես որ անվանափոխելու կարիք չկա, քանի որ դա միայն օրինակ էր։ Այնտեղ կարող ես գրել ցանկացած հրաման։

Նաև նշեմ մի շատ կարևոր հանգամանք՝ դա break հրամանն է։ Եթե այն բաց թողնես, ապա համնկնող case–ից հետո բոլոր մյուս case–երը կկատարվեն։
<?php
$total = 0;
switch($i) {
	case 6:
		$total = 99;
	break;
	case 1:
		$total += 1;
	case 2:
		$total += 2;
	case 3:
		$total += 3;
	case 4:
		$total += 4;
	case 5:
		$total += 5;
}
?>
Վերևի ծրագրի համար սա ճիշտ է.

  • եթե $i = 6, $total = 99
  • եթե $i = 5, $total = 5
  • եթե $i = 4, $total = 9
  • եթե $i = 3, $total = 12
  • եթե $i = 2, $total = 14
  • եթե $i = 1, $total = 15

Մի՛ եղէց անպտուղ ի փոքր վաստակոյս`
Իբր ապաջան սերմանող անբերրի երկրի:
Նարեկացի