Prakticky s MySQL - 6. díl

Dnes začneme práci na webové aplikaci pod záštitou databázového jazyka MySQL a skriptovacího fenoménu PHP. Nejprve si vytvoříme vlastní diskusní fórum …

Diskusní fórum

Na úvod si musíme předně ujasnit co chceme vyvíjet. V našem případě to bude diskusní fórum, co si pod tímto slovním spojením lze představit? V zásadě lze vymezit několik základních nejrozšířenějších druhů webových aplikací, mezi něž spolu s diskusí patří třeba chat, seznamka, pohlednicovka, mail, či vyhledávač. Takováto aplikace pak může být provozována v rámci stránka jako unikát, nebo může být službou od „někoho či něčeho“ jiného.

Oním poskytovatelem služby většinou bývá zajištěna patřičná úroveň služby, její správa a rozvoj (a služba nezřídka bývá i bezplatná). Na druhou stranu i přes moderní trend poskytování služeb i v rámci systému distribuce .net se stále s oblibou využívá možnosti odlišit se od ostatních svou vlastní troškou do mlýna a proto si naštěstí i tzv. tuctové aplikace pro web vyvíjí někdo sám. Výsledný produkt však s sebou nese také obecně pestré kvalitativní rozdíly a to platí i pro diskuse.

Představme si tedy na začátek nejjednodušší možnou diskusi. Obecně se jí říká kniha návštěv, umí pouze zapisovat příspěvky od návštěvníků a vypisovat je, ve svém lepším provedení je tvořena stránkami s listováním. O něco složitější už je varianta otázky a odpovědi, kdy uživatelé mohou zadávat otázky a jiní akreditovaní přispívatelé na ně zase odpovídají. Obě tyto varianty se hodí pro určité typy stránek. Další možností ovšem je už samotná diskuse v pravém slova smyslu, kdy uživatelé mohou přímo odpovídat konkrétní příspěvky a tyto odpovědi jsou poté nějak odlišeny. Opět můžeme vidět několik způsobů jak toto řešit, začínat jména příspěvků kumulováním RE:, odsazovat odpovědi na příspěvky pod ně samotné. Oblíbenou variantou je i schématický přehled příspěvků a odpovědí na ně s následným vypsáním těch zvolených uživatelem. A samozřejmě tu máme diskuse s více oddělenými diskusními tématy.

To je jen jeden pohled na diskuse, pak tu máme i kvantitu uchovávaných dat – jméno a email autora příspěvku, jeho webová stránka, datum a čas vložení příspěvku, IP adresa počítače, z něhož se přispívalo a další. Co se týče funkcí diskusí, lze jich najít řadu od diskutování mezi registrovanými uživateli, kdy by nemělo dojít k falšování jmen autorů příspěvků, přes možnost některých uživatelů editovat a mazat příspěvky po posílání odpovědí na náš příspěvek na naši emailovou adresu. Z tohoto výčtu vyplývá, že každý si může nechat ušít diskusi takříkajíc namíru. Jakou ale budeme vyvíjet my v našem seriálu?

Naše diskuse

V rámci té naší diskuse bude její vývoj probíhat postupně od té nejjednodušší formy až k té konečné podobě, v níž budeme mít možnost tvořit vlastní místnosti a udělovat oprávnění uživatelům. Díky tomuto postupu vytvoříme hned několik modelových variant diskusí, které pak budete moci použít dle libosti. První z nich tedy bude „základní model“, totiž obyčejná kniha návštěv se systém zapiš a vypiš data.

Návrh tabulky

Základním kamenem u každého databázově orientovaného programu je správná analýza problému a návrh SQL tabulky do nejoptimálnější podoby. Ač tento seriál není o analytice SQL, není od věci připomenout pravidla duplicity položek v tabulkách a principy relací mezi nimi. Představme si, že bychom měli tabulku se jménem a příjmením zaměstnance, tabulku platů zaměstnanců dle jejich tříd a měli bychom tyto data propojit.

Pochopitelně by vytvoření další tabulky s identifikátorem zaměstnance a jeho platem nebylo nikdy tak účinné jako přidání sloupce s úrovní zaměstnance do naší první tabulky, kdy tento sloupec by nesl pouze identifikátor třídy, kterou zaměstnanec vlastní, a podle toho by se z tabulky tříd načetl plat zaměstnance. Změny v takovýchto tabulkách by se pak dělaly snadno.

Obecná poučka říká, že tabulky by se měly optimalizovat až na pomyslné maximum, protože na jejich výkonnosti závisí běh celé naší databázové aplikace. Pokud jde o naši první diskusi, použijeme v ní pouze jednu tabulku se záznamy příspěvků. Uložíme do ní tedy jméno a email autora příspěvku, sám příspěvek a datum a čas jeho vložení do systému. Tabulka tedy bude vypadat takto (na začátek třeba omezíme délky řetězců na 255 znaků):

Properties z phpMyAdmina

Pokud pak vložíme do tabulky záznam, bude vypadat takto:

Select z phpMyAdmina

Jak vytvořit tabulku

Pokud bychom si chtěli vytvořit záložní skript, kterým bychom tuto tabulku mohli vždy vytvořit, vypadal by asi takto:

Zaloha.php

<?
@$tvorbatabulky=MySQL_Query("Create table Diskuse(
ID int not null primary key auto_increment,
Obsah varchar(255),
Autor varchar(255),
Email varchar(255),
Datum varchar(255))");
?>

Nyní si tuto tvorbu krátce shrneme, nejprve vytvoříme unikátní identifikační číslo, jehož hodnota pak bude narůstat automaticky s každým vkládaným záznamem. Další položky jsou prozatím jednoduchým textem do 255 znaků, ale postupně i toto propracujeme. A naše tabulka se jmenuje Diskuse:).

Vlozit.htm

Pro vkládání příspěvků do databáze si musíme vytvořit html dokument, formulář, kterým se budou odesílat data, mohl by vypadat třeba následovně:

<form action="pridejprispevek.php" name=form id=form onsubmit="return validate(this)" style="font-size:12">
<table align=center>

<tr>
<td style="font-size:12">
<b>Autor:</b>
</td>
<td><input name="Autor" value="" style="color:maroon">
</td>
</tr>

<tr>
<td style="font-size:12">
<b>Email:</b>
</td>
<td>
<input name="Email" value="" style="color:maroon">
</td>
</tr>

<tr>
<td style="font-size:12">
<b>Příspěvek:</b>
</td>
<td>
<textarea name=Obsah cols=40 rows=7 style="color:maroon"> </textarea>
</td>
</tr>

<tr>
<td align=center colspan=2>
<input type=submit value="Odeslat" class="submit">
</td>
</tr>
</table>
</form>

Jedná se o obyčejný formulář, který doplníme o kontrolu hodnot při odeslání funkcí javascriptu validate(), tu jsme vložili jako volanou při odeslání formuláře při jeho definici. Prozatím nám postačí kontrola tvaru emailové adresy.

<script>

function validate(form){
if(form.Email.value==""){
return true;
}


else if(window.RegExp){
re = new RegExp("^[^@]+@[^.]+\..+$");

if(!re.test(form.Email.value)){
alert("Email odesílatele namá odpovídající tvar!");
form.Email.focus();
return false;
}
}


}
</script>

Výsledný dokument by mohl vypadat třeba takto:

Pridejprispevek.php

Pro uložení příspěvku do databáze použijeme jednoduchý skript rozšířený o kontrolu přijatých dat a filtr html tagů. Na závěr skriptu pouze přesměrujeme skript na výpis příspěvků ve formě skriptu diskuse.php. Celý výpis pak proběhne tiskem CSS styly upravených tabulek, pro každý příspěvek vytvoříme jednu.:

<?
/*připojení k databázi*/
$Datum=Date("d.m.Y - H:i");

//if(Ereg("<",$Obsah)):
$Obsah=EReg_Replace("<","<",$Obsah);
//endif;

//if(Ereg(">",$Obsah)):
$Obsah=EReg_Replace(">",">",$Obsah);
//endif;

//if(Ereg("<",$Autor)):
$Autor=EReg_Replace("<","<",$Autor);
//endif;

//if(Ereg(">",$Autor)):
$Autor=EReg_Replace(">",">",$Autor);
//endif;

if($Autor==""):
$Autor="Anonym";
endif;

if(Obsah!=""):
$query=MySQL_Query("Insert into Diskuse values(null,`$Obsah`,`$Autor`,`$Email`,`$Datum`)");

endif;

$path = SubStr($SCRIPT_NAME, 0, StrRPos($SCRIPT_NAME, "/")).
"/diskuse.php";
Header("Location: http://$SERVER_NAME:$SERVER_PORT$path");
?>

Výpis příspěvků

Příspěvky z diskuse vypíšeme opět snadno, následující komentovaný skript je toho důkazem:

<center>
<h3>Diskuse</h3>
<?
/*připojení k databázi*/

$query=MySQL_Query(“Select * from Diskuse order by ID DESC”); /*SQL dotaz, který vybere všechno z tabulky*/

while($fetch=MySQL_Fetch_Array($query)): /*zpracování proměnných podmínkovým cyklem*/

$ID=$fetch["ID"]; /*přiřazení proměnných z pole*/
$Obsah=$fetch["Obsah"];
$Autor=$fetch["Autor"];
$Email=$fetch["Email"];
$Datum=$fetch["Datum"];

echo "<table width=100% border=1 style=`border-width:1;border-color:maroon;font-size:12`><tr><td align=left valign=center style=`border-width:0;border-color:maroon;`>";

if($Email!=""):
echo"<a href=`mailto:".$Email."`>".$Autor."</a>";
else:
echo "<b>".$Autor."</b>";
endif;
/*pokud je email nenulový, je jméno autora odkazem*/
echo "</td><td align=right valign=center style=`border-width:0;border-color:maroon;`><small>".$Datum."</small></tr><tr><td colspan=2 align=center valign=center style=`border-width:0;border-color:maroon;`>".$Obsah."</td></tr></table><br>";

endwhile;
?>

Příští pokračování

Příští týden se podíváme dále do hlubin tvorby diskusí a budeme naši diskusi systematicky doplňovat a rozšiřovat o možnosti, jenž jsem nastínil v úvodu …

Diskuze (20) Další článek: Zajímavý benchmark z Japonska

Témata článku: , , , , , , , , , , , , , , ,