ELEKTRO
CHEMIE
PROGRAMOVÁNÍ
FOTKY
BLOG
E-SHOP

Elektro

  • Novinky
  • Aktuality
  • PHP
  • MySQL
  • JavaScript
  • .NET
  • Download
  • Odkazy
  • Anketa
  • Návštěvní kniha
  • Mapa webu
  • O webu
  • RSS

  • © by Hugo moravec.zd@gmail.com

    Návštěvní kniha bez MySQL

    Vkládání příspěvků---Zobrazování příspěvků--- Administrace---Zprovoznění---Závěr

    Zde bych chtěl vystavit návod na jednoduchou návštěvní knihu. Je velmi podobná knize umístěné na těchto stránkách. Veškeré informace jsou uchovávány v textovém souboru, takže ji lze zprovoznit i na serveru bez MySQL. Kniha má také jednoduchou administraci, která umožňuje mazání příspěvků a kde se navíc zobrazují i IP adresy autorů příspěvků.

    Vkládání příspěvků

    Nejprve vytvoříme formulář, který umožní vložení příspěvku (ukázka, zdrojový kód). Na začátku formuláře je požadavek na soubor config.php (zdrojový kód), který obsahuje HTTP a HTML hlavičku. Dále umožňuje blokovat IP adresy, které jsou zadány v poli $ip.

    Po zadání a odeslání jsou data z formuláře nejprve zkontrolována JavaScriptem (pokud je v prohlížeči povolen) a poté jsou odeslána na server. Zpracování dat provádí skript insert.php, ten nejprve zkontroluje zadané údaje a pokud jsou v pořádku, tak otevře soubor msg.txt a načte jeho obsah do proměnné $out. Potom k této proměnné přidá text příspěvku a údaje o odesílateli. Nakonec vloží obsah této proměnné zpět do souboru (který byl předtím smazán). Nakonec dojde k přesměrování na skript read.php, jehož úkolem je zobrazení zadaných dat.

    <?php
    Require_Once ('config.php');

    if (
    $_POST['name'] == "" || $_POST['email'] == "" || $_POST['contrib'] == "")
    {
      print 
    $head;
      print 
    '<h1>Špatně zadané údaje</h1>';
      print 
    'Musite vyplnit všechny údaje.<br>';
      print 
    "<a href=\"form.php?name=".$_POST['name']."&amp;email=".$_POST['email']."&amp;contrib="
            
    .$_POST['contrib']."\">Zpět</a>";
      print 
    $tail;
      exit;
    }
    elseif (!
    EReg("^.[^@]{2,20}@{1}.[^@]{2,20}(\..{2,4}$)"$_POST['email']))
    {
      print 
    $head;
      print 
    '<h1>Špatně zadané údaje</h1>';
      print 
    'Emailová adresa není ve správném formátu.<br>';
      print 
    "<a href=\"form.php?name=".$_POST['name']."&amp;contrib=".$_POST['contrib']."&amp;email="
            
    .$_POST['email']."\">Zpět</a>";
      print 
    $tail;
      exit;

    }

    if (
    PReg_Match ("/(<.[^>]+)(>)/i"$_POST['contrib']))
    {
      print 
    $head;
      print 
    '<h1>Špatně zadané údaje</h1>';
      print 
    'Nepoužívejte prosím HTML tagy. Vložené URL budou automaticky převedeny na odkaz.<br>';
      print 
    "<a href=\"form.php?name=".$_POST['name']."&amp;email=".$_POST['email']."&amp;contrib="
            
    .$_POST['contrib']."\">Zpět</a>";
      print 
    $tail;
      exit;
    }

    $filename 'msg.txt';
    $ip $_SERVER['REMOTE_ADDR'];

    if (
    File_Exists($filename))
    {
      
    $fp FOpen($filename'r');
      
    $obsah FRead ($fpFileSize($filename));
      
    FClose ($fp);
      
    $out .= $_POST['email']."\n";
      
    $out .= $_POST['name']."\n";
      
    $out .= URLEncode ($_POST['contrib'])."\n";
      
    $out .= Time()."\n";
      
    $out .= $ip."\n";
      
    $out .= $obsah;
      
    $fp FOpen($filename"w");
      
    FWrite ($fp$out);
      
    FClose($fp);
    }
    else
    {
      
    $out .= $_POST['email']."\n";
      
    $out .= $_POST['name']."\n";
      
    $out .= URLEncode ($_POST['contrib'])."\n";
      
    $out .= Time()."\n";
      
    $out .= $ip;
      
    $fp FOpen($filename'w');
      
    FWrite ($fp$out);
      
    FClose($fp);
    }

    Header('Location: '.$_SERVER['SERVER_NAME'].'read.php');
    exit;
    ?>

    Při zobrazování příspěvků je emailová adresa převedena do antispamové ochrany (zavináč a tečky jsou nahrazeny slovy). To je celkem důležité opatření, protože mnoho lidí se bojí (oprávněně) zadávat do podobných aplikací své emaily.

    Zobrazování příspěvků

    Zobrazování příspěvků obstarává skript read.php. Nejprve musíme otevřít soubor msg.txt, který obsahuje jednotlivé příspěvky. Potom načteme řádky tohoto souboru do pole $rows pomocí funkce File(). V dalším kroku jsou tyto řádky rozděleny do polí podle toho jestli se jedná o jméno autora, email, text příspěvku, datum nebo IP adresu. Nakonec vytvoříme HTML výstup, který odešleme prohlížeči.

    <?php
    Require_Once ('config.php');
    Require_Once (
    'txt2html.php');

    $filename "msg.txt";
    if (
    File_Exists($filename))
    {
      
    $rows File($filename);
      for (
    $i=0$i<Count($rows); $i++)
      {
        switch (
    $i%5)
        {
          case 
    "0":
            
    $rows[$i] = Str_Replace ("@"," (et) "$rows[$i]);  //ZAMENA ZAVINACE
            
    $email[] = Str_Replace ("."," (dot) "$rows[$i]);  //ZAMENA TECKY
            
    break;
            
          case 
    "1":
            
    $name[] = $rows[$i];
            break;
          
          case 
    "2":
            
    $text[] = $rows[$i];
            break;
          
          case 
    "3":
            
    $cas[] = $rows[$i];
        }
      }
    }
    print 
    $head;
    ?>
    <table border="0" width="550" cellpadding="0" cellspacing="0">
    <tr><td align="justify" colspan="2"><p class="head">Kniha návštěv</p></td></tr>
    <tr><td>&nbsp;</td></tr>

    <tr><td>
    <a href="form.php" class="normlink">Vložit nový příspěvek</a><br><br><hr>
    <?php
    for ($i=0$i<Count($email); $i++)
    {
    ?>
    <table border="0" width="550" cellpadding="0" cellspacing="0">
    <tr><td width="50"><b>Jméno:</b></td><td width="500" align="left"><?php echo $name[$i]; ?><br></td></tr>
    <tr><td><b>E-mail:</b></td><td><?php echo $email[$i]; ?><br></td></tr>
    <tr><td><b>Datum:</b></td><td><?php echo StrFTime("%d.%m %Y %H:%M"$cas[$i]); ?></td></tr>
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td colspan="2" align="justify"><?php echo txt2html(URLDecode($text[$i])); ?><hr><br></td></tr>
    </table>
    <?php
    }
    ?>
    </td></tr></table>
    <?php
    print $tail;
    ?>

    Administrace

    Administrace je velmi jednoduchá - umožňuje pouze mazání příspěvků a také zobrazuje IP adresu, z které byl příspěvek odeslán. Pro vstup do registrace je nutné se zalogovat. Pro přenášení hesla mezi stránkami využívám sessions. Heslo je kódované pomocí šifry MD5.

    <?php
    include_once ('config.php');
    session_start();

    $MD5Hash '07f32cf80744e6bdd6152c4c7623b4f2';    //MD5 hash hesla

    if ($_SESSION['login'] == 'administrator')
    {
      if (
    $_SESSION['password'] != $MD5Hash)
      {
        print 
    $head;
        print 
    'Špatné heslo';
        print 
    $tail;
        exit;
      }
    }

    else
    {
      if (
    $_POST['login'] != 'administrator' || MD5($_POST['password']) != $MD5Hash)
      {
        print 
    $head;
        print 
    'Špatná kombinace loginu a hesla.';
        print 
    $tail;
        exit;
      }
      else
      {
        
    $_SESSION['login'] = $_POST['login'];
        
    $_SESSION['password'] = MD5($_POST['password']);
        
    Header ('Location: admin-book.php');
      }
    }
    ?>

    Vstupní formulář je v souboru login.html. Data z tohoto formuláře jsou odeslána skriptu session.php, který nejprve zkontroluje, jestli už nějaká session nebeží a pokud ne, tak ověří správnost loginu a hashe hesla. Pokud je vše v pořádku, dojde k přesměrování na skript admin-book.php.

    <?php
    @include ('../header1.php');
    require_once (
    'config.php');
    require_once (
    'session.php');
    include_once (
    'txt2html.php');

    $filename "msg.txt";
    if (
    File_Exists($filename))
    {
      
    $rows File($filename);
      for (
    $i=0$i<Count($rows); $i++)
      {
        switch (
    $i%5)
        {
          case 
    "0":
            
    $email[] = $rows[$i];
            break;
            
          case 
    "1":
            
    $name[] = $rows[$i];
            break;
          
          case 
    "2":
            
    $text[] = $rows[$i];
            break;
          
          case 
    "3":
            
    $cas[] = $rows[$i];
            break;
          
          case 
    "4":
            
    $ip[] = $rows[$i];
            break;
        }
          
      }
    }
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">

    <html>
    <head>
    <title>Kniha návštěv</title>
    <meta http-equiv="language" content="czech">
    <meta name="author" content="hugo">
    <meta http-equiv="Content-type" content="text/html ;charset=utf-8">
    <link rel=stylesheet type="text/css" href="css/style.css">
    <script type="text/javascript" language="javascript" src="js/book.js"></script>
    </head>
    <body>
    <h1>Kniha návštěv - administrace</h1>
    <strong>Celkový počet příspěvků:
    <?php
    print Count ($name);            //URCI POCET PRISPEVKU Z POCTU PRVKU POLE $name
    ?>
    </strong>
    <form name="del" action="del-contrib.php" method="post">
    <?php
    for ($i=0$i<Count($email); $i++)
    ?>
    <fieldset>
    <legend>&nbsp;Příspěvek č. <?php print $i+1?>&nbsp;</legend>
    <table border="0" width="550" cellpadding="0" cellspacing="0">
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td width="50"><input type="checkbox" name="del[]" value="<?php print $cas[$i]; ?>"></td>
    <td width="500" align="left">Smazat příspěvek</td></tr>
    <tr><td width="50"><b>Jméno:</b></td><td width="500" align="left"><?php echo $name[$i]; ?></td></tr>
    <tr><td><b>E-mail:</b></td><td><?php echo $email[$i]; ?></td></tr>
    <tr><td><b>Datum:</b></td><td><?php echo StrFTime("%d.%m %Y %H:%M"$cas[$i]); ?></td></tr>
    <tr><td><b>IP:</b></td><td><?php echo $ip[$i]."/".GetHostByName(Trim($ip[$i])); ?></td></tr>
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td colspan="2" align="justify"><?php echo NL2BR(txt2html(URLDecode($text[$i]))); ?><br></td></tr>
    </table>
    </fieldset>
    <?php }
    ?>
    <input type="submit" value="Smazat označené příspěvky">
    </form>
    </body>
    </html>

    V administraci jsou zobrazeny příspěvky, stejně jako při čtení, ale navíc je u každého jeden checkbox, pomocí kterého můžeme označit příspěvky určené ke smazání. Tyto příspěvky budou po odeslání formuláře předány skriptu del-contrib.php, který je smaže. Skript je velmi jednoduchý, pouze načte soubor msg.txt po řádcích do pole a poté porovnává datum vložení příspěvku s datem odeslaným jako hodnota checkboxu. Pokud se neshodují, tak je příspěvek uložen zpět do souboru. V opačném případě je smazán.

    <?php
    require_once ('session.php');
    $filename "msg.txt";
    $out '';

    if (
    Count ($_POST['del']) == 0)
    {
      
    Header ('Location: admin-book.php');
    }

    $content File ($filename);

    for (
    $i 3$i Count ($content); $i+=5)
    {
      if (!
    In_Array (Trim($content[$i]), $_POST['del']))
      {
        
    $out .= $content[$i-3];
        
    $out .= $content[$i-2];
        
    $out .= $content[$i-1];
        
    $out .= $content[$i];
        
    $out .= $content[$i+1];
      }
    }

    $fp FOpen ($filename'w');
    FWrite ($fp$out);
    FClose ($fp);
    Header ('Location: admin-book.php');
    ?>

    Zprovoznění návštěvní knihy

    Nedávno mi došel mail s dotazem jak zprovoznit tuto knihu. Celkem mě překvapil, protože sem spíš očekával, že tyto skripty budou sloužit jako odrazový můstek pro vytvoření finální aplikace. Ale dobrá ...

    Takže první věc, kterou pro zprovoznění návštěvní knihy potřebujete je server, na které běží PHP. To se dá zjistit z informací od webmastera, příp. můžete zkusit na server nahrát soubor info.php s tímto obsahem:

    <?php

    PHPInfo
    ();

    ?>

    Pokud se Vám po spuštění tohoto souboru objeví několik tabulek s informacemi o PHP, tak je to dobré. V případě, že uvidíte jen obsah toho souboru, tak máte smůlu a musíte sehnat lepší server (nebo si připlatit).

    První úpravy je potřeba udělat v souboru config.php, do pole $ip vložte IP adresy, kterým chcete zabránít v přístupu k návštěvní knize (spammeři a podobné existence). Pokud nechcete zatím blokovat nikoho, tak nechte toto pole prázdné. Další úpravu je potřeba udělat v souboru sessions.php. Do proměnné $MD5Hash je nutné vložit MD5 hash hesla, které chcete používat pro vstup do administrace. Pokud se pohybujete na Linuxu, tak by pro Vás neměl být problém tento řetězec získat, stačí zadat:

    md5 -ms VaseHeslo

    Ve windowsech je potřeba použít nějakou utilitku, pokud ovšem máte naistalovaný PSPad, tak stačí jen kliknout na Nástroje -> MD5 otisk. Pokud Vám nevadí mít heslo zadané v kódu ve formě plain text, tak můžete ten řádek upravit do této podoby:

    $MD5Hash = MD5('VaseHeslo');

    Toto ovšem vřele nedoporučuji. Hlavně sem nezadávejte heslo, které používáte jinde, protože hlavně na free-hostingu se na bezpečnost nedá příliš spoléhat.

    Pro vygenerování MD5 otisku můžete také využit tento formulář:

    Text:  

    To by mělo být snad vše, co je potřeba provést pro zprovoznění této knihy. Pokud by byly nějaké problémy, tak mi pošlete mail a já budu informace průběžně doplňovat.

    Závěr

    Tato návštěvní kniha je velmi jednoduchá a nevyžaduje MySQL, což umožní její zprovoznění na velkém počtu serverů a taky může být trochu rychlejší (záleží na konkrétním serveru).

    Všechny soubory návštěvní knihy si můžete stáhnout na této adrese.


    LICENCE

    Všechny skripty na tomto webu jsou poskytovány, pokud není uvedeno jinak, bez jakýchkoliv licenčních požadavků a také bez záruk.