LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (76) - Zobrazujeme data na portále

Kterak použít funkce pro bufferování výstupu při zobrazení dat na PHP portále.

8.12.2004 15:00 | Petr Zajíc | Články autora | přečteno 34035×

Komerční sdělení: Pořádáme Kurzy PHP

Náš portál jsme minule zanechali ve stavu, kdy nešluo uspokojivě vyřešit zadání koncertu a přesun na stránku se seznamem koncertů kvůli problémům s hlavičkami. Naznačil jsem, že řešením bude zapnout bufferování výstupu. Pojďme to trochu rozebrat.

Funkce pro řízení výstupu

Normálně PHP funguje tak, že při zpracování skriptu, zjednodušeně řečeno:

  • Pošle hlavičky
  • Pošle html bloky kódu (v pořadí, jak jsou uvedeny)
  • Pošle výstupy funkce print a echo (v pořadí, jak jsou uvedeny)
  • Skončí

Toto chování lze změnit pomocí tzv. funkcí pro řízení výstupu. Mezi nejvýznamější patří funkce ob_start a ob_end_flush. Ob_start zapíná bufferování výstupu, ob_end_flush bufferování vypíná a odesílá nasyslený buffer prohlížeči. Pokud zavoláte funkci ob_start, je kód normálně prováděn, ale s následujícími změnami:

  • Jakékoli hlavičky jsou na serveru ukládány do bufferu
  • Jakýkoli výstup je ukládán do bufferu
  • Jakmile skript skončí, jsou odeslány nejprve všechny hlavičky, a potom všechen obsah

To má dvě výhody, obě poměrně podstatné. Jelikož mohou být jednotlivá volání funkcí print a echo celkem náročná na čas, vede obvykle bufferování výstupu ke zrychlení celé aplikace. A navíc, což je podstatné pro nás, bufferování výstupu rovněž umožní odeslat hlavičky nebo nastavit cookie proměnné i v případě, kdy už byl do bufferu odeslán nějaký výstup. Můžeme tedy směle veprostřed skriptu zavolat hlavičku s požadavkem na přesměrování na jinou stránku, a ono to bude fungovat! Nic nám tedy nebrání zabalit celý výstup do bufferování například hned úpravou souboru index.php:

<? ob_start();
  
session_start();
  require
"./func.php"; ?>
  <HTML>
    ... atd
  </HTML>
<?ob_end_flush();?>

Pozn.: Konkrétně odeslání hlavičky Location samozřejmě znamená, že je předchozí obsah bufferu bez použití zahozen, protože nová stránka je někde úplně jinde, ale v našem příkladu je to přesně to, co chceme. Uvědomme si, že je sice zahozen výstup, který by normálně dorazil do prohlížeče, ale programový kód ve skriptu se klasicky provedl. Provedlo se tedy i vložení řádku do databáze.

Z bufferováním výstupu se dají provádět kouzla - například lze nastavit, aby se před výstupem bufferu provedla nějaká funkce, buffer lze zahodit, upravit, prohlédnout, konvertovat mezi znakovými sadami a podobně. Jeho nejdůležitější použití však spočívá v tom, že se nemusíme úzkostlivě starat o odesílání hlaviček. Prohlédněte si celý  upravený soubor index.php.

Zobrazení koncertů

Vyřešili jsme přesměrování na stránku se seznamem koncertů. Pojďme tedy teď koncerty zobrazit. To je činnost, při níž se toho nenaučíme moc nového - probíralo se to v díle o zobrazení dat z databáze. Jediný zádrhel bude spočívat v tom, že musíme nějak elegantně vyřešit zobrazování českého data, koncerty seřadit (asi vzestupně) a zajistit jen zobrazení těch, které jsou v budoucnu.

