Vytváříme si vlastní redakční systém v PHP
2. díl
Minule jsme si vytvořili jednoduché přihlašování/odhlašování,
nyní se podíváme na tvoření jednoduchých diskuzí. Diskuzi si
nejdříve navrhneme, respektive její tabulku... Nejdříve si řekněme,
co budeme po uživateli požadovat. Jedná se o blog, takže bude bohatě
stačit
nick,
e-mail,
web a
text
zprávy. Pro nick, e-mail a web vybereme v databázi typ
varchar(128),
myslím, že by to mělo bohatě stačit. Pro text zprávy vybereme typ
text(4096). Mělo by to stačit i náročnějším návštěvníkům stránek.
Dále bychom si do databáze měli zapsat IP adresu (varchar(16)), datum přidání
příspěvku (int(24)) a hlavně id (int(8)).
Diskuze...
Tabulka by tedy mohla vypadat asi takto:
CREATE TABLE `diskuze` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`jmeno` varchar(128) collate utf8_czech_ci NOT NULL,
`email` varchar(128) collate utf8_czech_ci DEFAULT NULL,
`web` varchar(128) collate utf8_czech_ci NOT NULL,
`prispevek` text collate utf8_czech_ci NOT NULL,
`datum` int(24) NOT NULL,
`ip` varchar(16) collate utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Vložíme si do ní první příspěvek:
INSERT INTO diskuze (`jmeno`, `email`, `web`, `prispevek`, `datum`, `ip`) VALUES ('Nick', 'nick@nekde.cz','http://nekde.cz', 'První příspěvek v diskuzi =)', '1208975772', '123.123.123.123');
Samozřejmě, že IP vypisovat nebudeme, bude bohatě stačit, když vypíšeme
nick, e-mail, web, zprávu a datum příspěvku.
<?php
$rsrc_diskuze =
mysql_query("SELECT * FROM diskuze ORDER BY id DESC");
echo "<table bgcolor=\"#F2F2F2\" border=\"0\" width=\"350\">\r\n";
echo "<tr><td>Příspěvek od <b><u>".
stripslashes($data_diskuze["jmeno"]).
"</u></b> | <a href=\"".
stripslashes($data_diskuze["web"]).
"\"><img src=\"images/web.png\"></a> | <a href=\"mailto:".
stripslashes($data_diskuze["email"]).
"\"><img src=\"images/email.png\"></a> | <b><i>".
date("d.m.Y, H:i:s",
$data_diskuze["datum"]).
"</i></b></td></tr>\r\n";
echo "</table>\r\n<br>\r\n";
}
?>
(Promiňte mi tabulkové zobrazování, nejsem moc na CSS a vše co se týče designu
mi je cizí)
Tento kód nám vypíše z databáze všechny příspěvky sestupně, díky
ORDER
BY id DESC, to znamená od nejnovějšího příspěvku. Výpis všech zpráv
na jednu stránku však efektivní moc není. Uděláme si stránkování, deset příspěvků
na stránku. Uděláme to tak, že zjistíme počet příspěvků v tabulce, pokud
je příspěvků méně než deset, nebudeme stránkování zobrazovat, pokud je více
příspěvků než deset, budeme vypisovat stránkování po deseti... Tento kód tedy příjde
za kód, který byl výše
$vysledek =
mysql_query("SELECT COUNT(*) AS pocet FROM diskuze");
$celkem = $zaznam["pocet"];
if ($celkem>10) {
while($x < $celkem) {
echo "<a href=\"index.php?strana=stranky/diskuze&od=".
($x+1).
"\">[".
$x.
"-".
($x+10).
"]</a>\r\n";
$x += 10;
}
}
Nyní už nám zbývá jen vložení příspěvku do databáze, jde to provést podmínkou, zda
byl stisknut "submit", a následně jedním příkazem
INSERT INTO. Tento kód
bych doporučoval dát na začátek souboru:
if(isset($_POST["ok_diskuze"])) { mysql_query("INSERT INTO diskuze (jmeno, email, web, prispevek, datum, ip) VALUES '".$_SERVER["REMOTE_ADDR"]."')");
}
Nyní jdeme vylepšovat. Nejzásadnější věc, bez které se dnes snad žádná diskuze
neobejde, je CAPTCHA. V praxi jde o obrázek, na kterém jsou nějaké písmena
a číslice, a vy je musíte opsat, jinak by se příspěvek neodeslal.
Zamezuje to spamovým robotům přidávat spam do vašich diskuzí.
Stáhl a upravil jsem jeden skript, co takový obrázek vytváří,a uloží
do session (
$_SESSION["captcha"])kód obrázku, který se při postu
příspěvku zkontroluje se zadaným antispamovým kódem. Skript
captcha.php
vytvoří obázek, kde je sled šetsi znaků, každý druhý je červený.
Za úkol máte napsat ty černé. Kontrolu, jestli jsme zadali správný kód z obrázku
zjistíme tak, že k podmínce
if(isset($_POST["ok_diskuze"])) přidáme další:
if(isset($_POST["ok_diskuze"])) { if($_SESSION["captcha"] == $_POST["captcha"]) {
mysql_query("INSERT INTO diskuze (jmeno, email, web, prispevek, datum, ip) VALUES '".$_SERVER["REMOTE_ADDR"]."')");
} else {
echo "<h2><font color=\"red\">Špatně opsaná captcha!!</font></h2>\r\n";
}
}
Nyní stačí už jen přidat na konec souboru HTML formulář:
<form action="#" method="post"> <tr><td>Opište prosím černé znaky:
<img src="images/captcha.php"></td><td><input type="text" value="" name="captcha"></td></tr> </form>
</fieldset>
</center>
Všiměte si, že captcha se zobrazuje ze souboru
images/captcha.php...
Myslím si, že jako skvělá věc bude (v případě přihlášeného administrátora) mazání
příspěvků. Stačilo by upravit výpis:
echo "<table bgcolor=\"#F2F2F2\" border=\"0\" width=\"350\">\r\n";
echo "<tr><td>Příspěvek od <b><u>".
stripslashes($data_diskuze["jmeno"]).
"</u></b> | <a href=\"".
stripslashes($data_diskuze["web"]).
"\"><img src=\"images/web.png\"></a> | <a href=\"mailto:".
stripslashes($data_diskuze["email"]).
"\"><img src=\"images/email.png\"></a> | <b><i>".
date("d.m.Y, H:i:s",
$data_diskuze["datum"]).
"</i></b></td></tr>\r\n";
if(prihlaseny() == true) {
echo "<tr><td><div align=\"right\"><a href=\"javascript: if (confirm('Opravdu chcete vymazat tento příspěvek?')) document.location.href='index.php?strana=stranky/diskuze&vymazat=".
stripslashes($data_diskuze["id"]).
"'\"><u><b>(smazat)<b><u></a></div></td></tr>\r\n";
}
echo "</table>\r\n<br>\r\n";
}
A na začátek souboru přidáme:
if((isset($_GET["vymazat"])) &&
(prihlaseny() == true) &&
}
Toto všechno uložíme do souboru
diskuze.php do složky
stranky.
V
index.php tedy můžeme upravit odkaz na diskuzi, jako
<a href="index.php?strana=stranky/diskuze" class="menu">Diskuze</a>
Ještě by mohla být skvělým doplňkem věc, že po přihlášení se vám v menu vytvoří
nová položka
Administrace. Toho docílíme jednoduchým upravením
index.php.
<ul id="menu">
...
...
<li><a href="index.php?strana=stranky/diskuze" class="menu">Diskuze</a></li>
<?php
if(prihlaseny() == true) {
echo "<li><a href=\"index.php?strana=admin/admin\" class=\"menu\">Administrace</a></li>";
}
?>
</ul>
Pro dnešek si myslím, že to stačí. Dosavadní práci si můžete stáhnout
zde
Příště se pustíme do administrace novinek...