Diskusní fórum v PHP s využitím databáze – výpis témat

18. října 2001

Po úvodním seznámení s diskusním fórem si dnes povíme, jak zobrazit úvodní stránku, tedy seznam témat. Procvičíme si práci s databází, funkcemi a datem. Také se dozvíte, jak vytvořit velmi často používaný efekt – střídání barevného pozadí tabulky.

Úvodní stránka (index.php)

Nejprve si vytvoříme tabulku se 4 sloupečky – Téma, Autor, Poslední Odpověď, Počet odpovědí.

<?
$width=90;                   //šířka tabulky
require "db.php";           //otevřeme databázi
require "style.php";        //načteme soubor s konfigurací
require "header.php";    //vložíme hlavičku
?>
<!– TABULKA, VE KTERÉ VYPÍŠEME SEZNAM TÉMAT –>
    
<table width="90%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="Black"><tr><td>
<table width="100%" border="0" cellspacing="1" cellpadding="3" align="center">
 <tr bgcolor="#4A4A4A">
    <td class="tableheading">Téma</td>
    <td width="15%" class="tableheading">Autor</td>
    <td width="20%" align="center" class="tableheading">Poslední odpověď</td>
    <td width="10%" align="center" class="tableheading">Odpovědí</td>
  </tr>

Poté si definujeme funkci Count_Answers($topic), která spočítá počet odpovědí na dané téma. V parametru funkce předáváme ‚id‘ právě zpracovávaného příspěvku. Nejprve vybereme a spočítáme přímé odpovědi, následně procházíme a pomocí rekurze přičítáme nepřímé odpovědi (odpovědi na odpovědi). Funkce vrací celkový počet odpovědí na dané téma.

//tato fce počítá počet odpovědí na dané téma, v parametru předáváme právě zpracovávaný příspěvek (téma)
function Count_Answers($topic)
 {
    $count = 0;         //předpokládáme žádnou odpověď
    //vybíráme přímé odpovědi
    $answer = MySQL_Query("SELECT id FROM phorum WHERE thread = $topic") or die($query_error);
    $count = MySQL_Num_Rows($answer);      //spočítáme přímé odpovědi
    //procházíme nepřímé odpovědi a přičítáme
    while($entry = MySQL_Fetch_Array($answer)) $count += Count_Answers($entry["id"]);
    return $count;     //vrať počet odpovědí
 }

Následně z databáze vybereme všechna témata (thread = 0), spočítáme je a do proměnné $page_number uložíme počet stran, na kterých se témata eventuelně zobrazí (počet témat vydělíme počtem příspěvků na jedné straně a zaokrouhlíme nahoru). Pomocí proměnné $page, která udává číslo zobrazované stránky, spočítáme kolikáté téma se vypíše jako první. Následně příslušná témata vybereme z databáze. ‚ORDER BY latest DESC‘ znamená, že témata budou seřazena podle data poslední odpovědi, a to sestupně. Pomocí ‚LIMIT $start, $view_number‘ omezíme výběr tak, že vybereme 20 (standardní hodnota $view_number) témat, počínaje tématem $start.

//vybíráme témata
$main_topic = MySQL_Query("SELECT id FROM phorum WHERE thread = 0 ") or die($query_error);
$topics_number = MySQL_Num_Rows($main_topic);        //počet témat
$page_number = Ceil($topics_number/$view_number);    //počet stran, na kterých se témata zobrazí
$start = $page*$view_number;    //první téma, které zobrazíme
//vybíráme hlavní témata – seřazena podle času poslední odpovědi
$main_topic = MySQL_Query("SELECT id, author, email, subject, body, latest FROM phorum WHERE thread = 0 ORDER BY latest DESC LIMIT $start, $view_number") or die($query_error);

Nyní můžeme přistoupit k samotnému vypisování témat. U tabulky budeme střídat barevné pozadí řádků, což je dostatečně okomentováno ve zdrojovém kódu.

//CYKLEM VYPÍŠEME SEZNAM TÉMAT
while ($entry = MySQL_Fetch_Array($main_topic)):
    //následující podmínka umožní střídat barevné pozadí tabulky
    //pokud je $y dělitelné dvěma (sudé), použijeme první pozadí, jinak druhé, a následně $y o 1 zvýšíme
    if ($y%2==0)
        echo ‚<tr bgcolor="‘ . $table_bgcolor . ‚">‘;
    else
        echo ‚<tr bgcolor="‘ . $table_bgcolor_alt . ‚">‘;
    $y++;

Funkce Date(), kterou velmi dobře znáte, slouží k formátování času a data. Standardně tato funkce pracuje s aktuálním časem. Jako druhý parametr však můžeme uvést i jiný čas, a to jako počet sekund od 1. ledna 1970. Toho využijeme, když budeme chtít vypsat upozornění, že na dané téma byla přidána odpověď dnes nebo včera. Pokud se datum poslední odpovědi („$entry[„latest“]) rovná aktuálnímu datu, vypíšeme ‚dnes’. Stejně postupujeme i v druhé podmínce. Funkce Time() vrací aktuální počet sekund od 1. ledna 1970, 86400 je počet sekund za jeden den. Pokud se tedy datum poslední odpovědi rovná včerejšímu datu (Time()-86400) vypíšeme ‚včera‘.

    //TÉMA
    echo ‚<td class="table"><a title="‘. $entry["body"] . ‚" href="read.php?id=‘ . $entry["id"] . ‚&view=‘ . $view . ‚">‘ . $entry["subject"]. ‚</a>‘;
        //pokud byla poslední odpověď na zpracovávané téma uložena dnes nebo včera, vypíšeme upozornění
        if(Date("dmY", $entry["latest"])==Date("dmY")) echo ‚ <font class="smallred">dnes</font>‘;
        if(Date("dmY", $entry["latest"])==Date("dmY", Time()-86400)) echo ‚ <font class="smallbrown">včera</font>‘;
    echo ‚</td>‘;

V dalších sloupečcích bude autor, datum a čas poslední odpovědi a počet odpovědí na dané téma.

    //AUTOR – pokud zadal autor příspěvku svůj email, vytvoříme odkaz
    echo ‚<td width="25%" class="table">‘;
    if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘;
    echo $entry["author"];
    if ($entry["email"]!="") echo ‚</a>‘;
    echo ‚</td>‘;
    //POSLEDNÍ ODPOVĚĎ – počet sekund od 1. 1. 1970 převedeme na srozumitelnější formát
    echo ‚<td width="10%" align="center" class="table">‘ . Date("d. m. Y, H:i:s", $entry["latest"]) . ‚</td>‘;
    //POČET ODPOVĚDÍ – použijeme dříve definovanou funkci
    echo ‚<td width="10%" align="center" class="table">‘ . Count_Answers($entry["id"]) . ‚</td>‘;
echo ‚</tr>‘;
endwhile;
MySQL_Close();    //zavřeme databázi
?>
</table></td></tr></table>

Pod tabulku se seznamem témat umístíme ještě tabulku, ve které bude celkový počet témat ($topics_number) a odkazy na starší a novější témata. Vše je dostatečně okomentováno ve zdrojovém kódu, a navíc problematikou výpisu příspěvků po určitém počtu jsme se zabývali již v předchozích seriálech.

                <!– TABULKA, VE KTERÉ JE POČET TÉMAT, ODKAZY NA STARŠÍ A NOVĚJŠÍ TÉMATA –>        
<table width="90%" border="0" cellspacing="0" cellpadding="3" align="center"><tr>
    <td align="right" class="menu">
    <?
        echo ‚Celkem zde je <b>‘ . $topics_number . ‚</b> témat.   ‚;
        //pokud nejsme na první stránce vypíšeme odkaz na novější témata
        if ($page!=0) echo ‚<a href="index.php?page=‘ . ($page-1) . ‚&view=‘ . $view . ‚">Novější témata</a>‘;
        //pokud existuji starši témata, vypíšeme odkaz
        if ($page_number>$page+1) echo ‚   <a href="index.php?page=‘ . ($page+1) . ‚&view=‘ . $view . ‚">Starší témata</a>‘;
    ?>
    </td>
</tr></table>
</body></html>

Tímto dnešní díl končí, příště se podíváme na detailní zobrazování témat a odpovědí.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Libor Šustek

    Úno 23, 2011 v 21:09

    Chybí mi proměnná $page, kde ji definuji?

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *