- Základní údaje
- Kategorie: PHP
- Zobrazení: 116
Tento příklad je pomůcka pro zjištění správné váhy. Je zde využit tzv. Body Mass Index (BMI), který se vypočítá takto: BMI = váha / (výška x výška) POZN.: váha musí být v kg a výška v metrech! Tabulka figury člověka podle BMI:
Podvyživený | BMI je menší než 15 |
Podváha | BMI je menší než 18,5 |
Ideální | BMI je od 18,5 do 25 |
Nadváha | BMI je od 25 do 30 |
Obezita | BMI je od 30 do 40 |
Nadměrně obézní | BMI je větší než 40 |
První stránka pro zadání hodnot vypadá takto:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Zadejte Vaše parametry</title>
</head>
<body>
<form action="vysledek.php" method="post">
Zadej váhu: <input type="text" name="vaha"> kg<br />
Zadej výšku: <input type="text" name="vyska"> cm<br />
<input type="submit" value="Spočítej figuru">
</form>
</body>
</html>
Hodnota výšky se zadává běžně v cm, což je následně ve vyhodnocovacím skriptu potřeba převést na metry. Druhá stránka, která má spočítat BMI:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Informace o figuře</title>
</head>
<body>
<?php
$vaha = $_POST['vaha'];
$vyska = $_POST['vyska'];
$vyska_v_metrech = $vyska / 100.0;
//tato proměnná se vytváří jen proto, aby se převedla výška na metry
$BMI = $vaha / ($vyska_v_metrech * $vyska_v_metrech);
echo 'Vaše BMI = ', $BMI;
echo '<br /><br />';
if ($BMI < 15)
echo 'Jste podvyživený/á';
else if ($BMI < 18.5)
echo 'Máte podváhu';
else if ($BMI < 25)
echo 'Máte ideální postavu';
else if ($BMI < 30)
echo 'Máte nadváhu';
else if ($BMI < 40)
echo 'Jste obézní';
else
echo 'Jste nadměrně obézní';
?>
</body>
</html>
- Základní údaje
- Kategorie: PHP
- Zobrazení: 793
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.
- Základní údaje
- Kategorie: PHP
- Zobrazení: 460
Nejdříve si v databázi vytvoříme tabulku Clanky, do které budeme ukládat všechny články. Jednotlivé sloupce tabulky budou tyto:
- ID (zároveň primární klíč),
- název článku,
- autor,
- obsah článku
- a datum.
Tuto tabulku můžete buď vytvořit ručně přes nějaké rozhraní typu Adminer nebo PHPMyAdmin a nebo jej můžete spustit přes soubor, který vidíte níže. Název může být např. vytvor-clanky.php. Soubor obsahuje příkazy SQL a je napojen na db.php, který zabezpečuje připojení k databázi. Ten samozřejmě musíte vytvořit nejdříve (viz předcházející kapitola). Soubor vytvor-clanky.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_clanky = "CREATE TABLE Clanky (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
nazev VARCHAR(30) NOT NULL,
autor VARCHAR(30) NOT NULL,
obsah TEXT,
datum VARCHAR(30) NOT NULL
)";
if (mysqli_query($spojeni, $vytvor_clanky)) {
echo "Tabulka Clanky byla vytvořena";
} else {
echo "Chyba, tabulka nebyla vytvořena: " . mysqli_error($spojeni);
}
mysqli_close($spojeni);
?>
Samotný příkaz SQL vypadá takto:
CREATE TABLE Clanky (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
nazev VARCHAR(30) NOT NULL,
autor VARCHAR(30) NOT NULL,
obsah TEXT,
datum VARCHAR(30) NOT NULL
)
Dále si vytvoříme soubor, kterým budeme články vytvářet - novy-clanek.php:
<?php
require 'db.php' ;
?>
<form action="" method="post">
Název článku:<br>
<input type="text" name="nazev"><br>
Autor:<br>
<input type="text" name="autor"><br>
Obsah článku:<br>
<textarea name="obsah"></textarea><br>
<input type="submit" value="Uložit článek">
</form>
<?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
$nazev = $_REQUEST["nazev"];
$autor = $_REQUEST["autor"];
$obsah = $_REQUEST["obsah"];
$datum = StrFTime("%d.%m.%Y", Time());
// uložíme data do databáze
$novy_clanek = mysqli_query($spojeni, "INSERT INTO Clanky (nazev, autor, obsah, datum)
VALUES ('$nazev', '$autor', '$obsah','$datum')");
// Po uložení vypíše hlášku
echo ("Článek byl uložen<br>");
}
echo ('<a href="/vypis.php">Výpis článků</a>');
mysqli_close($spojeni);
?>
V závěru předchozího kódu "voláme" soubor vypis.php, kterým si necháme vypsat všechny články v databázi:
<?php
require 'db.php';
$vysledek = mysqli_query($spojeni, "SELECT * FROM Clanky ORDER BY datum DESC");
// Načtení článků seřazených podle datumu
while($data = mysqli_fetch_assoc($vysledek))
{
echo "<i>Název: </i><b>";
echo $data['nazev'];
echo "</b><br><i>Autor: </i>";
echo $data['autor'];
echo "<br><i>Vytvořeno: </i>";
echo $data['datum'];
echo "<br><i>Obsah článku:</i><br>";
echo $data['obsah'];
echo "<hr>";
}
?>
Na konec ještě vytvoříme základní rozhraní, např. takto:
<h1>Jednoduchý systém na ukládání článků do databáze</h1>
<p><a href="/novy-clanek.php">Vytvořit nový článek</a></p>
<p><a href="/vypis.php">Výpis článků</a></p>
POZOR! Odstraňte lomítka v adrese odkazů (vytváří se automaticky redakčním systémem...).
Prohlédněte si demo Takovýto systém ovšem neumožňuje editovat uložené články.
Další inspirace ke kapitole:
- zkuste vytvořit ve formuláři pro odesílání článků ochranu před roboty
- doplňte stránky o CSS např. formou frameworku
- Základní údaje
- Kategorie: PHP
- Zobrazení: 302
Protokol HTTP, který slouží ke komunikaci mezi www serverem a prohlížečem je bezstavový. Tzn., že mezi jednotlivými přechody stránek se neudržuje žádné spojení. Když kliknete na odkaz, pouze se spojí klient se serverem, server pošle stránku a spojení se ukončí. Pokud ale potřebujete znát obsah hodnoty proměnné, kterou uživatel odeslal formulářem asi tak o 3 stránky dříve, bez session se neobejdeme.
Jaká je hlavní činnost session:
- identifikaci uživatele
- uchovávání obsahu proměnných
Pro identifikaci uživatele stačí správně identifikovat opětovné přístupy od téhož uživatele. Samotná data přiřazená ke konkrétnímu uživateli již není třeba mezi stránkami sdílet, ale lze je ukládat na server a odkazovat se na ně. Na tomto principu jsou založeny sessions. Při jejich vytváření je uživateli vygenerován unikátní identifikátor sloužící k jeho rozpoznání a umožňující přistupovat ke konkrétnímu datovému souboru. Pro sdílení mezi jednotlivými stránkami tento identifikátor uložíme do cookie, kterou prohlížeč na server odesílá při každém načítání stránky. Data samotná jsou defaultně uložena v serializované podobě v souboru uloženém na serveru a pojmenovaném podle uvedeného identifikátoru. Příklad http requestu (vyžádání nějaké URL adresy):
GET /wiki/Wikipedie HTTP/1.1
Host: cs.wikipedia.org
Accept-Charset: UTF-8,*
Zde vidíme zcela běžnou obecnou hlavičku, kde není spuštěn příkaz (funkce session) a server odpovídá anonymnímu uživateli.
GET /programujeme-v-php/sessions?rev=1 HTTP/1.1
Host: pehapko.cz
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en,cs;q=0.8
Cookie: PHPSESSID=9g0jg1mgs26c1i0e4hok7rgbd1; nette-browser=spx2kdfq2y
V druhém případě již hlavička obsahuje záznamy o cookies, vidíme tady hned dvě. Cookie s název PHPSESSID je klíč k identifikaci uživatele. Cookie nette-browser není tak důležitý. Identifikuje prohlížeč. Pokud není na serveru nastavený session.auto_start (což ve výchozím stavu není), zahájíme session relaci funkcí session_start(). Kvůli nastavování cookie musíme tuto funkci volat před jakýmkoliv výstupem, typicky zcela na začátku souboru (až na výjimky...). V této chvíli již můžeme začít pracovat se superglobálním polem $_SESSION (dříve $HTTP_SESSION_VARS). Hodnotu do session přiřadíme běžným operátorem přiřazení $_SESSION['time'] = time(). Přečíst (s vypsáním) ji můžeme standardní konstrukcí echo $_SESSION['time']. Obecně lze říci, že se session pracujeme jako s běžným polem, můžeme používat in_array, isset, unset a podobně všechny funkce pro práci s poli, jak byly uvedeny v díle o polích. Jediný rozdíl při práci mezi session a běžnými poli je jejich superglobálnost, tj. jsou viditelé v libovolné funkci. Pozn. Na rozdíl od nastavení cookie pomocí setcookie() se změna session projeví ještě na téže stránce (změněná cookie až po reloadu, protože obvykle neupravujeme přímo $_COOKIE). Příklad základní práce se session – čas strávený na stránce a další statistiky
<?php
session_start();
$firstVisit = false;
if (!isset($_SESSION['firstVisit']))
{
$_SESSION['firstVisit'] = new \Datetime;
$_SESSION['lastVisit'] = new \Datetime;
$_SESSION['count'] = 0;
$firstVisit = true;
}
$timeSum = (new \Datetime)->diff($_SESSION['firstVisit']);
$timeLast = (new \Datetime)->diff($_SESSION['lastVisit']);
$lastVisit = $_SESSION['lastVisit'];
$_SESSION['lastVisit'] = new \Datetime;
$_SESSION['count']++;
echo ($firstVisit ? 'Vítejte, jste u nás poprvé.' : 'Děkujeme, že se k nám vracíte.') . PHP_EOL;
echo '<br>Čas první návštěvy: ' . $_SESSION['firstVisit']->format('H:i:s - d.m.Y') . PHP_EOL;
echo '<br>Celkový čas strávený na našich stránkách: '. $timeSum->format('%H:%i:%s') . PHP_EOL;
echo '<br>Čas předchozí návštěvy: ' . $lastVisit->format('H:i:s') . PHP_EOL;
echo '<br>Čas od předchozí návštěvy: ' . $timeLast->format('%H:%i:%s') . PHP_EOL;
echo '<br>Počet návštěv: ' . $_SESSION['count'] . PHP_EOL;
?>
Vyzkoušejte si tento příklad takto:
- Aktualizacemi téže stránky se budou měnit časové údaje. Aplikace si pamatuje svoji historii.
- Otevřete si stránku ve dvou různých prohlížečích (nebo v jednom + anonymním režimu) a paralelně jednotlivé stránky aktualizujte. Ověřte, že se jednotlivé relace neovlivňuji.
- Naopak otevřete stránku ve dvou běžných oknech prohlížeče (sdílejících cookies). Zjistíte, že nyní se relace vzájemně ovlivňují.
- Můžete vytvořit několik (volitelně odkazy provázaných) stránek a includovat do nich výše uvedený kód. Zjistíte, že se session sdílí mezi stránkami (session_start() musí být na každé stránce).
- Můžete si měnit jednotlivé cookie, když je smažete, bude vaše návštěva označena jako první. Zakážete-li ve svém prohlížeči přijímat cookies, pokaždé bude návštěva označena jako první.
- Výchozí nastavení pamatování si session bývá 24 minut (1440 sekund), nechte relaci delší dobu neaktivní a pak zkuste aktualizovat. Zřejmě uvidíte, že se v relaci pokračuje a nic se nestalo, mazání starých záznamů je totiž pravděpodobnostní. Existence po dobu 24 minut od poslední aktualizace je zaručena. Smazání po této době nikoliv, to závisí na aktivitě garbage collectoru, která je při výchozím nastavení 0.01, tj. s pravděpodobností 1 % při každé inicializaci smaže staré session záznamy. **Na některých systémech (Debian, Ubuntu) bývá gc zcela neaktivní a mazání periodicky provádí cronová úloha.
Demo k testování. Zdroj: http://www.pehapko.cz/programujeme-v-php/sessions
- Základní údaje
- Kategorie: PHP
- Zobrazení: 292
Toto jednoduché počítadlo přístupů v PHP se skládá z několika částí. V první části příkazem session_start() zajistíme, aby se započítal z naší adresy pouze jeden přístup (tedy alespoň co se týče defaultní doby, po kterou si nás server pamatuje) Počet přístupů se zapisuje do textového souboru, umístěného např. ve stejné složce, jako samotné počítadlo. V tomto případě se jedná o soubor pocitadlo.txt, který je potřeba si vytvořit. V druhé části se právě příkazem fopen tento soubor "otevírá" a parametrem "r" zajistíme, aby z něj skript mohl číst (více o funkci fopen). Dále funkcí fgets přečteme data souboru pocitadlo.txt. Číslice 1000 je maximální počet znaků. Pokud tedy budeme předpokládat vyšší počet, je potřeba číslo zvětšit (více o funkci fgets). Po přečtení je vhodné soubor zase zavřít - fclose (více o funkci fclose). Nyní je v paměti tedy uloženo číslo, které reprezentuje posledního návštěvníka a následně jej potřebujeme zvětšit o jedno (+1) a nechat vypsat. V poslední části je kontrola stavu session a v případě, že se jedná o novou návštěvu, je tento stav opět za pomoci otevření souboru pocitadlo.txt s parametrem "w" (právo zápisu) zapsán a následně je soubor uzavřen.
<?php
session_start();
// Otevření souboru pocitadlo.txt ke čtení
$data = fopen("pocitadlo.txt","r");
$pocet = fgets($data,1000);
fclose($data);
$pocet=$pocet + 1 ;
echo "$pocet" ;
echo " přístupů" ;
echo "\n" ;
if(!isset($_SESSION['hasVisited'])){
$_SESSION['hasVisited']="yes";
// Otevření souboru pocitadlo.txt k zápisu
$data = fopen("pocitadlo.txt","w");
fwrite($data, $pocet);
fclose($data);
}
?>