Grafika publishing webtip.cz grafika.cz mujiPod.cz mujmac.cz fotografovani.cz printing.cz builder.cz galerie
webtip.cz
adresář  | práce  | diskuse  | redakce  | inzerce
 
 


  ASP v praxi, 8. díl - Diskusní fórum
o autorovi 
poslat mailem 
tisknout článek 
aktuální rubrika 
Zvýšit atraktivitu vašich stránek se dá mnoha způsoby. Dnes vytvoříme diskusní fórum.

Liška Adam - 21.02.2003 - clanek - Rubrika: ASP

Pokud provozujete odborněji zaměřený e-zine, diskusní fórum bude pro vás přínosem minimálně ze dvou důvodů. Za prvé, návštěvníci budou moci diskutovat o tématu, na který je e-zine zaměřen, což zvýší atraktivitu vašeho webu. Z toho vyplývá i další pozitivum - návštěvníci nebudou přicházet jen kvůli článkům, ale i kvůli diskusnímu fóru - podívají se, co je nového apod.

Nyní přejděme k samotné tvorbě diskusního fóra. Bude se skládat z tabulky a čtyř souborů. Začneme tabulkou. Ta se bude jmenovat prispevky a bude mít následující strukturu (význam jednotlivých polí vysvětlím níže):

Název pole Datový typ
idprispevku automatické číslo - primární klíč
odpoved číslo
autor text
email text
predmet text
txt text
datum datum/čas
pocet číslo
posledni datum/čas

Diskusní fórum bude fungovat takto: návštěvník vloží příspěvek (pravděpodobně nějakou otázku - tomuto příspěvku říkejme například hlavní) - a na ní budou moci ostatní návštěvníci odpovídat. Funkce pole idprispevku je, myslím, jasná. Pole odpovedet má následující význam. Pokud návštěvník na nějaký příspěvek odpovídá, uloží se do něj idprispevku tohoto příspěvku. Při vložení nového příspěvku (tj. ten hlavní) je do pole odpovedet uložena hodnota nula. Pole autor, email, predmet a txt jsou již vlastní informace o autoru a textu příspěvku. Pole datum označuje datum vložení příspěvku. Poslední dvě pole, pocet a posledni, mají význam jen u příspěvku hlavního. První z nich udává počet odpovědí na tento příspěvek a druhé datum vložení poslední z nich.

Databázi máme vyřešenu, teď se zaměříme na soubory ASP. Prvním je soubor default.asp, jenž zobrazí všechny doposud vložené hlavní příspěvky (obrázek). K odpovědím se návštěvník dostane po vybrání jednoho z nich. SQL kód, který vybere hlavní soubory, je následující:

SELECT * FROM prispevky WHERE odpoved = 0 ORDER BY posledni DESC

Jak vidíte, přípěvky budeme řadit podle pole posledni - tzn., že první bude ten nejaktuálnější.

V této aplikaci nebudeme vytvářet žádnou DSN, místo toho využijeme druhého možného způsobu. Databázi vybereme zadáním její cesty. Má to výhodu v situacích, kdy nemáte možnost vytvořit DSN:

conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")

Takto vybereme databázi forum.mdb (databáze MS ACCESS), která se nachází ve stejné složce jako soubor ASP.

Na této stránce se bude nacházet také formulář na vložení nového příspěvku:

<form action="novy_prispevek.asp" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" maxlength="100" value="<%= request.querystring("predmet") %>"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols= "50"rows="10"><%= request.querystring("txt") %></textarea></td></tr>
<input type="hidden" name="novy" value="1">
</table>
<input type="submit" value="Odeslat">
</form>

Atribut value="..." u vstupních polí najde využití v případě, že návštěvník špatně (či spíše neúplně) vyplní formulář. Zpracovávající kód jej totiž vrátí a pole, která byla správně vyplněna, již nebude muset vyplňovat znovu. Protože zpracovávající kód pro formulář na odpověď a na vložení odpovědi se nachází v jednom souboru, musí poznat, jestli platí první možnost nebo druhá. Z tohoto důvodu použijeme skrytého pole nova, pomocí kterého tento soubor pozná, že jde o druhou možnost.

Celý zdrojový kód souboru default.asp je pak následující:

<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Server.MapPath("forum.mdb")
Set rs = conn.execute("SELECT * FROM prispevky WHERE odpoved = 0 " &_
"ORDER BY posledni DESC")
%>

<html>
<head>
<title>Forum</title>
<link rel="stylesheet" type="text/css" href="forum.css">
</head>
<body>
<table border="0" width="90%" align="center">
<tr>
<td width="100%" class='hlavicka'> Diskusní fórum</td>
</tr>
</table>
<table border="0" width="90%" align="center" class="pismo">
<%
' Vypsání všech "hlavních" příspěvků...
Do Until rs.eof
response.write "<tr><td width= '40%'><a href='prispevek.asp?id=" &_
rs("idprispevku") & "'>" & rs("predmet") & "</a></td>"
response.write "<td width='20%'>" & rs("autor") & "</td>"
response.write "<td width='10%'>" & rs("pocet") & "</td>"
response.write "<td align='right' width='20%'>" & rs("posledni") & "</td>"
response.write "</tr>"
rs.MoveNext
Loop
%>
</table>
<br><br>
<a name="novy"></a>
<%
' Pokud je formulář neúplně vyplněn...
If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p>
<% End If %>
<table border="0" width="90%" align="center">
<tr><td width="100%" class='hlavicka'> Přidat příspěvek</td></tr>
<tr>
<td>

<form action="novy_prispevek.asp" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" maxlength="100" value="<%= request.querystring("predmet") %>"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols= "50"rows="10"><%= request.querystring("txt") %></textarea></td></tr>
<input type="hidden" name="novy" value="ano">
</table>
<input type="submit" value="Odeslat">
</form>
</td>
</tr>
</table></body>
</html>

<%
conn.close
Set conn = Nothing
Set rs = Nothing
%>

V souborech budeme používat kaskádové styly. Uschováme je v souboru forum.css:

body { 
    font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

}

.hlavicka {
	background : #007000;
	color : White;
	font-weight : bold;
	font-size : small;
}

.pismo {
    font-size : 12px;	
}

.nadpis {
	font-size : 16px;
	font-style : normal;
	font-weight : bold;
}

.chyba {
	text-align : center;
	color : red;
}  

Odkaz u každého příspěvku směřuje na soubor prispevek.asp a předává mu parametr id, který zastupuje ID příspěvku. Nejdříve z databáze vybereme tento hlavní příspěvek a potom odpovědi na něj (řadíme je od nejdříve vloženého):

intID = Request.QueryString("id")
SELECT * FROM prispevky WHERE idprispevku = " & intID
SELECT * FROM prispevky WHERE odpoved = " & intID & " ORDER BY datum

Každou odpověď (i hlavní příspěvek) vložíme do rámečku (tabulky), která bude mít tento zdrojový kód:

<table border="0" width="90%" align="center" class="pismo">
<tr><td width="100%" class='hlavicka'> předmět</td></tr>
<tr><td>Autor: <a href="mailto:email">Autor</a><br>Datum: < EM> datum
<br><br>Text příspěvku </td></tr>
<tr><td align="right"><a href='#odpovedet'>Odpovědět</a></td></tr>
</table>

Samozřejmě nechybí formulář na odpověď k příspěvku. Zpracovávající kód pozná, na který příspěvek se odpovídá, podle parametru odp:

<a name="odpovedet"></a>
<% If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p>
<% End If %>
...
<form action= "novy_prispevek.asp?odp=<%= hlavni("idprispevku") %>" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" value="RE: <%= hlavni("predmet") %>" maxlength="100"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols="50" rows="10" ><%= request.querystring("txt") %></textarea></td></tr>
</table>
<input type="submit" value="Odeslat">
</form>

Celý zdrojový kód souboru prispevek.asp vypadá takto (obrázek):

<%
If len(Request.QueryString("id"))>0 Then
Set conn = Server.CreateObject("ADODB.Connection")
' Otevření spojení
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
intID = Request.QueryString("id")
Set hlavni = conn.execute("SELECT * FROM prispevky WHERE idprispevku = " & intID)
Set odp = conn.execute("SELECT * FROM prispevky WHERE odpoved = " & intID & " ORDER BY datum")
%>

<html>
<head>
<title>Diskusní fórum - <%= hlavni("predmet") %></title>
<link rel="stylesheet" type="text/css" href="forum.css">
</head>
<body>
<table border="0" width="90%" align="center" class="pismo">
<tr><td width= "100%"class='hlavicka'> <%= hlavni("predmet") %></td></tr>
<tr><td>Autor: <a href="mailto:<%= hlavni("email") %>"><%= hlavni("autor") %></a><br>Datum: <%= hlavni("datum") %><br><br><%= hlavni("txt") %></td></tr>
<tr><td align="right"><a href='#odpovedet'>Odpovědět</a></td></tr>
</table>
<br>
<%
'Vypsání všech odpovědí...
Do Until odp.eof
response.write "<table border='0' width='90%' align='center' class='pismo'>"
response.write "<tr><td width='100%' class='hlavicka'> " &_
odp("predmet") & "</td></tr>"
response.write "<tr><td>Autor: <a href='mailto:" & odp("email") &_
"'>" & odp("autor") & "</a><br>Datum: " & odp("datum") & "<br><br>" &_
odp("txt") & "</td></tr>"
response.write "<tr><td align='right'><a href='#odpovedet'>Odpovědět</a></td></tr>"
response.write "</table>"
odp.MoveNext
Loop
%>
<br><br>
<a name="odpovedet"></a>
<% If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p>
<% End If %>
<table border="0" width="90%" align="center">
<tr><td width="100%" class='hlavicka'> Odpovědět</td></tr>
<tr>
<td>
<form action="novy_prispevek.asp?odp=<%= hlavni("idprispevku") %>" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" value="RE: <%= hlavni("predmet") %>" maxlength="100"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols="50" rows="10" ><%= request.querystring("txt") %></textarea></td></tr>
</table>
<input type="submit" value="Odeslat">
</form>
</td>
</tr>
</table>
</body>
</html>

<%
conn.close
Set conn = Nothing
Set hlavni = Nothing
Set odp = Nothing
End If
%>

Nyní zbývá poslední soubor, novy_prispevek.asp, který vkládá nové příspěvky a odpovědi do databáze:

<%
response.buffer = true
response.expires = -1000

' Pokud se vkládá nový příspěvek...
If len(request.form("novy"))>0 Then
strJmeno = request.form("jmeno")
strEmail = request.form("email")
If len(strEmail) = 0 Then
strEmail="-"
End If
strPredmet = request.form("predmet")
strTxt = request.form("txt")
' Ověření správnosti dat...
If len(strJmeno)>0 AND len(strPredmet)>0 AND len(strTxt)>5 Then
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
dtmDatum = now()

' Vložení dat do databáze...
conn.execute("INSERT INTO prispevky(odpoved,autor,email,predmet,txt,datum,pocet,posledni)" & _
" VALUES (0,'" & strJmeno & "','" & strEmail & "','" & strPredmet & "','" & strTxt &_
"','" & dtmDatum & "', 0,'" & dtmDatum & "')")

conn.close
Set conn = Nothing
Set rs = Nothing

' Pokud jsou data špatně vložená...
Else
response.redirect "default.asp?jmeno=" & strJmeno & "&email=" & strEmail & "&predmet=" & strPredmet & _
"&txt=" & strTxt & "&chyba=1&#novy"
End If

response.redirect "default.asp"
End If

'*********************************************************

' Pokud se odpovídá...
If len(request.querystring("odp"))>0 Then
strJmeno = request.form("jmeno")
strEmail = request.form("email")
If len(strEmail) = 0 Then
strEmail="-"
End If
strPredmet = request.form("predmet")
strTxt = request.form("txt")
intOdp = request.querystring("odp")

' Ověření správnosti dat...
If len(strJmeno)>0 AND len(strPredmet)>0 AND len(strTxt)>0 Then
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
dtmDatum = now()

' Vložení odpovědi do databáze...
conn.execute("INSERT INTO prispevky(odpoved,autor,email,predmet,txt,datum) VALUES (" &_
intOdp & ", '" & strJmeno & "','" & strEmail & "','" & strPredmet & "','" & strTxt &_
"','" & dtmDatum & "')")
' Upravení data poslední odpovědi a připočtení jedničky u počtu odpovědí
' u "hlavního" příspěvku...
conn.execute("UPDATE prispevky SET pocet = pocet + 1, posledni = '" & dtmDatum &_
"' WHERE idprispevku = " & intOdp)

conn.close
Set conn = Nothing
Set rs = Nothing

' Pokud byla odpověď špatně zadaná...
Else
response.redirect "prispevek.asp?id=" & intOdp & "&jmeno=" & strJmeno & "&email=" &_
strEmail & "&txt=" & strTxt & "&chyba=1&#odpovedet"
End If
response.redirect "prispevek.asp?id=" & intOdp
End If

response.redirect "default.asp"
%>

Nyní je diskusní fórum již zcela funkční. Zde si můžete stáhnout zdrojové kódy všech souborů i s databází.

Liška Adam


Hodnocení článku: -1- -2- -3- -4- -5-  Aktuální hodnocení: 2.74 (2371)

Relevantní články
Žádné články


Diskuzní fórum
S.t.a.n.d.a10.01.2:07Chyba při Insertu ! pomozte
ferda16.05.14:33iis
Andrej08.04.14:30Nice ...
Dale27.02.18:22Bezpečnost
Adam Liška01.03.10:27 -RE: Bezpečnost
A0110.03.15:13 -RE: RE: Bezpečnost
Pokus29.07.9:04 LRE: RE: Bezpečnost
cbdave16.04.15:18  LRE: RE: RE: Bezpečnost
Pokus II29.07.9:05 LRE: Bezpečnost

 

  O vydavateli | Kontakt | Ceník reklamy | Ochrana osobních dat
©2002 Grafika Publishing. Všechna práva vyhrazena!