Autor Zpráva
BramBurky
Profil *
Dobrý den,
rád bych se zeptal na nějaké zasady, či doporučení pro psaní php kódu.
Např. tento kód, který použím pro přihlášení uživatelů a vypsání jejich možností v pravé časti stránek.
<?php
if($_SESSION["nick"] == ""){

ob_start();
	require_once ("nastaveni_databaze.php");

		if(isset($_POST['tlacitko_prihlasit']))
				{
					if ($_POST['heslo'] == "" and $_POST['nick'] == "" ) {?><script>alert("Pole \"Pøihlašovací jméno\" a \"Heslo\" jsou nevyplnìné!"); </script><? ;}
					elseif($_POST['nick'] == "") {?><script>alert("Pole \"Pøihlašovací jméno\" je nevyplnìné!"); </script><? ;}
					elseif ($_POST['heslo'] == "") {?><script>alert("Pole \"Heslo\" je nevyplnìné!"); </script><? ;}
					else
						{

						$nick=$_POST['nick'];
						$heslo=$_POST['heslo'];

							//ochrana DB
							$nick = stripslashes($nick);
							$heslo = stripslashes($heslo);
							$nick = mysql_real_escape_string($nick);
							$heslo = mysql_real_escape_string($heslo);

								$overeni_uzivatele="SELECT * FROM uzivatele WHERE nick='$nick' and heslo='$heslo' and random_id = 1";
								$result=mysql_query($overeni_uzivatele);
								$kontrola=mysql_num_rows($result);

									if($kontrola == 1){
									session_register("nick");
 
										 $overeni_uzivatele_tym=mysql_query("select * from uzivatele where nick = '".$_SESSION["nick"]."'");
											while ($klub=MySQL_Fetch_Array($overeni_uzivatele_tym)):
												$nazev_klubu = $klub["nazev_klubu"];
												$jmeno_managera = $klub["jmeno_managera"];
												$nazev_haly = $klub["nazev_haly"];
												$mesto = $klub["mesto"];
											endwhile;
											session_register("nazev_klubu");
				
									if ($nazev_klubu == "" and $jmeno_managera == "" and $nazev_haly == "" and $mesto == "") 
										{
										$presmerovani = "?page=tvorba-profilu";
										}
									else
										{
										$presmerovani = "?page=prihlasen";
										}
									mysql_query ("insert into host set je_pripojen='".$_SESSION["nick"]."'");
									presmerovani($presmerovani);

				}

				else {
					$overeni_uzivatele_ran="SELECT * FROM uzivatele WHERE nick='$nick' and heslo='$heslo'";
					$result_ran=mysql_query($overeni_uzivatele_ran);
					$kontrola_ran=mysql_num_rows($result_ran);

						if($kontrola_ran == 1)
							{ 
							echo "<strong>Zatím jste si neaktivoval úcet.</strong>";
							}
						else 
							{
							echo "<strong>Špatnì zadané Přihlašovací jméno nebo heslo.</strong>"; 
							}

			}

ob_end_flush();
}
}
?>


<form class="form" method="post" action="/index.php" >
<table cellpadding="1" cellspacing="0" align="center">
<tr><td align="left">Nick:</td><td><input class='loginy' id='nick' type='text' name='nick' value="<? echo "".$_POST['nick']."" ?>" /></td></tr>
<tr><td align="left">Heslo:</td><td><input class='loginy' id='heslo' type='password' name='heslo' value="<? echo "".$_POST['heslo']."" ?>" /></td></tr>
<tr><td colspan="2" align="right"> <input type="submit" name="tlacitko_prihlasit" value="Pøihlásit se" /></td></tr>
</table>
</form>
<? 
} 

else 
	{
		$overeni_uzivatele_tym=mysql_query("select * from uzivatele where nick = '".$_SESSION["nick"]."'");
				
				while ($klub=MySQL_Fetch_Array($overeni_uzivatele_tym)):
					$nazev_klubu = $klub["nazev_klubu"];
					$jmeno_managera = $klub["jmeno_managera"];
					$nazev_haly = $klub["nazev_haly"];
					$mesto = $klub["mesto"];
				endwhile;
				
				if ($nazev_klubu == "" and $jmeno_managera == "" and $nazev_haly == "" and $mesto == "") 
					{
					echo "žádné funkce<br/>";
					odhlasit();
					}
				
				else 
					{
					echo "užvitel prihlášen jako <strong>".$_SESSION["nick"]."</strong><br/>";
					require ("prave-menu.php");
					odhlasit(); 
					}
	}
	?>
Měsíček
Profil
Reaguji na Bramburku:

Třeba bys nemusel mít nastavený tolik mezer na tabe(u)látor :) tohle jsi psal ve (WIN) Notepadu? Jinak někteří píší místo $_POST['heslo'] == "" spíše empty($_POST["heslo"]), ale IMHO ve výsledku rozdíl není žádný. Pak možná zápisem
  if () 
    {
    příkaz;
    příkaz;
    } 
bereš moc místa, nelíbilo by se ti spíše tohle?
  if () {
    příkaz;
    příkaz;
  }
jinak abych to shrnul ono je to vcelku jedno :)
igamenir
Profil
u kódu jde spíš o to aby ses v něm vyznal ty, ale tak co dodržuji já a vyhovuje mi to:

- tabulátory (které mám v PSpadu nastavené na šířku dvou, aby nebyli tak velké) dávám jenom ve vnořených částech, tj. v if, for, atd, abych se v tom vyznal a věděl c ukončovat
- poměrně dost komentuji, abych se v kódu vyznal, i když se k němu vrátím za pár měsíců
- a v poslední době jsem si místo složených závorek zvykl na endy, líp se mi pak kontroluje, k čemu jaký konec je, když je za tím připojené dané slovíčko:
if ():
  nějaký kód
  for():
    další kód
  endfor;
endif;
Měsíček
Profil
Reaguji na igamernira:

Upřímně mi to nepříjde moc přehledné .. u mě vyhrává [2] i když jsem viděl už mnohokrát i [1].
<?php

  $x = 3;
  $y = 4;

/****************** 1 *********************/

  if ($x < 10) {
    echo "$x je menší než 10";
      if ($y > 10) {
        echo "$y je větší než 10";
      } # Ukončení 2 <IF>u
  } # Ukončení 1 <IF>u

/****************** 2 *********************/

  if ($x < 10) {
    echo "$x je menší než 10";
      if ($y > 10) {
        echo "$y je větší než 10";
      }
  }

/****************** 3 *********************/

  if ($x < 10) :
    echo "$x je menší než 10";
      if ($y > 10) :
        echo "$y je větší než 10";
      endif;
  endif;

/***************************************/

?>
bohyn
Profil
Jinak někteří píší místo $_POST['heslo'] == "" spíše empty($_POST["heslo"]), ale IMHO ve výsledku rozdíl není žádný.
Rozdil je IMHO podstatny:
Returns FALSE if var has a non-empty and non-zero value.

The following things are considered to be empty:
"" (an empty string)
0 (0 as an integer)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)

Zdroj: PHP manual

Ke stylu psani:
Pouzivam #2 co posilal Měsíček. Zkousel sem i #1 ale prehlednosti sem tim moc nepridal, tak sem se na to vykaslal a vratil se k #1. Na metodu #3 muzou byt zvykli lide z ASP a jinych jazyku pouzivajicich tuto syntax.

Dale se nekdy ztracim pri vynechavani slozenych zavorem
if(true)
  if(true)
    echo "neco";
  else
    echo "neco2";


Ad odsazovani:
odsazuju dvema mezerama - je to ve vsech editorech stejne.
Měsíček
Profil
Reaguji na bohyna:

Máš pravdu malý rozdíl tam je, no :)
<?php
  $x = Array("X",null,0,1,0.33,"", false, array(), "0");
    for ( $y = 1; $y < 9; $y++) {
      if (empty($x[$y])) {
          $z_1[$y] = $x[$y];
      }
      if ($x[$y] == "") {
          $z_2[$y] = $x[$y];
      }
    }
  print_r($z_1);  // Array ( [1] => [2] => 0 [5] => [6] => [7] => Array ( ) [8] => 0 )
  print_r($z_2);  // Array ( [1] => [2] => 0 [5] => [6] => ) 
?>
takže omlouvám se za blud.
joe
Profil
1. Nechápu proč odsazuješ i jednotlivé bloky if-else, tj. proč místo Měsíčkova kódu:
  if ($x < 10) {
    echo "$x je menší než 10";
      if ($y > 10) {
        echo "$y je větší než 10";
      }
  }
nenapíšeš (tady jsou použité TABy místo mezer)
if ($x < 10) {
	echo "$x je menší než 10";
	if ($y > 10) {
		echo "$y je větší než 10";
	}
}
2. Odsazování dělej pomocí tabulátorů (tak aby i v textu byly tabulátory) a ne pomocí mezerníku. Velikost tabulátorů si můžeš pak změnit a projeví se ti to i v kódu, což je výhoda.
3. Piš si tak, jak uznáš za vhodný, já bych ale po tobš tenhle kód číst nechtěl. Rozhodně by mě nebavilo pořád posouvat posuvníkem na obě strany a ještě scrollovat.

bohyn
Stejné to není, ale pokud se to použije k tomuto účelu, tak to skutečně jedno je.
BetaCam
Profil
BramBurky
Styl psaní je věc subjektivní. Nelze dost dobře říct co je lepší a co horší. Tvůj problém je hlavně to, že nemáš vůbec žádnej styl. Ten kód co si sem postnul je toho krásná ukázka.

1) Odsazení používáš jak se ti zachce
2) Ohraničení obloku závorkami taky jak se ti zachce

K bodu 1) :

a) někde odsazuješ jedním tabulátorem někde zas dvěma.
b) odsazuješ i hodnoty v rámci jednoho bloku :
$nick=$_POST['nick'];
						$heslo=$_POST['heslo'];

							//ochrana DB
							$nick = stripslashes($nick);
							$heslo = stripslashes($heslo);
							$nick = mysql_real_escape_string($nick);
							$heslo = mysql_real_escape_string($heslo);

								$overeni_uzivatele="SELECT * FROM uzivatele WHERE nick='$nick' and heslo='$heslo' and random_id = 1";
								$result=mysql_query($overeni_uzivatele);
								$kontrola=mysql_num_rows($result);


K bodu 2 :

používáš :
if(){
}

nebo

if()
{
}

nebo

if()
	{
	}


Osobmě používám :

tab = 4 mezery

Styl zápisů bloků :
if(){
	echo $aaa;
}else{
	echo $bbb;
}


Inline if zápis :

if() echo $aaa; else echo $bbb;


Ale prostě to sou věci které sou subjektivní. Pokud mi někdo donese kód podobný tomu tvému tak si to stejně nechám přerovnat na styl na který sem zvyklí.
BramBurky
Profil *
Děkuji za příspěvky, určitě se z vašich názorů budu snažit poučit.
srigi
Profil
Kcem sa vas PHPckarov spytat, ked tu mame taku zivu temu, ktory styl if/else (try/catch) so slozenymi zatvorkami pouzivate?
// (1.)
if () {
  ...
}
else {
  ...
}

// (2.)
if () {
  ...
} else {
  ...
}

Vdaka za odpovede.
Měsíček
Profil
Reaguji na srigiho:

Já druhý .. tedy
<?php
  if (3 < 4) {
    // Do 1
  } else {
    // Do 2
  }
?>
DJ Miky
Profil
Já zase nerad odsazuju závorky u funkcí, operátory apod., pro mě je přehlednější napsat
if($a==4) $b=$a+1;
než
if ($a == 4) $b = $a + 1;
protože ten kód je pak souvislejší a lépe se čte. I když co vídávám, tak ostatní používají většinou opačný styl.

Na druhou stranu nešetřím řádky, takže místo BetaCamova způsobu psaní if-else:
if(){
	echo $aaa;
}else{
	echo $bbb;
}

if() echo $aaa; else echo $bbb;
používám radši
if() {
	echo $aaa;
}
else {
	echo $bbb;
}

if() echo $aaa;
else echo $bbb;
Ale je to opravdu jen o zvyk, důležité je mít svůj styl a tím psát všechno, ne každý řádek jinak...
bohyn
Profil
joe
S tabulatorama je problem ze ne v kazdym editoru to jde zmenit. Treba v kdevelop (nebo notepadu) se mi to nejak nedari.
BetaCam
Profil
DJ Miky
Na druhou stranu nešetřím řádky, takže místo BetaCamova způsobu psaní if-else:

if() echo $aaa; else echo $bbb;


To neni ani tak o šetření řádků jako o tom kdy tento zápis používám. Já ho používám v určitých případech pro nahrazení ternárního operátoru. Proto ho píši inline stejně jako bych tak napsal ternár.
joe
Profil
bohyn
To je možné, ale pokud bych dělal nějaké úpravy, tak na to nepotřebuju změnit tabulátory. Psát celý kód v notepadu není zrovna rozumný nápad, stejně tak jako psát to snad v jakémkoli editoru na Linuxu, kde se ten kód ani nedá číst. Třeba ve škole je jakýsi editor KAte, ve kterém nenapíšu snad ani pár řádků dobře, ještě že existujou ty Windows :)
nightfish
Profil
http://nettephp.com/cs/coding-standard
bohyn
Profil
joe
Nepodcenuj kdevelop, je to velmi schopny editor a rad ho pouzivam (pod Linuxem IMHO lepsi neni). Co se tyce notepadu a spol. tak je to nouzovka dostupna vsude. Cele weby v nem taky nepisu.
Timy
Profil
Mně maximálně vyhovuje C# styl:

for (int i = 0; i < hraciDeska.rozmer; i++)
{
    for (int j = 0; j < hraciDeska.rozmer; j++)
    {
        if (ValidniTah(i, j, radekOdkud, sloupecOdkud, hrac) && hraciDeska.MuzemeTahnout(i, j))
        {
            PlatnyTah tah = new PlatnyTah();
            tah.Kam = new Pole(i, j);
            tah.Preskoceno = preskoceno;

            platneTahy.Add(tah);
        }
    }
}


Kód je na jednu stranu dlouhý, ale na druhou stranu je všechno hezky označené a hned na první pohled jasně vidím všechny začátky a konce.
joe
Profil
OT: bohyn
Já bych v tom psát nemohl nic, protože na linuxu je takové divné vyhlazení písma. Editor může být sice dobrý, ale když nemá normální písmo, nevyhlazené, je pro mě k ničemu.

nightfish
Můžeš mi prosím tě vysvětlit, proč nepoužívat ?> ? Nejsem si jenom jistý jestli to z toho anglického textu chápu správně :)
Jan Tvrdík
Profil
Osobně preferuji "skutečné tabulátory" se šířkou 4 mezery + formátování téměř velmi podobné http://nettephp.com/cs/coding-standard

BramBurky
Ten kód je napsán tak strašně, že ho ani přeformátování nezachrání :)

Timy
Ten jsem kdysi taky používal, ale pak jsem přešel variantu Měsíček:2 (myslím styl závorek) a v editoru pro C# jsem si to taky nastavil (bohudík, že to jde). "Shazování" otevírací složené závorky na nový řádek používám jen u funkcí a tříd.

nightfish
http://nettephp.com/cs/coding-standard
To je tak staré, že ani David už některé části nedodržuje.

joe
Můžeš mi prosím tě vysvětlit, proč nepoužívat ?> ?
Eliminuješ možnost, že na konci dokumentu omylem odešleš nějaké bílé znaky, které zabraní zapnutí session apod.
joe
Profil
Jan Tvrdík
Díky. Já to zakončení píšu jen tam, kde je to potřeba. Překládal jsem si to dobře, ale stejně to moc dobře nechápu.

Je to asi myšlené tak, že pokud tam bude ?> a za ním nějaké znaky, tak pak abych eliminoval nějaký výpis, když bych pak includoval třeba nějaký další soubor. Ale když bude nějaký bílý znak před ?> tak to nevadí, jestli to teda chápu dobře. Tak to potom jo :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: