Diskusní fórum v PHP s využitím databáze – úvod

16. října 2001

Na předchozí seriál Diskusní fórum v PHP pro každého (bez použití databáze) nyní naváže další seriál: Diskusní fórum v PHP s použitím databáze. Toto diskusní fórum bude mít všechny funkce jako to minulé, a navíc přibude mnoho nových funkcí: zobrazení všech odpovědí najednou, odesílání odpovědí emailem, zobrazení data poslední odpovědi, podpora cookies, registrace uživatelů (včetně uploadu obrázků) atd.

Diskusní fórum a jeho struktura

Nejprve stručně k tomu, co bude naše diskusní fórum umět. Jednotlivá témata, tedy příspěvky na nejvyšší úrovni, budeme vypisovat po určitém počtu (standardně po 20) tak, že budou seřazena podle data poslední odpovědi. U každého tématu bude uvedeno několik údajů, včetně počtu odpovědí. Při výpisu odpovědí si uživatel bude moci vybrat ze dvou způsobů zobrazení. Buď se zobrazí pouze jedna odpověď a pod ní strom s dalšími odpověďmi, nebo všechny odpovědi najednou. Všechny údaje, které bude uživatel zadávat do formulářů, i způsob zobrazení si budeme pamatovat pomocí cookies. Uživatelé si budou moci svoje jméno (přezdívku) zaregistrovat a přidat ke svému jménu ještě malý obrázek.

Diskusní fórum bude tvořeno mnoha soubory – index.php (hlavní stránka – výpis témat), read.php (zobrazení příspěvků), new.php (přidávání příspěvků), form.php (formulář pro přidávání příspěvků), post.php (zpracování příspěvků), reg.php (registrace uživatelů), header.php (standardní hlavička), style.css (kaskádové styly), db.php (připojení k databázi), create_table.php (vytvoření databázových tabulek) a style.php (konfigurace diskusního fóra). V adresáři images budou obrázky uživatelů.

Soubor db.php

Tento soubor bude obsahovat informace o databázi a umožní připojení k databázi.

$server_name = "— server —"; // jméno databázového serveru
$db_name = "— db — "; // jméno databáze
MySQL_Connect($server_name) or die(‚Nepodařilo se připojit k MySQL databázi‘); // připojení k databázi
MySQL_Select_DB($db_name) or die(‚Nepodařila se otevřít databáze.‘); // výběr databáze

Vytvoření databázových tabulek (create_table.php)

Diskusní fórum bude tvořeno dvěma databázovými tabulkami – phorum a users. Do tabulky phorum se budou ukládat všechny diskusní příspěvky a v tabulce users budou informace o registrovaných uživatelích.

Tabulky si můžete vytvořit pomocí souboru create_table.php.

require "db.php"; //otevřeme databázi
$create_table = MySQL_Query("CREATE TABLE phorum (
id int PRIMARY KEY AUTO_INCREMENT,
thread int,
author varchar(50),
email varchar(50),
subject varchar(250),
body text,
date int(10),
latest int(10),
reply char(1))
") or die($query_error); //vytvoříme tabulku phorum

V tabulce phorum bude celkem 9 položek. Položka id bude obsahovat unikátní číslo příspěvku. Tato položka bude zároveň primárním klíčem a pomocí příkazu AUTO_INCREMENT zajistíme automatické navyšování hodnoty v položce id o 1. Další položka thread bude vyjadřovat vztah příspěvku k jiným příspěvkům. Pokud bude její hodnota 0, jedná se o hlavní téma. Pokud bude hodnota např. 15, jedná se o odpověď na příspěvek, který má id 15.

Položka author bude obsahovat autora příspěvku, položka email jeho emailovou adresu. V položce subject bude předmět příspěvku, v položce body text příspěvku, v položce date datum a čas vložení příspěvku a v položce latest datum a čas poslední odpovědi. Položka latest bude vyplněna pouze u témat. U obou posledně jmenovaných položek (date, latest) bude datum a čas vyjádřen jako počet sekund od 1. ledna 1970. A konečně poslední položka reply bude určovat, zda autor příspěvku chce případné odpovědi zasílat na svůj email. Jestliže bude obsahovat hodnotu ‚Y‘, odpověď se pošle. Pokud tam bude ‚N‘, odpověď se nepošle.

$create_table = MySQL_Query("CREATE TABLE users (
name varchar(50),
password varchar(20),
email varchar(50),
link varchar(20)
)") or die($query_error); //vytvoříme tabulku users

V tabulce users budou pouze 4 položky. Položka name bude obsahovat jméno uživatele, položka password jeho heslo a položka email jeho emailovou adresu. V položce link bude odkaz na uživatelův obrázek.

Soubor style.php

Tento soubor bude obsahovat základní konfiguraci diskusního fóra. Význam všech proměnných bude podrobně vysvětlen v dalších článcích.

$view_number = 20; //témata zobrazujeme po..
$table_bgcolor = ‚#ffffff‘; //první pozadí tabulky
$table_bgcolor_alt = ‚#f3f3f3‘; //druhé pozadí tabulky
$query_error = ‚Došlo k chybě při zpracování SQL dotazu v databázi.‘; //chybová hláška

Standardní hlavička (header.php)

Proměnná $view vyjadřuje způsob zobrazování odpovědí. Může obsahovat pouze dvě hodnoty – ‚single‘ nebo ‚all‘. ‚Single‘ znamená zobrazování odpovědí jednotlivě a ‚all‘ zobrazování všech odpovědí najednou. Aby si uživatel pokaždé, když navštíví diskusní fórum, nemusel přepínat na svůj oblíbený způsob zobrazení, použijeme cookies. Musíme však brát ohled i na uživatele, kteří mají cookies vypnuté, a proto budeme hodnotu proměnné $view předávat ve všech odkazech.

