18. Jednoduchá návštěvní kniha

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
$dbhost = 'server.xy'; // server, kde se nachází databáze
$dbname = 'databaze'; // jméno databáze
$dbuser = 'uzivatel'; // uživatelské jméno
$dbpass = 'heslo'; // heslo
 
$spojeni = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
//vytvoření proměnné $connect, která provede připojení na server a databázi
// Následuje kontrola spojení
if (!$spojeni){
 // vykřičník vyjadřuje negaci nebo-li není-li spojení, pak...
 echo("Chyba: Nepodařilo se připojit k serveru!");
 exit;
}
mysqli_set_charset($spojeni, 'utf8');
// správné nastavení kódování databáze
?>

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 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/).