Autor Zpráva
Šamanta
Profil *
Ahoj,

PHP se věnuji už docela dlouho, ale můj kód furt není úplně "profi". Potřebuji získat nové návyky a psát lépe. Tak bych se vás chtěl zeptat, jak vylepšit třeba tento kód. Ano je funkční to ano, ale zda se dá nějak zlepšit? Je podle obecných zvyklostí zapsaný dobře nebo to jde lépe? Co se kódu týče, jenom ukazuje stav notýsku, ve kterém jsou funkce a skloňuje slovíčko funkce dle potřeby.

<?
if(mysql_num_rows(db_select("funkce")) == 0){
  echo "V notýsku není žádná funkce :(";
}
else{
  echo "V notýsku ";
  if(mysql_num_rows(db_select("funkce")) == 2 OR mysql_num_rows(db_select("funkce")) == 3 OR mysql_num_rows(db_select("funkce")) == 4){
    echo "jsou";
  }       
  else{
    echo "je";
  }
  echo " přesně <b>"; 
  echo mysql_num_rows(db_select("funkce"))."</b>";  
  if(mysql_num_rows(db_select("funkce")) == 1 OR mysql_num_rows(db_select("funkce")) == 2 OR mysql_num_rows(db_select("funkce")) == 3 OR mysql_num_rows(db_select("funkce")) == 4){
    echo " funkce :)";
  }       
  else{
    echo " funkcí :)";
  }
}
?>

Díky


Omlouvám se za chybějící tagy pro kód, prosím moda o úpravu.
Moderátor Alphard: Budiž.
Alphard
Profil
Začnu s problémy ohledně výkonu. Jak je implementováno db_select()? Jestli kvůli skloňování provedete takovou hromadu dotazů, je to dost katastrofální konstrukce. (Navíc pokud může záznamů existovat více, je lepší provést count(*) na úrovni databáze a nevracet zbytečně výsledky, ale nevím, jestli je později nechcete vypsat.)
Celkově tomu chybí nějaká abstrakce. OOP, MVC, další návrhové vzory..., ale to je dlouhá cesta.

Pro začátek se zkuste zamyslet, jak by mohla vypadat funkce, která tvoří abstrakci nad skloňováním. A jak by bylo hezčí si provést výpočty a pak to vypsat najednou.
Alphard
Profil
$recordsCount = mysql_num_rows(db_select("funkce"));

if ($recordsCount > 0)
{
  echo 'V notýsku '.(in_array($recordsCount, [2, 3, 4]) ? 'jsou' : 'je')." přesně <b>$recordsCount</b> ".($recordsCount <= 4 ? 'funkce' : 'funkcí');
}
else
{
  echo 'V notýsku není žádná funkce';
}
Jan Tvrdík
Profil
Šamanta:
Já bych v prvé řadě oddělil logiku od výpisu, tak jak to udělal Alphard v [#3] a pak bych pro výpis použil nějaký šablonovací systém, který je pro to vhodnější, takže ve výsledku by to vypadalo třeba takto:

notisek.php
$rowsCount = mysql_num_rows(db_select("funkce"));

renderTemplate('notisek.latte', ['rowsCount' => $rowsCount]);

notisek.latte
{if $rowsCount}
    V notýsku
    {if $rowsCount < 2 || $rowsCount > 5}je{else}jsou{/if}
    přesně <b>{$rowsCount}</b>
    {if $rowsCount < 5}funkce{else}funkcí{/if} :)
{else}
    V notýsku není žádná funkce :(
{/if}
Šamanta
Profil *
Děkuji mnohokrát za rady. Mám se tedy ještě hodně co učit. db_select vypadá takto

function db_select($table, $where, $select="*", $order, $limit){
  if(!empty($order)){
    $order = "ORDER BY ".$order;
  }
  if(!empty($where)){
    $where = "WHERE ".$where;
  }
  if(!empty($limit)){
    $limit = "LIMIT ".$limit;
  }
  $sql = mysql_query("SELECT ".$select." FROM ".$table." ".$where." ".$order." ".$limit) or die(mysql_error());
  return $sql;  
}

Nicméně to už jeď asi jedno, ani tato funkce nebude moc dobrá asi. Navíc by se mělo používat mysqli. Jaký byste mi, prosím, doporučili postup dál? Je vhodné například toto?
jenikkozak
Profil
Nejdůležitější je začít používat escapování.
Alphard
Profil
Šamanta:
Jaký byste mi, prosím, doporučili postup dál? Je vhodné například toto?
Nevím, jaké jsou vaše znalosti OOP, asi spíš žádné. Takže cesta dál vede k naučení se ho.
Dále k MVC. Obecně nejsem příznivcem nápadu radit začátečníkům, aby používali takto jednoduché „vlastní řešení“ frameworku. Ty články (obecně třeba ty na zdrojáku, ten odkázaný neznám) jsou dobré pro vysvětlení principů, ale ne pro praktické nasazení. Raději se seznamte s nějakým šířeji uznávaným frameworkem (Nette, Symfony).
drubez
Profil *
Ahoj,

já se rozhodně přikláním k oddělení logiky (PHP) od prezentace (nějaký šablonovací systém, třeba to zmíněné Latte). I kdyby´s neměl čas a chuť učit se šablonovací systém, stačí to oddělit alespoň "ručně" - tedy používat zvlášť soubory (např. s příponou phtml) jako šablony.

Pak bych popřemýšlel nad použitím nějakého databázového wrapperu, např. Dibi. Není potřeba se učit hned databázové frameworky, to by Tě mohlo zpočátku odradit (je to komplexní, naučení trvá).

Rozhodně souhlasím, že je dobré naučit se základy OOP. To zas až tak těžké není, ale dodržovat do důsledku návrhové vzory už těžší je. Každopádně je to dobrá průprava pro to, abys mohl začít používat nějaký framework. Rád bych ti z mnoha důvodů doporučil Nette, ale tam je to s tou dokumentací takové... všelijaké, takže jestli vládneš angličtinou, zkus třeba Yii.

Good luck & keep going ;)

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: