V tomto diele sa dozviete ako zasielať témy do nášho už takmer podareného fóra. Článok nadvezuje na minulý diel, kde ste sa naučili vypisovať témy.
V tomto diele si fórum upravíme, tak aby nám bezpečne zasielalo témy od návštevníkov fóra. Všetko čo budeme upravovať je len CSS, bottom.php, index.php a najviac bude zasiahnutý súbor functions.php. Začnem asi tým najľahším a to bude CSS. Celá úprava bude viac menej kozmetická.
.bottom { text-align:center; }
.tema { background:#efefef; border:1px solid #cccccc; margin-bottom:0.2em; padding:0.2em; }
.tema_obsah { background:#ffffff; padding:0.5em; }
.css_menu { height:3em; }
.menu a { float:left; display:block; background:#efefef; color:#000000; border:1px solid #cccccc; font-weight:bold; padding:0.5em; }
.menu a:hover { float:left; display:block; background:#cccccc; color:#ffffff; border:1px solid #efefef; font-weight:bold; padding:0.5em; }
Vyššie uvedené CSS neni celé ako ste si určite všimli. Treba v ňom zameniť len veci,
ktoré som uviedol tu. Nové zápisy sú triedy .bottom, .css_menu,
.menu.
Súbor bottom.php sa tiež zmenil len kozmeticky a to znamená, že sme len zarovnali
na stred pätičku.
<div class="bottom"> ©2005 PaBi3.com | Všetky práva vyhradené </div> </body> </html>Teraz bude nasledovať celý zmenený súbor functions.php. Boli pridané nové funkcie. Na vytvorenie témy, na opravenie zápisu do databázy a na zobrazenie horizontálneho menu. Popis funkcií nájdete v komentároch, ktoré sú v zdrojovom kóde. Ešte predtým chcem upozorniť na to, že radšej sem dám celý zdrojový kód functions.php, pretože boli trochu poupravené aj ostatné funkcie aby sa mohlo zobrazovať horizontálne menu.
<? #functions.php
// funkcia, ktorá bude vytvárať menu pre fórum
function menu(){
echo " <div class="css_menu">";
echo" <div class="menu">n";
echo" <a href="?tema" title="Vytvorenie novej témy">Vytvorenie novej témy</a>n";
echo" </div>n";
echo" </div>n";
}
// funkcia, ktorá opraví zápis do databázy
function oprav($data){
global $dbc;
if(ini_get('magic_quotes_gpc')){
$data = stripslashes($data);
}
return mysql_real_escape_string($data, $dbc);
}
// funkcia pre vytvorenie témy
function vytvor_temu(){
$error = NULL;
if(isset($_POST[odoslat])){
if(empty($_POST[tema])){
$tema = FALSE;
$error .= "Nezadali ste meno témy!<br />n";
} else {
$tema = oprav(htmlspecialchars($_POST[tema]));
}
if(empty($_POST[autor])){
$autor = FALSE;
$error .= "Nezadali ste autora témy!<br />n";
} else {
$autor = oprav(htmlspecialchars($_POST[autor]));
}
if(empty($_POST[email])){
$email = "@";
} else {
$email = oprav(htmlspecialchars($_POST[email]));
}
if(empty($_POST[obsah])){
$obsah = FALSE;
$error .= "Nezadali ste obsah témy!<br />n";
} else {
$obsah = oprav(nl2br(htmlspecialchars($_POST[obsah])));
}
if($tema && $autor && $email && $obsah){
$ip = $_SERVER[REMOTE_ADDR];
mysql_query("INSERT INTO temy(nadpis,obsah,autor,email,datum,uprava,ip) VALUES('$tema','$obsah','$autor','$email',NOW(),NOW(),'$ip')");
} else {
echo $error;
}
}
echo "<h2><a href="/" title="Vrátiť sa na obsah fóra">Fórum</a> -> Vytvorenie novej témy</h2>n";
menu(); // volanie funkcie pre menu
echo "<form action="{$_SERVER[PHP_SELF]}?tema" method="post">n";
echo "<fieldset><legend>Vytvorenie novej témy</legend>n";
echo "Názov témy<br /><input name="tema" type="text" /><br />n";
echo "Autor<br /><input name="autor" type="text" /><br />n";
echo "Email<br /><input name="email" type="text" value="@" /><br />n";
echo "Obsah témy:<br /><textarea name="obsah" rows="7" cols="60"></textarea><br />n";
echo "<input name="odoslat" type="submit" value="Odoslať" />n";
echo "<input type="reset" value="Reset" />n";
echo "</fieldset>n";
echo "</form>n";
}
// funkcia pre zobrazenie témy
function zobraz_temu($id){
$sql = mysql_query("SELECT * FROM temy WHERE id_temy='$id' LIMIT 1");
while($stlpec = mysql_fetch_object($sql)){
$id_temy = $stlpec->id_temy;
$nadpis = $stlpec->nadpis;
$obsah = $stlpec->obsah;
$autor = $stlpec->autor;
$email = $stlpec->email;
$datum = $stlpec->datum;
$ip = $stlpec->ip;
echo "<h2><a href="/" title="Vrátiť sa na obsah fóra">Fórum</a> -> $nadpis</h2>n";
menu(); // volanie funkcie pre menu
echo "<div class="tema">n";
echo "<strong><a href="?id=$id_temy" title="">$nadpis</a></strong><br />n";
echo "<small>[ Dátum:$datum | Autor:$autor | Email:$email | IP:$ip ]</small><br />n";
echo "<div class="tema_obsah">$obsahn";
echo "</div></div>n";
}
mysql_free_result($sql);
}
// funkcia na výpis tém
function zobraz_temy(){
echo "<h2>Fórum</h2>n";
menu(); // volanie funkcie pre menu
$sql = mysql_query("SELECT * FROM temy ORDER BY uprava DESC");
while($stlpec = mysql_fetch_object($sql)){
$id_temy = $stlpec->id_temy;
$nadpis = $stlpec->nadpis;
$datum = $stlpec->datum;
echo "<div class="tema">n";
echo "<strong><a href="?id=$id_temy" title="">$nadpis</a></strong><br />n";
echo "<small>[ Dátum:$datum ]</small>n";
echo "</div>n";
}
mysql_free_result($sql);
}
?>
Ako vidíte primárna funkcia, ktorá bude vytvárať témy(vytvor_temu()) je
pekne dlhá. Samozrejme nejde o jej dĺžku ale o funkčnosť. Zápis do fóra nebude
zneužitý, pretože je chránené proti prázdnym zápisom alebo proti HTML tagom či
javascriptu alebo dokonca samotnému PHP. Funkcia menu() bude zobrazovať horizontálne
menu. Bola použitá takmer v každej funkcií. Funkcia oprav() bude opravovať
zápis do databázy. Všetky funkcie budeme opäť volať zo súboru index.php.
<? #index.php
require_once("config.php");
require_once("functions.php");
include_once("layout/top.php");
if(isset($_GET[id])){
if($_GET[id] == $id){
zobraz_temu($id);
}
} elseif(isset($_GET[tema])){
vytvor_temu();
} else {
zobraz_temy();
}
include_once("layout/bottom.php");
mysql_close();
?>
Súbor bol minimálne upravený a to tak, že sa pridalo iba volanie funkcie pre
vytvorenie témy. URL formuláru pre vytvorenie témy bude index.php?tema.
Toto by bolo pre tento diel všetko a nabudúce si ukážeme ako zapisovať príspevky k témam.