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ů):

Klepněte pro větší obrázek

Properties z phpMyAdmina

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

Klepněte pro větší obrázek

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:

Klepněte pro větší obrázek

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: Software, Programování, Adresa počítače, MySQL, Form, Autor příspěvku, Mys, Odpovídající tvar, Díl, Příspěvek, Email, Obsah, Plat, Echo


Určitě si přečtěte

Čekali jsme skoro šest let. Android Auto jede do Česka i na Slovensko
Lukáš Václavík
Android AutoNavigaceGoogle
Platby kartou se můžou rozšířit úplně všude. Jako terminál poslouží mobil
Lukáš Václavík
BankaPlacení mobilemNFC
Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

Google vymyslel technologii superpřesného GPS. Už ji podporuje Pixel 5 a dorazí i na ostatní telefony

** Kvalita GPS ve městech občas stojí za starou bačkoru ** Mohou za to odrazy signálu od okolních budov ** Google má jejich 3D model, a tak spolupracuje s výrobci GPS čipů

Jakub Čížek | 46

Jakub Čížek
NavigaceTechnologieGoogle
Messenger a Instagram přicházejí v Evropě o funkce. Kvůli nové směrnici o soukromí
Vladislav Kluska
EvropaInstagramFacebook Messenger
Finanční správa tento měsíc spustí Moje Daně. Přiznání má být hračka
Lukáš Václavík
eIdentitaČeskoeGovernment
Kudy proudí doprava? Na mapách můžete sledovat autobusy, vlaky, letadla i lodě

Kudy proudí doprava? Na mapách můžete sledovat autobusy, vlaky, letadla i lodě

Současná situace cestování zrovna dvakrát nepřeje, kvůli covidu můžeme jezdit leda tak prstem po mapě. A nebo můžeme prsty nechat volné a koukat, jak po mapě cestuje někdo jiný. Díky otevřeným datům dopravních či přepravních společností je to hračka.

Lukáš Václavík | 10

Lukáš Václavík
Doprava
Microsoft pořád myslí i na odpůrce předplatného. Letos vydá Office 2021
Lukáš Václavík
Microsoft OfficeMicrosoft
Bankovní identita bude jednotná. K České spořitelně, ČSOB a KB se připojí menší banky
Lukáš Václavík
Portál občanaBankaeGovernment