Pokud se jedná o první načtení a proměnná $view ještě není zinicializována, použijeme hodnotu z cookie s názvem cookie_view. Pokud i poté je hodnota proměnné $view prázdná (uživatel navštívil naše diskusní fórum poprvé nebo má vypnutou podporu cookies), použijeme ‚all‘. Poté pošleme aktuální cookie s platností 1 rok (vyjádřena jako počet sekund od 1. ledna 1970). Funkce Time() vrací počet sekund od 1. ledna 1970, k tomu přičteme 31536000 – počet sekund za 1 rok.

//pokud se jedná o první načtení (=není zinicializována proměnná $view), použijeme hodnotu z cookie
if(!IsSet($view)) $view = $cookie_view;
//pokud i poté je hodnota proměnné $view prázdná, použijeme "all"
if($view=="") $view="all";
//pošleme aktualní cookie s platností 1 rok
SetCookie("cookie_view", $view, Time()+31536000);
//zabraníme cachování
Header("Cache-Control: no-cache");
Header("Pragma: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<link href="style.css" rel="stylesheet" type="text/css">
<title>DB FORUM ver 1.0</title>
</head>
<body>
<h1 align="center">DB FORUM 1.0 </h1>
<table width="<?echo $width?>%" border="0" cellspacing="0" cellpadding="3" align="center"><tr>
<td class="menu"><a href="new.php?view=<?echo $view?>">Nové téma</a>   
|   <a href="index.php?view=<?echo $view?>">Úvodní strana</a>

Předchozí část snad žádný komentář nepotřebuje. Proměnná $PHP_SELF obsahuje jméno právě prováděného skriptu. Pokud v ní najdeme ‚read.php‘, což je soubor zobrazující příspěvky, vytvoříme odkaz umožňující změnu zobrazení příspěvků.

<?
//pokud prohlížíme jakýkoli příspěvek, vypíšeme odkaz umožňující změnu zobrazení
if (EregI("read.php", $PHP_SELF)):
    echo ‚   |   <a href="read.php?id=‘ . $id;
    if ($view!="all")
        echo ‚&view=all">Zobrazit vše‘;
    else
        echo ‚&view=single">Zobrazit jednotlivě‘;
    echo ‚</a>‘;
endif;
?>
   |   <a href="reg.php">Registrace</a>
</td>
</tr></table>

Tímto končí nutný úvod do vytváření diskusního fóra. Příště se dozvíte, jak provést výpis hlavních témat.

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ší

8 komentářů

  1. tomas

    Srp 25, 2009 v 9:34

    mam otazocku. Stiahol som kompletny zdrojovy kod tohto diskusneho fora. Subor db.php som musel upravit z dovodu, ze mi tam trebalo aj pass zadat do databazi takto vyzera teraz:

    pomocou create_table.php mi bez komplikacii vytvorilo tabulku a databaze, no ked vypisem taky prispevok a dam odoslat nic sa nestane. Vycisti mi bunky ako po tlacidle RESET ale novu temu neprida. Ani do databazy. To iste robi aj pri registracii, nic nevypise nic neprida. Neviete co moze byt, nic ine okrem db.php som este nezmenil.

    Odpovědět
  2. tomas

    Srp 25, 2009 v 9:36

    php
    $server = „localhost“;
    $user = „root“;
    $heslo = „bdtbdt“;
    $name = „phorum“;

    @MySQL_Connect($server, $user, $heslo) or die(‚Nepodařilo se připojit k MySQL databázi‘); // připojení k databázi
    @MySQL_Select_DB($name) or die(‚Nepodařila se otevřít databáze.‘);

    Odpovědět
  3. Irbiso

    Bře 20, 2010 v 9:26

    Podívej se na datum vytvoření.“16. 10. 2001″ Je to psané v již nepodporované verzi PHP!

    Odpovědět
  4. ssda

    Lis 9, 2010 v 15:02

    $server = „localhost“;
    $user = „root“;
    $heslo = „bdtbdt“;
    $name = „phorum“;

    Odpovědět
  5. edgebracarpew

    Kvě 4, 2012 v 18:21

    Лаки и краски „Senta”.Весь спектр продукции „Senta”,фирмы „Sentapol”(Турция).
    Полиуретановый яхтный лак, паркетный лак, нитро-целлулоидный лак-заполнитель, алкидные эмали, антикоррозийная краска

    Odpovědět
  6. Agostedge

    Led 7, 2013 v 4:40

    锘縋eople everywhere over the today climate fat looking at a number of different ways to try and save your hard earned money and electricity. They search as well as for lighting in order for you that do not among the more consume less an outlet,but also save their your hard earned money Dimmable LED light – weight bulbs pounds going to be the many of the new major the most recent breakthrough as part of your lighting industry. The dimmable led light bulbs have taken the place relating to ancient fashioned light – weight bulbs all of these consume significant energy Dimmable LED light and portable bulbs can be the case that can be used all over the any fitting. They can be the case which can be used all over the both the domestic and commercial ambitions Dimmable LED light – weight bulbs bear in mind ach and every homemade solar power system efficient lightweight, durable and a considerable ways lasting that can also be the

    Odpovědět
  7. fdozmjmnhbn

    Led 15, 2013 v 14:50

    Welcome To Buy Our Renow

    Odpovědět
  8. Anonym

    Dub 2, 2014 v 15:13

    fda

    Odpovědět

Napsat komentář: tomas Zrušit odpověď na komentář

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