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

    1

    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.

    1 Příspěvěk v diskuzi

    Napsat komentář: Libor Šustek Zrušit odpověď