Vytvoření návštěvní knihy v PHP s návazností na MySQL databází vyžaduje v první řadě připojení na server s touto databází. Než toto připojení vytvoříte, je třeba v dané databázi také tabulku pro návštěvní knihu vytvořit. Např. přes rozhraní Adminer nebo PhpMyAdmin takto můžeme potřebnou tabulku vytvořit tímto příkazem:

CREATE TABLE kniha
(
ID INT NOT NULL AUTO_INCREMENT ,
NICK VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
EMAIL VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
WEB VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
VZKAZ VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
DATUM VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
PRIMARY KEY (ID)
);

Dále již můžeme zrealizovat připojení, které bývá umístěno většinou v samostatném souboru. Např. můžeme vytvořit soubor db.php, který obsahuje následující kód:

POZOR! – údaje pro připojení je třeba změnit podle vašeho připojení na databázový server.

<?php 
//Zadání jednotlivých údajů potřebných pro připojení do databáze:
$dbhost = 'server.xy'; //server, kde se nachází databáze (často bývá localhost)
$dbname = 'databaze'; //jméno databáze
$dbuser = 'uzivatel'; //uživatelské jméno
$dbpass = 'heslo'; //heslo
//Vytvoření připojení: 
$spojeni = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
//Kontrola připojení s případnou hláškou 
if (!$spojeni)
 {
 echo 'Spojení s mysql serverem se nepodařilo navázat.<br>';
 }
//Stav, kdy se podaří navázat spojení s databází již nevypisujeme
//Následuje nastavení kódování a následná práce s daty 
 mysqli_set_charset($spojeni, "utf8");
?>

Ujistěte se, že soubor, který vytváříte má kódování UTF-8.

Tabulku v databázi můžeme vytvořit také tak, že se SQL příkazy vloží do PHP kódu. Tato varianta však vyžaduje nejprve vytvořit spojení s databází, tedy nejprve vytvořit soubor db.php. Následný soubor (můžeme ho nazvat např. vytvor-knihu.php) může vypadat např. takto:

<?php
// Napojení souboru se spojením k databázi
require 'db.php';
// SQL příkaz k vytvoření tabulky Clanky v databázi
$vytvor_knihu = "
CREATE TABLE kniha
(
ID INT NOT NULL AUTO_INCREMENT ,
NICK VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
EMAIL VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
WEB VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
VZKAZ VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
DATUM VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
PRIMARY KEY (ID)
)";
if (mysqli_query($spojeni, $vytvor_knihu)) {
    echo "Tabulka Clanky byla vytvořena";
} else {
    echo "Chyba, tabulka nebyla vytvořena: " . mysqli_error($spojeni);
}
mysqli_close($spojeni);
?>

V dalším kroku je vytvořen soubor, který umožňuje vepsat a následně poslat data do návštěvní knihy. Můžeme jej např. nazvat kniha.php

<?php
 header("Content-Type: text/html; charset=utf-8");
//řádek kvůli správnému kódování
 include('db.php');
//vložení externího souboru s připojením
?>

<form action="" method="post">
  <div class="form-group">
    <label for="nick">Nick:</label>
    <input type="text" class="form-control" name="nick">
  </div>
  <div class="form-group">
    <label for="email">Email:</label>
    <input type="text" class="form-control" name="email">
  </div>
  <div class="form-group">
    <label for="web">Váš web:</label>
    <input type="text" class="form-control" name="web">
  </div>
  <div class="form-group">
    <label for="comment">Vzkaz:</label>
    <textarea id="summernote" class="form-control" rows="5" name="vzkaz"></textarea>
  </div>
  <div class="form-group">
    <label for="kontrola">Kontrolní otázka - Kolik je jedna a jedna (slovem):</label>
    <input type="text" class="form-control" name="kontrola">
  </div>
  <button type="submit" class="btn btn-success">Odeslat vzkaz</button>

</form>
<!-- všimněte si, že formulář není součástí php kódu -->
<?php
if (!empty ($_POST))
// empty - prázdný a jeho negace nebo-li
// pokud bylo cokoliv zadáno do formuláře, začne se vykonávat následující podmínka
{
 // přijme všechny zadané informace do formuláře
 $nick = $_REQUEST["nick"];
 $email = $_REQUEST["email"];
 $web = $_REQUEST["web"];
 $vzkaz = $_REQUEST["vzkaz"];
 $datum = StrFTime("%d.%m.%Y", Time());
 // Kontrolní otázka kvůli SPAMu
 $kontrola = $_REQUEST["kontrola"];
 // pokud byly vyplněn alespoň nick a vzkaz a pokud je správně zodpovězena kontrolní otázka, může se nový příspěvek uložit do databáze
 if(($nick!="") and ($vzkaz!="") and ($kontrola=="dva")) 
 {
 // uloží se nový vzkaz do databáze a vrátí 1
 $zapis = mysqli_query($spojeni, "INSERT INTO kniha (NICK, EMAIL, WEB, VZKAZ, DATUM) 
 VALUES ('$nick','$email','$web','$vzkaz','$datum');");
 // Hláška o zdárném zápisu
 echo ("<h1>Vzkaz přidán</h1>");
 }
 
// pokud nebyl doplňěn nick a vzkaz nebo je chybná kontrolní otázka, zahlasí výzvu
else {
  echo ('<div class="alert alert-danger">
  <strong>Chyba!</strong> Musíte vyplnit alespoň Nick, Vzkaz a Kontrolní otázku.</div>');
} 
} 
 // vloží externí soubor s výpisem všech vzkazů, které jsou uloženy v databázi
 include('vzkazy.php');
?>

Poslední částí je externí soubor, který zabezpečuje vypsání dat z databáze s názvem vzkazy.php:

<?php
 
$pocet_vzkazu = mysqli_query($spojeni, "SELECT COUNT(*) as pocet FROM kniha;"); 
//přečte počet vzkazů v databázi
$cislo = mysqli_fetch_array($pocet_vzkazu);
//sql příkaz na počet řádků
$celkem_vzkazu = $cislo["pocet"];
 
 echo "<b>Celkový počet vzkazů: ".$celkem_vzkazu."</b><hr>";
$vzkazy = mysqli_query($spojeni, "SELECT * FROM kniha;");
 
 // pokud nebyly načteny žádné vzkazy, vypiš chybu
 if(!$vzkazy){
 echo "Chyba při načtení vzkazů !!";
 }
 // jinak ulož vzkazy do pole a postupně je vypiš
 else{
 // cyklus while projde všechny vzkazy,
 // pomoci pole $vzkaz[""] vypíše všechny informace jednotlivých vzkazů
 while ($vzkaz = mysqli_fetch_array($vzkazy))
 {
 echo $vzkaz["ID"]."<br />";
 echo $vzkaz["NICK"]."<br />";
 echo $vzkaz["EMAIL"]."<br />";
 echo $vzkaz["WEB"]."<br />";
 echo $vzkaz["VZKAZ"]."<br />";
 echo $vzkaz["DATUM"]."<br />";
 }
 } 
?>

Funkční návštěvní knihu (bez jakéhokoliv CSS) najdete v tomto demu.

Úkoly ke kapitole:

  1. Pokuste se vložit tuto návštěvní knihu do webové stránky s bootstrapem a doplňte jak formulář, tak výpisy vzkazů kaskádovými styly (můžete se inspirovat např. zde)
  2. Dále zkuste změnit tvar (podobu) datumu zápisu na den + přesný čas.
  3. Přejmenujte patřičný soubor a případné odkazy na něj tak, aby návštěvní kniha „startovala“ z určitého adresáře, ve kterém jsou soubory návštěvní knihy uloženy
  4. Vytvořte ochranu proti robotům např. ve formě kontrolní otázky (tedy za pomoci podmínky…)
  5. Do formulářového prvku Vzkaz importujte jednoduchý editor (např. https://summernote.org/).
  6. Další větší úpravou je vytvoření stránkování (např. jako v tomto demu).
    Zdrojové kódy k tomuto demu – navstevni-kniha-bs.zip

Další položky, které lze ukládat jako součást zápisu do návštěvní knihy

IP adresa

Jako další informaci, kterou můžeme ukládat do databáze je např. IP adresa uživatele. To můžeme v PHP detekovat velmi jednoduše:

echo 'Vaše IP adresa je ' . $_SERVER['REMOTE_ADDR'];

Toto zjištění IP adresy $_SERVER[‚REMOTE_ADDR‘] je možné pouze v případě, že bylo PHP voláno z prohlížeče. V CLI režimu (například spuštění z Terminálu cronem) není IP adresa k dispozici. Do databáze lze pak tuto adresu uložit např. jako hodnotu varchar(39), kam se vejde jak IP verze 4. tak IP verze 6.

Zjišťování, ukládání i následná práce s IP adresami je však značně obšírnější a přináší bohužel další problémy. Více např. v tomto článku – php.baraja.cz/ip-adresa.

image_pdfPDF