Řazení zajistí klauzule ORDER BY v dotazu pro databázi. Zobrazení jen koncertů, které nastanou v budoucnosti zajistí rovněž dotaz, protože jazyk MySQL zná funkce pro  manipulaci s daty, které umí vrátit aktuální datum. Musíme však dát pozor na jednu věc - MySQL funkce NOW() vrací nejen datum, ale rovněž čas. To je pro naše účely poměrně nešikovné, protože ve sloupci datum máme uložen pouze údaj o datumové části dne, nikoli čas. Rovněž musíme dát pozor na to, že koncert konající se dnes by měl být na webu také zobrazen. Správný dotaz tedy bude využívat jinou funkci, a sice curdate():

select * from koncerty where datum >= curdate() order by datum

Při zobrazování česky formátovaného datumu máme na výběr z několika možností. Jeden způsob je využít formátovacích funkcí mysql, konkrétně funkce DATE_FORMAT. Tahle funkce se ale několikrát měnila, takže nikdo z hlavy neví, jak bude na té které verzi databáze fungovat. Proto využijeme druhou možnost, a to je zformátování data přímo pomocí PHP funkce date, resp. strftime. Rozdíl mezi nimi je ten, že strftime bere ohledy na národní prostředí. Se zobrazováním datumů je vůbec legrace, protože MySQL nám nevrátí číslo, ale řetězec. Z řetězce tedy nejprve musíme vyvěštit datum a to následně převést. Já používám následující funkci:

function ceskedatum ($datum)
{
    if (
$datum =="") return "";
    return
strftime("%d.%m.%Y",strtotime($datum));
}

Ani čas se nám asi nebude líbit zobrazený s přesností na vteřiny, naštěstí tady je pomoc snadná. Protože délka řetězce reprezentující čas je konstantní, stačí prostě zobrazit jen určitý počet znaků zleva a je to.

Myslet jako uživatel

Ještě jeden detail. Může se stát, že v databázi nebudu zadány žádné koncerty, nebo nebudou žádné koncerty v budoucnosti. Stránka by se v takovém případě zobrazila prázdná. To je formálně správně, jenomže by to mohlo uživatele mást. Nevěděl by, zda nejsou koncerty zadané, nebo zda je nějaká chyba na webu. Upravíme tedy skript tak, aby nám v takovém případě řekl, že dotaz sice proběhl, ale nevrátil žádné výsledky.

Postačí volat funkci mysql_num_rows() bezprostředně po volání výběrového dotazu. Jen pozor - je třeba pamatovat na to, že celá tabulka s výsledky se bude kreslit pouze v případě, že nějaké výsledky byly vráceny. Tudíž, i její záhlaví se musí konstruovat až v případě, kdy existuje nenulový počet výsledků, jinak vznikne nevalidní stránka. Kód stránky zobrazkoncert teď může vypadat nějak takto:

$vysledek=mysql_query("select * from koncerty where datum >= curdate() order by datum",$GLOBALS["link"]);
if (
mysql_num_rows($vysledek)==0)
  echo
"--  Není naplánován žádný koncert --";
else
{
  echo
"<TABLE>";
  while (
$zaznam=MySQL_Fetch_Array($vysledek)):
    
?>
    <TR>
      <TD><?echo ceskedatum($zaznam["datum"])?></TD>
      <TD><?echo substr($zaznam["cas"],0,strlen($zaznam["cas"])-3)?></TD>    
      <TD><?echo $zaznam["misto"]?></TD>    
    </TR>
    <?
  
endwhile;
  echo
"</TABLE>";
}

Změny na portálu

  • Změněný soubor func.php - funkce pro zobrazení českého data
  • Změněný soubor index.php - bufferování výstupu
  • Změněný soubor koncerty.php - dodělaný skript

Na současný stav projektu se můžete na našem webu podívat nebo si jej můžete stáhnout.

Pozn.: Aby Vám stažená verze fungovala na lokálním stroji, upravte si hodnotu konstant SQL_HOST, SQL_USERNAME, SQL_PASSWORD a SQL_DBNAME. Případně si je můžete včlenit do konfiguračního souboru podobně, jako jsem to udělal v souboru func.php.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

1.8.2017 7:32 / Cassidy
structural consultants

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

26.7.2017 21:12 / Jaromir Obr
Podminka

15.6.2017 9:34 / Ondřej Havlas
php,

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze