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:
- 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)
- Dále zkuste změnit tvar (podobu) datumu zápisu na den + přesný čas.
- 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
- Vytvořte ochranu proti robotům např. ve formě kontrolní otázky (tedy za pomoci podmínky…)
- Do formulářového prvku Vzkaz importujte jednoduchý editor (např. https://summernote.org/).
- 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.