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.