Zpět na seznam článků     Číst komentáře (63)     Verze pro tisk

Vytváříme si vlastní redakční systém - 2. část

Autor: DjH   
29.4.2008

V tomto díle si vytvoříme jednoduchou diskuzi...


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:
  1. 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.
  1. <?php
  2. $rsrc_diskuze = mysql_query("SELECT * FROM diskuze ORDER BY id DESC");
  3. while($data_diskuze = mysql_fetch_array($rsrc_diskuze)) {
  4. echo "<table bgcolor=\"#F2F2F2\" border=\"0\" width=\"350\">\r\n";
  5. 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";
  6. echo "<tr><td>".stripslashes($data_diskuze["prispevek"])."</td></tr>\r\n";
  7. echo "</table>\r\n<br>\r\n";
  8. }
  9. ?>

(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
  1. $vysledek = mysql_query("SELECT COUNT(*) AS pocet FROM diskuze");
  2. $zaznam = mysql_fetch_array($vysledek);
  3. $celkem = $zaznam["pocet"];
  4.  
  5. if ($celkem>10) {
  6. echo "<hr><center>";
  7. while($x < $celkem) {
  8. if($x != 0) echo ", ";
  9. echo "<a href=\"index.php?strana=stranky/diskuze&amp;od=".($x+1)."\">[".$x."-".($x+10)."]</a>\r\n";
  10. $x += 10;
  11. }
  12. echo "</center>";
  13. }

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:
  1. if(isset($_POST["ok_diskuze"])) {
  2. mysql_query("INSERT INTO diskuze (jmeno, email, web, prispevek, datum, ip) VALUES
  3. ('".mysql_real_escape_string(htmlentities($_POST["jmeno"]))."',
  4. '".mysql_real_escape_string(htmlentities($_POST["email"]))."',
  5. '".mysql_real_escape_string(htmlentities($_POST["web"]))."',
  6. '".mysql_real_escape_string(htmlentities($_POST["prispevek"]))."',
  7. '".time()."',
  8. '".$_SERVER["REMOTE_ADDR"]."')");
  9. }

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ší:
  1. if(isset($_POST["ok_diskuze"])) {
  2. if($_SESSION["captcha"] == $_POST["captcha"]) {
  3. mysql_query("INSERT INTO diskuze (jmeno, email, web, prispevek, datum, ip) VALUES
  4. ('".mysql_real_escape_string(htmlentities($_POST["jmeno"]))."',
  5. '".mysql_real_escape_string(htmlentities($_POST["email"]))."',
  6. '".mysql_real_escape_string(htmlentities($_POST["web"]))."',
  7. '".mysql_real_escape_string(htmlentities($_POST["prispevek"]))."',
  8. '".time()."',
  9. '".$_SERVER["REMOTE_ADDR"]."')");
  10. } else {
  11. echo "<h2><font color=\"red\">Špatně opsaná captcha!!</font></h2>\r\n";
  12. }
  13. }

Nyní stačí už jen přidat na konec souboru HTML formulář:
  1. <legend>Přidat nový příspěvek</legend>
  2. <form action="#" method="post">
  3. <tr><td>Jméno:</td><td><input type="text" value="" name="jmeno"></td></tr>
  4. <tr><td>Web:</td><td><input type="text" value="http://" name="web"></td></tr>
  5. <tr><td>E-Mail:</td><td><input type="text" value="@" name="email"></td></tr>
  6. <tr><td>Opište prosím černé znaky: <img src="images/captcha.php"></td><td><input type="text" value="" name="captcha"></td></tr>
  7. <tr><td>Příspěvek:</td><td><textarea name="prispevek" cols="28" rows="10"></textarea></td></tr>
  8. </table><br>
  9. <center><input type="submit" name="ok_diskuze"></center>
  10. </form>
  11. </fieldset>
  12. </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:
  1. while($data_diskuze = mysql_fetch_array($rsrc_diskuze)) {
  2. echo "<table bgcolor=\"#F2F2F2\" border=\"0\" width=\"350\">\r\n";
  3. 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";
  4. echo "<tr><td>".stripslashes($data_diskuze["prispevek"])."</td></tr>\r\n";
  5. if(prihlaseny() == true) {
  6. 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&amp;vymazat=".stripslashes($data_diskuze["id"])."'\"><u><b>(smazat)<b><u></a></div></td></tr>\r\n";
  7. }
  8. echo "</table>\r\n<br>\r\n";
  9. }

A na začátek souboru přidáme:
  1. if((isset($_GET["vymazat"])) &&
  2. (prihlaseny() == true) &&
  3. (is_numeric($_GET["vymazat"]))) {
  4. mysql_query("DELETE FROM diskuze WHERE id='".mysql_real_escape_string($_GET["vymazat"])."'");
  5. }

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.
  1. <ul id="menu">
  2. ...
  3. ...
  4. <li><a href="index.php?strana=stranky/diskuze" class="menu">Diskuze</a></li>
  5. <?php
  6. if(prihlaseny() == true) {
  7. echo "<li><a href=\"index.php?strana=admin/admin\" class=\"menu\">Administrace</a></li>";
  8. }
  9. ?>
  10. </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...

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 3.16/49

1  2  3  4  5    
(známkování jako ve škole)