Nic
Nic
 Zoner.cz | Czechia.com | Inshop.cz | Interval.cz
Nic
Logo Interval.cz
Vyhledávání na serveru: Nic
rozšířené vyhledávání
Nic
 Grafika | Tvorba www | Internet | Software | E-komerce | Download | Diskuse
Nic
invisible
Reklama Nic Reklama

 Interval.cz > Tvorba www > PHP > Aplikace v PHP > Nástěnka v PHP


Podsekce rubriky
Odrážka Katalog stránek
Odrážka Kniha návštěv
Odrážka Diskusní fórum
Odrážka Správa kontaktů
Odrážka Online chat
Nic
Knihy pro webmastery:
shop.interval.cz
Nic
Interval.cz
Odrážka Volná místa
Odrážka Napište nám
Odrážka Redakce serveru
Odrážka Archív článků
Nic
Reklama na Interval.cz
Nic
invisible
Czechia.com - registrace a web-hosting domén
invisible
Ověřte si doménu
.cz | .com | .net | .org

invisible


Nic
Powered by MS SQL 7.0
Nic
Konference
Přehled článků
HELP konference
Nic
Ochrana osobních údajů
Nic
Reklama
Nic
Pracovní příležitosti
Odrážka Head of Development "Extraliga"
Odrážka Commercial Engineer
Odrážka Project Assistant (ENGI00078C /jp)
Odrážka AIX/UNIX DESIGNER (RS/6000 SOLUTIONS)
Odrážka Direct Marketing Manager (MKTG00043C /jp)
Odrážka Specialist, Interactive Marketing (MKTG00042C /jp)
Odrážka Senior trenér - tým trenérů dovedností (PRAD00001C /jp)
Odrážka Customer Contact Manager (MKTG00041C /jp)
Nic
Nic Nic Nic Nic Nic
Nic ATLAS.CZ Nic
Nic Nic
Nic Nic
Nic
Doporučujeme
Atlas.cz
DoKina Namodro
inShop.cz Flashland
Czechia Lupa.cz
Sova v síti
Nic Nic
Nic
Nic
Atlas.cz
Nic
Nic
Nástěnka v PHP
4.1.2002 |  Michal Kebrt |  Náhled pro tisk |  Přidat komentář | 

Často je nástěnka považována za totéž, co návštěvní kniha. Minimálně jeden podstatný rozdíl zde však existuje. Stejně jako u klasické papírové nástěnky, tak i u té internetové jsou zprávy "vyvěšeny" (zobrazeny) pouze po určitou dobu. Kromě této hlavní funkce, bude mít nástěnka všechny funkce jako návštěvní kniha (dělení slov, detekce odkazů, stránkování atd.). Celá aplikace je založena na databázi MySQL.

Nástěnku si předem vyzkoušejte.

Aby bylo vše přehlednější, použijte tyto soubory - board.php (zobrazení zpráv), form.php (formulář pro přidávání zpráv), post.php (uložení zpráv), header.php (hlavička), db.php (připojení k databázi), create_table.php (vytvoření databázové tabulky), style.css (kaskádové styly).

Vytvoření databázové tabulky (create_table.php)

Potřebovat budete pouze jednu tabulku s názvem "board", kam se budou ukládat všechny zprávy (příspěvky). Tabulka bude mít sedm položek - id (unikátní číslo zprávy), author (autor zprávy), email (email autora), from_date (datum, odkdy bude zpráva zobrazena), to_date (datum, dokdy bude zpráva zobrazena), subject (předmět zprávy), body (text zprávy). U položek "from_date" a "to_date" použijte datový typ "date", který označuje datum ve formátu rok-měsíc-den (RRRR-MM-DD).

require "db.php"; // otevře databázi

$create_table = MySQL_Query("CREATE TABLE board (
id int PRIMARY KEY AUTO_INCREMENT,
author varchar(50),
email varchar(50),
from_date date,
to_date date,
subject varchar(250),
body text
)") or die("Nepodařilo se vytvořit tabulku board"); // vytvoří tabulku board

Soubor db.php, kterým se připojíte k databázi, obsahuje všechny potřebné údaje (jméno databáze ad.)

$server_name = "localhost"; // jméno databázového serveru
$db_user = ""; // uživatel
$db_pass = ""; // heslo
$db_name = "board"; // jméno databáze

MySQL_Connect($server_name, $db_user, $db_pass) or die('Nepodařilo se připojit k MySQL databázi'); // připojení k databázi
MySQL_Select_DB($db_name) or die('Nepodařila se otevřít databáze.'); // výběr databáze

Hlavička (header.php)

Standardní hlavička je kromě tří dobře známých HTTP hlaviček zabraňujících cashování tvořena pouze čistým HTML, proto zde nebudu uvádět dlouhý zdrojový kód, ale jen malý obrázek.

Hlavička

Zobrazení zpráv a formuláře (board.php)

Proměnná $action určuje, jaká akce se provede. Tato proměnná může obsahovat pouze dvě hodnoty - "view" (zobrazení zpráv) a "post" (přidávání zpráv). Jelikož uživatelům nástěnky nabízíte možnost prohlédnout si jak "Aktuální zprávy" (mají být právě "vyvěšené"), tak i "Staré zprávy" ("prošlé" zprávy), musíte si definovat další proměnnou $what. Pokud obsahuje hodnotu "new", zobrazíte aktuální zprávy; jestliže obsahuje hodnotu "old", zobrazíte staré zprávy. Poslední z klíčových proměnných je proměnná $page obsahující číslo stránky, která se zobrazí.

Nejprve zjistíte, zda jsou tyto základní proměnné zinicializovány. Pokud ne, vložíte do nich standardní hodnoty.

$query_error = 'Došlo k chybě při zpracování SQL dotazu v databázi.'; // chybová hláška
if (!IsSet($action)) $action = "view"; // ještě není zinicializována proměnná $action
if (!IsSet($what)) $what = "new"; // ještě není zinicializována proměnná $what
if (!IsSet($page)) $page = 0; // ještě není zinicializována proměnná $page

V první větvi následující podmínky řešíte zobrazení zpráv. V závislosti na obsahu proměnné $what vypíšete nadpis ("Aktuální zprávy" nebo "Staré zprávy"). Současně si definujte nejdůležitější část SQL dotazu, který za chvíli použijete. Jedná se o část za slovem WHERE, tedy o podmínku určující, jaké zprávy z databáze vyberete. Funkce NOW() vrací aktuální datum a čas ve formátu RRRR-MM-DD HH:MM:SS. Pokud chcete zobrazit aktuální zprávy, musí být "from_date" (datum zobrazení zprávy) menší nebo rovno aktuálnímu datu a zároveň (spojka AND) "to_date" (datum, dokdy bude zpráva zobrazena) větší nebo rovno aktuálnímu datu. Jestliže zobrazujete staré zprávy, stačí zjistit, zda "to_date" je menší než aktuální datum.

if ($action=="view"): // zobrazuje zprávy
 require("header.php"); // vloží hlavičku
 require "db.php"; // otevře databázi
?>

 <table width="600" border="0" cellspacing="0" cellpadding="0" align="center">
  <tr><td class="tableheading">
    <?
    // zobrazuje aktuální nebo staré zprávy
    if($what=="new"):
        echo "->> Aktuální zprávy";
        $sql = "from_date <= NOW() AND to_date >= NOW()";
    else:
        echo "->> Staré zprávy";
        $sql = "to_date < NOW()";
    endif;
    ?>
    <hr width="100%" size="1" color="#7D7642" noshade>
  </td></tr>
 </table>

Nyní přichází na řadu výběr zpráv z databáze. Nejdříve musíte určit, po kolika se zprávy zobrazí ($view_number). Následně pomocí proměnné $page spočítáte první zprávu, která se zobrazí. Z databáze pak vyberete zprávy odpovídající výše popsané podmínce $sql. "ORDER BY id DESC" znamená, že zprávy budou seřazeny podle svého čísla, a to sestupně. Pomocí "LIMIT $start, $view_number" omezíte výběr tak, že vyberete 10 zpráv (standardní hodnota $view_number), počínaje zprávou $start.

 $view_number = 10; // zprávy budou zobrazeny po ...
 $start = $page*$view_number; // první zpráva, která se zobrazí
 $message = MySQL_Query("SELECT * FROM board WHERE $sql ORDER BY id DESC LIMIT $start,$view_number") or die($query_error); // vybíráte zprávy - seřazeno podle id

Teď již můžete dané zprávy vypsat. Každá zpráva bude v samostatné tabulce, nad níž bude uvedeno číslo zprávy. Jediný problém nastává u data "od - do", které uvedete v hranatých závorkách za předmětem zprávy. V databázi máte totiž datum ve formátu RRRR-MM-YY, potřebujete však datum ve formátu DD. MM. YYYY. Použijte funkci Explode, která dokáže rozdělit řetězec na jednotlivé části oddělené určitým znakem (v našem případě pomlčkou).

 // vypíše tabulky se zprávami
 while ($entry = MySQL_Fetch_Array($message)):
 ?>
    <table width="600" border="0" cellspacing="0" cellpadding="1" align="center"><tr><td class="tableheading"><?echo "zpráva č. " . $entry["id"]?></td></tr></table>
    <table width="600" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="#7D7642"><tr><td>
     <table width="100%" border="0" cellspacing="0" cellpadding="2" align="center" bgcolor="#eaead7">
      <tr>
        <td class="table">
        <?
        $from = Explode("-", $entry["from_date"]); // od
        $to = Explode("-", $entry["to_date"]); // do

        if ($entry["email"]!="") echo '<a href="mailto:' . $entry["email"] . '">'; // autor zadal svůj email
        echo "<b>" . $entry["author"] . "</b>"; // jméno
        if ($entry["email"]!="") echo '</a>';
        echo "<br>";
        echo "<b>" . $entry["subject"] . "</b>" . " [". $from[2] . ". " . $from[1] . ". " . $from[0] . " - " . $to[2] . ". " . $to[1] . ". " . $to[0] . "]"; // předmět [od - do]
        echo "<br><br>";
        echo $entry["body"]; // zpráva
         ?>
        </td>
      </tr>
     </table>
    </table><br>
 <?endwhile;?>

Poslední částí je vypsání odkazů na stránky s dalšími zprávami. Nejprve z databáze vyberte všechny zprávy odpovídající podmínce $sql. Následně zjistíte počet stran, na kterých se zprávy zobrazí, což je podíl celkového počtu zpráv a počtu zpráv na jedné straně ($view_number). Pomocí jednoduchého cyklu pak již jen vypíšete odkazy na jednotlivé stránky. U právě zobrazované stránky ($page) odkaz vytvářet nemusíte.

 <table width="600" border="0" cellspacing="0" cellpadding="0" align="center">
  <tr><td align="right" class="table">
    <hr width="100%" size="1" color="#7D7642" noshade>
    <b>strana:
    <?
    // odkazy na starší zprávy (u právě zobrazené zprávy se odkaz nevytvoří)
    $count = MySQL_Query("SELECT id FROM board WHERE $sql") or die($query_error); // výběr zpráv
    $page_count = Ceil(MySQL_Num_Rows($count)/$view_number); // počet stran, na kterých se zprávy zobrazí
    for($i=0;$i<$page_count;$i++):
        echo " | ";
        if($page!=$i) echo '<a href="board.php?action=view&what=' . $what . '&page=' . $i . '">';
        echo ($i+1);
        if($page!=$i) echo '</a> ';
    endfor;
    MySQL_Close(); // zavření databáze
    ?>
    |</b>
  </td></tr>
 </table>

V druhé části základní podmínky buď zobrazíte formulář, nebo uložíte zprávu do databáze. K tomu potřebujete proměnnou $write. Pokud je hodnota "false", zobrazí se formulář, pokud "true" uloží se zpráva do databáze.

else: // formulář nebo uložení zprávy

 $write = false; // předpokládáte zobrazení formuláře

Protože zdrojový kód formuláře je velmi dlouhý, uvedu jen některé důležité části a malý obrázek.

Formulář

Od uživatele budete získávat několik údajů - jméno ($author), email($email - nepovinný), předmět ($subject), text zprávy ($body) a dvě data - odkdy ($from_day - den, $from_month - měsíc, $from_year - rok) a dokdy ($to_day - den, $to_month - měsíc, $to_year - rok) má být zpráva zobrazena. Aby uživatel nemusel po odeslání chybně vyplněného formuláře vyplňovat vše znovu, budete zadané údaje uchovávat v atributu VALUE. Problém však nastává u částí, které jsou tvořeny formulářovým prvkem SELECT. Jde to však vyřešit tak, že jednotlivé položky budete vypisovat přes cyklus a pokud se předchozí hodnota (např. $from_month) rovná proměnné $i, vypíšete "SELECTED", což způsobí, že uživatel nebude muset po odeslání chybně vyplněného formuláře vybírat datum znovu. Zde uvádím pouze jednu část souboru form.php. Obdobně se však postupuje i u dalších "selectů".

<select name="from_month" size="1" class="input">
<?
// od - měsíc
$month=Array(1=> "ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince");
for($i=1;$i<=12;$i++):
    echo "<option value=" . $i;
    if($from_month==$i) echo " selected";
    echo ">" . $month[$i] . "</option>\n";
endfor;
?>
</select>

Ve formuláři je také jedno skryté pole s názvem "sent". Pokud je proměnná $sent zinicializována, byl formulář odeslán, a tak se můžete pustit do kontroly zadaných údajů. Nejprve zkontrolujte, zda byly vyplněny všechny povinné údaje. Následně zjistěte, jestli není datum OD větší než datum DO. K tomu využijte funkci MkTime(), která převádí datum na počet sekund od 1. ledna 1970. Jednotlivé parametry se zadávají v pořadí hodina, minuta, sekunda, měsíc, den, rok. Podobně zkontrolujte, zda datum OD není menší než dnešní datum. Pokud nastala nějaká chyba, uložte chybovou hlášku do proměnné $error a vypište ji na konci formuláře. Jestliže je vše v pořádku, vložte do proměnné $write hodnotu "true". Následující podmínka snad žádný podrobný komentář nepotřebuje - v závislosti na proměnné $write se buď provede zápis nebo se zobrazí formulář.

 if(IsSet($sent)):    // byl odeslán formulář?
     if($author=="" || $subject=="" || $body==""):    // byly vyplněny všechny povinné údaje?
        $error = 'Musíte vyplnit všechny povinné údaje - označeny tučným písmem.';
    elseif(MkTime(0,0,0,$from_month,$from_day,$from_year) > MkTime(0,0,0,$to_month,$to_day,$to_year)): // zkontroluje data od-do
        $error = 'Datum OD nesmí být větší než datum DO.';
    elseif(MkTime(0,0,0,$from_month,$from_day,$from_year) < MkTime(0,0,0, Date("m"), Date("d"), Date("Y"))):
        $error = 'Datum OD nesmí být menší než dnešní datum.';
    else:
        $write = true; // provede zápis
    endif;
 endif;

 if($write): // zápis do databáze
    require("post.php");
 else: // zobrazuje formulář
    require("header.php");
    require("form.php");
 endif;
endif;

Uložení zprávy do databáze (post.php)

Uložení zprávy do databáze je velmi jednoduché. Všechny prováděné operace byly popisovány v seriálech Návštěvní kniha a Diskusní fórum. Jediné, co okomentuji, je získání data OD a DO. K tomu použijete funkci Date(). Jako první parametr uvedete formát data, který vyžaduje databáze MySQL (RRRR-MM-DD), jako druhý počet sekund od 1. ledna 1970, k čemuž znovu použijete funkci MkTime(). Velká výhoda této funkce spočívá v tom, že si poradí i se špatně zadaným datem. Např. nesmyslné datum 31. 4. převede na 1. 5.

// odstraní nebezpečné znaky
$author = HTMLSpecialChars($author);
$email = HTMLSpecialChars($email);
$subject = HTMLSpecialChars($subject);

$body = SubStr($body, 0, 1500); // bere pouze 1500 znaků
$body = Trim($body); // odstraní mezery ze začátku a konce řetězce
$body = HTMLSpecialChars($body); // odstraní nebezpečné znaky
$body = Str_Replace("\r\n"," <BR> ", $body); // nahradí konce řádků na tagy <BR>

$body = WordWrap($body, 90, "\n", 1); // rozdělí dlouhá slova

// vytvoří odkazy
$body = EregI_Replace("(http://[^ ]+\.[^ ]+)", " <a href=\\1>\\1</a>", $body);
$body = EregI_Replace("[^/](www\.[^ ]+\.[^ ]+)", " <a href=http://\\1>\\1</a>", $body);

// povolí tyto tagy - <b> <u> <i>, možnost přidat další
$tag = Array("b", "u", "i");
for($y=0;$y<Count($tag);$y++):
    $body = EregI_Replace("<" . $tag[$y] . ">", "<" . $tag[$y] . ">", $body);
    $body = EregI_Replace("</" . $tag[$y] . ">", "</" . $tag[$y] . ">", $body);
endfor;

$from = Date("Y-m-d", MkTime(0,0,0,$from_month,$from_day,$from_year)); // od
$to = Date("Y-m-d", MkTime(0,0,0,$to_month,$to_day,$to_year));// do

require "db.php"; // otevře databázi
$add = MySQL_Query("INSERT INTO board VALUES ('', '$author', '$email', '$from', '$to', '$subject', '$body')") or die($query_error); // vloží zprávu
MySQL_Close(); // zavře databázi
Header("Location: board.php"); // přesune se na úvodní stránku

Nástěnku můžete použít pro vkládání akcí a zpráv, které mají omezenou platnost. Smíte si ji však libovolně upravit a použít třeba jako obyčejnou návštěvní knihu. Kompletní zdrojové kódy si můžete stáhnout.

Zaujal vás článek? Pošlete nám přes toto rozhraní dobrovolný příspěvek formou mikroplatby v systému I LIKE Q (vlevo - Q) anebo v DirectPay (vpravo - kredity).
 poslat  Q - 


poslat  kreditů - 


Směnný poměr - 100 Q (I LIKE Q) anebo 100 kreditů (DirectPay) je rovno 1 Kč.

Michal Kebrt - Další články autora

 Diskuse: Nástěnka v PHP
04.01.02, 07:43 eisy super
04.01.02, 11:26 Jarin Solidní, ale...
04.01.02, 13:24 Marek Šalanda ccSolidní, ale...
04.01.02, 14:34 Dominik Malčík Lišta se stránkami.
04.01.02, 23:02 Michal Kebrt ccLišta se stránkami.
06.01.02, 14:27 Štěpán Horák Změna časového období
06.01.02, 19:25 Michal Kebrt ccZměna časového období
06.01.02, 22:32 Štěpán Horák ccccZměna časového období
07.01.02, 19:35 Michal Kebrt ccccccZměna časového období
09.01.02, 20:49 Štěpán Horák ccccccccZměna časového období
08.01.02, 11:59 Happy Neexistujici index pole
09.01.02, 12:01 micval ccNeexistujici index pole
Zobrazit vše |  Přidat nový


Funkce ke článku
Náhled pro tisk
Doporučit článek
Přidat komentář
invisible
Textová inzerce
Odrážka DIRECTPAY - zajímavý mikroplatební systém pro český Internet.
Nic
Nic
Nic
invisible
Známkování článku
Hodnoťte jako ve škole:
Vyber: 1 | 2 | 3 | 4 | 5
Hlasovalo: 48 čtenářů
Výsledek: 2,52

Aktuální články
Odrážka Vložení efektu z Flashe do HTML
Odrážka Chudým vstup zakázán
Odrážka DHTML editor kompatibilní se všemi prohlížeči
Odrážka Jak vědět více o návštěvnících pomocí PHP
Odrážka Jak si naplánovat služební cestu
invisible
Oblíbené články
Odrážka Jak na vlastní katalog stránek v PHP? - začínáme
Odrážka Návštěvní kniha v PHP bez použití databáze III.
Odrážka Návštěvní kniha v PHP bez použití databáze
Odrážka Diskusní fórum v PHP pro každého (1.)
Odrážka Jak na vlastní katalog stránek v PHP? (4.) - vyhledávání
invisible
Další články v rubrice
Nejsou další články v rubrice
invisible
Vydáno před rokem
Odrážka Vylepšená kontextová nápověda pomocí JavaScriptu
Odrážka Třináct zajímavých tutoriálů pro FLASH
invisible
Reklama

 Grafika | Tvorba www | Internet | Software | E-komerce | Download | Diskuse

Doplněk