PHP, struktura webu a URL

Můj brácha se rozhodl naučit PHP, aby nám mohl být ve firmě trochu užitečnější (doteď dělal jen občasné grafické práce). Vypadá to pro vaši představu asi tak, že přebíhá od knížky k počítači a nazpět a neustále mě vyrušuje od práce svými dotazy.

Důsledkem jeho sebevzdělávacího procesu jsou dvě věci:

  1. Rozšíření našeho interního dokumentu Impala Design Coding Guidelines o spoustu nových pravidel, zakazujících a upravujících některé postupy, které by mě v životě nenapadlo nějak kodifikovat.
  2. Při vysvětlování si musím každou chvíli utřiďovat myšlenky a racionálně mu vysvětlovat a obhajovat postupy, které považuju za správné téměř instinktivně. Brácha pochopitelně nemá takovou intuici ani praxi, aby vše viděl, a tak to musí vstřebat pomocí logických argumentů.

Proč to sem celé píšu? Když totiž občas narazím při vysvětlování na něco zajímavého, zkusím o tom napsat pár řádků sem. Můj bratr určitě není jediný, kdo se učí PHP, už zvládnul syntaxi a princip jazyka, ale potřebuje občas ukázat, která z několika možností jak něco udělat je správná a proč.


Dneska se podíváme je jednoduchý problém: Představte si, že chcete udělat stránky s texty písniček od Nirvany. Rozhodnete se rozdělit je do podstránek podle alb a moudře usoudíte, že jejich samotný obsah stránek bude rozumné načítat z nějakého externího zdroje (soubor, databáze, apod.). Celé vypsání obsahu stránky zabalíte do jedné funkce:

writeAlbum($name);

Parametr $name je identifikátor alba, třeba "bleach" nebo "in-utero". Nebudeme se tu zabývat tím, jak je funkce writeAlbum vevnitř udělaná, to je teď úplně jedno. Jde nám o to, jak navrhnout strukturu webu.

Jsou v podstatě dva způsoby, jak to udělat:

1. Protože kód pro vypsání textů písniček alba je pro všechna alba stejný, dá se použít jen jeden soubor (nazvaný třeba album.php) a předávat mu parametr s názvem alba (takže bude volán třeba takto: album.php?album=incestiside). Obsah souboru bude tedy vypadat zhruba následovně:

<?
  if (isset($_GET["album"])) {
    if (albumExists($_GET["album"])) {
      writeAlbum($_GET["album"])
    } else {
      trigger_error("Neexistující album.", E_USER_ERROR);
    }
  } else {
    trigger_error("Není zadáno album.", E_USER_ERROR);
  }
?>

(Předpokládám, že funkce albumExists se zeptá externího zdroje dat, zda album s daným názvem opravdu existuje.)

2. Druhou možností je věnovat kažému albu vlastní stránku (např. bleach.php, in-utero.php,...). Kód by pak vypadal asi takto:

bleach.php

<?
  writeAlbum("bleach");
?>

in-utero.php

<?
  writeAlbum("in-utero");
?>

Jak je vidět, kód je podstatně kratší, leč v každém souboru jiný. To se dá ale napravit – pozorní čtenáři si jistě všimli korelace mezi názvem skriptu a parametrem předávaným funkci writeAlbum. Pokud máte rozumné identifikátory alb, jde tento parametr generovat přímo ze jména skriptu, ve kterém funkce je volána. Stačí vzít proměnnou $_SERVER["SCRIPT_NAME"] a například pomocí regulárních výrazů z ní vytáhnout název alba. Konkrétní provedení tu vypisovat nebudu a přenechávám ho čtenáři jako dobrovolný domácí úkol.

Výsledkem je, že ve všech souborech je úplně identický kód a stačí ho jen několikrát rozkopírovat.

Kdy použít který způsob?

Nyní přejděme od konkrétního příkladu s alby Nirvany, který jsem zvolil pro snadnější vysvětlování, do trochu obecnější rovniny a položme si otázku, kdy bychom měli použít který způsob.

Pokud je počet položek malý (řádově desítky) a nebudou se příliš často měnit (co je příliš často záleží na lenosti programátora), je jednoznačně lepší druhý způsob – tedy samostatné stránky. Náklady na údržbu nejsou nijak veliké a návštěvníci i vyhledavače velmi ocení jednodušší tvar URL.

Pokud je položek příliš, nebo se každou chvíli mění, začínají převládat výhody druhého způsobu – stačí upravit údaje o datech jen na jednom místě (výše zmiňovaný externí zdroj dat) a není třeba hýbat se soubory.

Docela mě překvapuje, že dost lidí zřejmě nikdy podobnou úvahu nevedlo a používají URL ve zbytečně komplikovaném tvaru i tam, kde to není třeba – viz třeba stránky Aničky. Ale to už je věc každého, jak si dělá svůj web a jaké jsou jeho priority.

Poznámka první: Jak důvtipný čtenář možná vytušil, můj bratr opravdu tvoří stránky o skupině Nirvana. Protože je v době mezi napsáním tohoto článku a jeho publikací už stačil dodělat a zveřejnit, přikládám odkaz na ně.

Poznámka druhá (pro pokročilé čtenáře): Ano, vím o existenci mod_rewrite. Pokud vy taky, pak tento článek nebyl určen pro vás :-)