- 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);
}
?>
- Základní údaje
- Kategorie: PHP
- Zobrazení: 322
Pokud potřebujeme, aby se datumové údaje vypisovaly česky, nestačí nám pouze vestavěná funkce PHP Date. Lze to vyřešit např. pomocí polí:
<html>
<head>
<meta charset="utf-8">
<title>Datum a čas v PHP česky</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<center><font face="Arial CE, Arial" size="5">
<?php
$mesice = array ("ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince");
$den = array("neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota");
echo "<h1>Datum a čas v PHP česky: </h1><p>Je " . $den[Date ("w")]. ", " . Date ("d") . ". ". $mesice[Date ("n") - 1] . " " . Date ("Y") . ", " . Date ("H:i:s") . "</p>";
?>
</font></center>
</body>
</html>
- Základní údaje
- Kategorie: PHP
- Zobrazení: 254
Pro odesílání zpráv na email (např. pro kontaktní formuláře) existuje mnoho způsobů. V PHP můžeme využít např. funkci mail nebo mb_send_mail. Rozdíl mezi funkcemi mail a mb_send_mail:
- mail je pro jednobajtové znakové sady (např. iso nebo ascii)
- mb_send_mail je pro vícebajtové znakové sady, jako je utf-8
Tzn. že se nejčastěji používá funkce mb_send_mail. Tato funkce vyžaduje, aby byla na webhostingu povolena. Např. na Endoře.cz u free tarifu je zakázána. Pak je potřeba použít variantu s použitím SMTP protokolu. Příklad použití funkce mb_send_mail:
<?php
mb_internal_encoding("UTF-8");
$hlaska = '';
if (isset($_GET['uspech']))
echo 'Email byl úspěšně odeslán, brzy vám odpovíme.';
if ($_POST) // V poli _POST něco je, odeslal se formulář
{
if (isset($_POST['jmeno']) && $_POST['jmeno'] &&
isset($_POST['email']) && $_POST['email'] &&
isset($_POST['zprava']) && $_POST['zprava'] &&
isset($_POST['rok']) && $_POST['rok'] == date('Y'))
{
$hlavicka = 'From:' . $_POST['email'];
$hlavicka .= "\nMIME-Version: 1.0\n";
$hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
$adresa = 'adresa[zavináč]domena.cz';
$predmet = 'Nová zpráva z mailformu';
$zprava = 'Od: '.$_POST['jmeno']. '<br>Text zprávy: '.$_POST['zprava'];
$uspech = mb_send_mail($adresa, $predmet, $zprava, $hlavicka);
if ($uspech)
{
header('Location: kontakt.php?uspech=ano');
exit;
}
else
$hlaska = 'Email se nepodařilo odeslat. Zkontrolujte adresu.';
}
else
$hlaska = 'Formulář není správně vyplněný!';
}
?>
<h2>Můžete nás kontaktovat pomocí formuláře níže.</h2>
<?php
if ($hlaska)
echo('<p>' . htmlspecialchars($hlaska) . '</p>');
$jmeno = (isset($_POST['jmeno'])) ? $_POST['jmeno'] : '';
$email = (isset($_POST['email'])) ? $_POST['email'] : '';
$zprava = (isset($_POST['zprava'])) ? $_POST['zprava'] : '';
?>
<form method="POST">
<table>
<tr>
<td>Vaše jméno</td>
<td><input name="jmeno" type="text" value="<?= htmlspecialchars($jmeno) ?>"/></td>
</tr>
<tr>
<td>Váš email</td>
<td><input name="email" type="email" value="<?= htmlspecialchars($email) ?>"/></td>
</tr>
<tr>
<td>Aktuální rok</td>
<td><input name="rok" type="number" /></td>
</tr>
<tr>
<td>Zpráva</td>
<td><textarea name="zprava"><?= htmlspecialchars($zprava) ?></textarea></td>
</tr>
</table>
<input type="submit" value="Odeslat" />
</form>
Hotový formulář si můžete vyzkoušet.
- Základní údaje
- Kategorie: PHP
- Zobrazení: 280
Při vytváření menu někdy chceme, aby položka, na kterou je kliknuto zůstala aktivní - zůstala např. podržená, zvýrazněná apod. Řešíme to nejčastěji pomocí pseudotřídy v CSS - a:hover. Pokud máme webové stránky v PHP skládané s jednotlivých částí pomocí příkazu include nebo require, pak máme společné menu v jednom souboru, pak tento požadavek můžeme řešit např. za pomoci podmínky. Klasické menu vypadá např. takto:
<ul>
<li><a href="/index.php">Úvod</a></li>
<li><a href="/o-nas.php">O nás</a></li>
<li><a href="/reference.php">Reference</a></li>
<li><a href="/kontakt.php">Kontakt</a></li>
</ul>
V rámci frameworku Bootstrap pak dále např. takto:
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/index.php">Úvod</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/o-nas.php">O nás</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/reference.php">Reference</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/kontakt.php">Kontakt</a>
</li>
</ul>
</div>
</nav>
Pokud chceme, aby zůstala aktivní položka menu, na kterou bylo kliknuto, stačí přidat třídu active (v příkladu níže je to položka Reference):
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/index.php">Úvod</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/o-nas.php">O nás</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/reference.php">Reference</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/kontakt.php">Kontakt</a>
</li>
</ul>
</div>
</nav>
Tato varianta ale nebude fungovat, pokud budeme mít ve stránce menu vložené (např. pomocí příkazu include...), a tedy stále stejné na každé stránce, kterou načítáme. Tak že tam už musíme použít např. podmínku:
<nav>
<ul>
<li <?php if($_GET['stranka'] == 'uvod' || $_GET['stranka'] == ''): ?>class="aktivni"<?php endif; ?>><a href="/index.php">Titulní strana</a></li>
<li <?php if($_GET['stranka'] == 'o-mne'): ?>class="aktivni"<?php endif; ?>><a href="/php?layout=blog&stranka=o-mne&start=20">O mně</a></li>
<li <?php if($_GET['stranka'] == 'reference'): ?>class="aktivni"<?php endif; ?>><a href="/php?layout=blog&stranka=reference&start=20">Reference</a></li>
<li <?php if($_GET['stranka'] == 'kontakt'): ?>class="aktivni"<?php endif; ?>><a href="/php?layout=blog&stranka=kontakt&start=20">Kontakt</a></li>
</ul>
</nav>
- Pozn. 1: tato varianta není doplněna o Bootstrap styly.
- Pozn. 2: u první položky "Titulní strana" si všimněte, že podmínka kontroluje, zda bylo kliknuto na položku uvod nebo pokud je načtena čistá adresa webu, tedy bez jakýchkoliv parametrů v adrese (přes metodu _GET)
- Pozn. 3: samotný kód takto testovat nemůžete. Musel by se ještě doplnit o chybějící definice.
Existuje spousta dalších možností, jak to můžeme vyřešit. Jednou z nich je např. použití pole - array (viz níže). Součástí kódu je i "obarvení" aktivní (nakliknuté) položky na červeno. Některé řádky jsou vysvětleny přímo v kódu.
<style>
/* aktivní položky menu budou mít červenou barvu */
li.active a {
color: red;
}
</style>
<nav>
<ul>
<!-- Vytvoření proměnné menu, které bude obsahovat pole, reprezentované stránkami.-->
<!-- názvy polí josu součásti URL adresy, načítané přes metodu _GET-->
<?php $menu = array(
'uvod' => 'Úvod',
'onas' => 'O nás',
'reference' => 'Reference',
'kontakt' => 'Kontakt',
);
/* Vytvoření proměnné active, do které se dosadí hodnota z metody _GET s názvem stranka, pokud existuje (je nastavena) přes konstrukt isset. Pokud ne, dosadí se uvod - tedy titulní stránka webu. Toto funguje až od verze PHP 7 */
$active = isset($_GET['stranka']) ? $_GET['stranka'] : 'uvod';
?>
<!-- Cyklus foreach postupně vypisuje pole obsažené v proměnné menu, a to tak, že z tohoto pole vypíše vždy jeho název (title), což je pak položka menu -->
<?php foreach ($menu as $url=>$title) : ?>
<!-- V každé položce menu (položka nečíslovaného seznamu li) se zavolá třída active tehdy, pokud je součástí URL. Pokud ne, bude to pouze odkaz -->
<li <?= $url == $active ? 'class="active"' : '' ?>>
<a href="/php?layout=blog&stranka=<?=%20$url%20?>=&start=20">
<?= $title ?>
</a>
</li>
<?php endforeach ?>
</ul>
</div>
</nav>
Vyzkoušejte v tomto demu. Dále je vhodné doplnit kód o fragmenty frameworku Bootstrap (tentokrát již bez vysvětlování v kódu):
<nav class="navbar navbar-expand-sm bg-info navbar-dark">
<!-- Položky menu -->
<ul class="navbar-nav">
<?php $menu = array(
'uvod' => 'Úvod',
'onas' => 'O nás',
'reference' => 'Reference',
'kontakt' => 'Kontakt',
);
$active = isset($_GET['stranka']) ? $_GET['stranka'] : 'uvod';
?>
<?php foreach ($menu as $url=>$title) : ?>
<li <?= $url == $active ? 'class="active"' : '' ?>>
<a class="nav-link" href="/php?layout=blog&stranka=<?=%20$url%20?>=&start=20">
<?= $title ?>
</a>
</li>
<?php endforeach ?>
</ul>
</nav>
Bez napojení na knihovny Bootstrap to samozřejmě nebude fungovat, tak že si musíme tyto položky doplnit. nejlépe tak, že celé menu zakomponujeme do hotové stránky. To opět můžeme učinit např. za pomoci příkazu include:
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<title>Vzorový web s napojením na BS 4</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="/mujstyl.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css" integrity="sha384-lZN37f5QGtY3VHgisS14W3ExzMWZxybE1SJSEsQp9S+oqd12jhcu+A56Ebc1zFSJ" crossorigin="anonymous">
<link rel="icon" href="/foto/favikona.ico" type="image/x-icon">
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>Ukázka dynamického provedení menu</h1>
</div>
<!-- Tady bude menu -->
<?php
include 'menu.php';
?>
<!-- Konec menu -->
<div class="jumbotron text-center paticka">
<p>Patička webu (Footer)... © <?php echo date('Y')?></p>
</div>
<!-- nemazat -->
</div>
</body>
</html>
Součástí je také soubor mujstyl.css v adresáři css. Ten může vypadat nějak takto:
.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {
color: rgba(255,255,255,.75);
background-color: rgb(255, 0, 0);
}
.active {
background-color: red;
}
.paticka {
padding: 10px 0px;
background-color: #383d41;
color: white;
}
Výsledek pak vypadá takto:
Ještě potřebujeme, aby se po kliknutí na danou položku zobrazoval správný obsah webu.
- Základní údaje
- Kategorie: PHP
- Zobrazení: 350
Nahrávání souborů přes webovou stránku má dvě části:
- samotné zobrazení formulářového prvku pro nahrání souboru(ů) - jednoduchý HTML kód
- zpracování souboru(ů) a uložení na server - složitější část (PHP script)
Dnes (rok 2024) můžeme využít některý z nástrojů chytré inteligence, abychom si nechali kompletní fungování vygenerovat. Např. Copilot od Microsoftu. Pro vygenerování zadáme např. požadavek v tomto provedení: "Vytvoř mi PHP script na nahrávání obrázků a jejich zobrazení. Script nesmí používat databázi. Vložené fotografie poskládej do galerie tak, aby měly náhledy rozměr 200px x 200px. Využij na galerii JavaScript, např. Lightbox2 nebo podobné." Copilot vygeneroval např. tento kód:
<?php
// Nastavení cílového adresáře pro nahrané soubory
$target_dir = "uploads/";
if (!is_dir($target_dir)) {
mkdir($target_dir, 0777, true);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// Kontrola, zda je soubor skutečně obrázek
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if ($check !== false) {
echo "Soubor je obrázek - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "Soubor není obrázek.";
$uploadOk = 0;
}
// Kontrola, zda soubor již existuje
if (file_exists($target_file)) {
echo "Soubor již existuje.";
$uploadOk = 0;
}
// Povolení pouze určitých formátů souborů
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
echo "Povoleny jsou pouze JPG, JPEG, PNG a GIF soubory.";
$uploadOk = 0;
}
// Kontrola, zda je $uploadOk nastaven na 0 kvůli chybám
if ($uploadOk == 0) {
echo "Soubor nebyl nahrán.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "Soubor " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " byl úspěšně nahrán.";
} else {
echo "Při nahrávání souboru došlo k chybě.";
}
}
}
// Zobrazení nahraných obrázků
$files = glob($target_dir . "*.{jpg,jpeg,png,gif}", GLOB_BRACE);
foreach ($files as $file) {
echo '<a href="' . $file . '" data-lightbox="gallery"><div class="thumbnail" style="background-image: url('/ . $file . ');"></div></a>';
}
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Nahrávání obrázků</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css" rel="stylesheet">
<style>
.thumbnail {
width: 200px;
height: 200px; /* Poměr stran 1:1 */
background-size: cover;
background-position: center;
margin: 10px;
display: inline-block;
}
</style>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
Vyberte obrázek k nahrání:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Nahrát obrázek" name="submit">
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox.min.js"></script>
</body>
</html>
Někdy je robotem vygenerován jiný kód nebo také chybný. Zkuste si sami postupně zadávat různé požadavky a sledovat výsledek vygenerovaného kódu.