Obsługa ciasteczek (cookies) + baner zgody bez JavaScriptu
- WWW i API
- poziom: początkujący
- aktualizacja: 12 lipca 2026
Ciasteczka to najprostszy sposób zapamiętania czegoś o odwiedzającym: wybranego motywu, zawartości koszyka czy faktu zamknięcia komunikatu. Ten skrypt pokazuje poprawny, współczesny zapis cookies (z flagami bezpieczeństwa, o których stare poradniki milczą) oraz baner informacyjny działający w 100% po stronie PHP.
<?php
/**
* Obsługa ciasteczek + baner zgody — skryptyPHP.com
* Zapisz jako: ciasteczka-demo.php
* WAŻNE: ciasteczka ustawiamy PRZED wysłaniem jakiegokolwiek HTML.
*/
// ── FUNKCJE POMOCNICZE ──────────────────────────────────────
/**
* Ustawia ciasteczko z bezpiecznymi flagami.
*
* @param int $dni na ile dni zapisać (0 = do zamknięcia przeglądarki)
*/
function ustaw_ciasteczko(string $nazwa, string $wartosc, int $dni = 365): void
{
setcookie($nazwa, $wartosc, [
'expires' => $dni > 0 ? time() + $dni * 86400 : 0,
'path' => '/',
'secure' => !empty($_SERVER['HTTPS']), // tylko po HTTPS (gdy jest)
'httponly' => true, // niedostępne dla JavaScriptu
'samesite' => 'Lax', // ochrona przed CSRF
]);
}
/** Odczytuje ciasteczko (null, gdy nie istnieje). */
function czytaj_ciasteczko(string $nazwa): ?string
{
return isset($_COOKIE[$nazwa]) ? (string) $_COOKIE[$nazwa] : null;
}
/** Usuwa ciasteczko. */
function usun_ciasteczko(string $nazwa): void
{
setcookie($nazwa, '', [
'expires' => time() - 3600,
'path' => '/',
]);
unset($_COOKIE[$nazwa]);
}
// ── BANER INFORMACYJNY O CIASTECZKACH (bez JavaScriptu) ─────
// Kliknięcie „Rozumiem" wysyła formularz; zapamiętujemy decyzję na rok
if (($_POST['akcja'] ?? '') === 'akceptuj_cookies') {
ustaw_ciasteczko('cookies_ok', '1', 365);
// Przekierowanie, aby odświeżenie nie ponawiało formularza
header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?'));
exit;
}
$pokaz_baner = czytaj_ciasteczko('cookies_ok') === null;
// ── PRZYKŁAD: zapamiętanie wybranego motywu strony ──────────
if (isset($_GET['motyw']) && in_array($_GET['motyw'], ['jasny', 'ciemny'], true)) {
ustaw_ciasteczko('motyw', $_GET['motyw'], 90);
header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?'));
exit;
}
$motyw = czytaj_ciasteczko('motyw') ?? 'jasny';
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ciasteczka w praktyce</title>
<style>
body { font-family: sans-serif; max-width: 640px; margin: 20px auto;
<?= $motyw === 'ciemny' ? 'background:#1c1e26;color:#eee;' : '' ?> }
.baner-cookies {
position: fixed; left: 0; right: 0; bottom: 0;
background: #2b2d3a; color: #fff; padding: 14px 20px;
display: flex; gap: 16px; align-items: center; flex-wrap: wrap;
}
.baner-cookies form { margin: 0; }
.baner-cookies button { padding: 8px 20px; cursor: pointer; }
a { color: inherit; }
</style>
</head>
<body>
<h1>Motyw: <?= htmlspecialchars($motyw) ?></h1>
<p>Wybierz motyw strony (zapamiętamy go w ciasteczku na 90 dni):</p>
<p>
<a href="?motyw=jasny">Jasny</a> |
<a href="?motyw=ciemny">Ciemny</a>
</p>
<?php if ($pokaz_baner): ?>
<div class="baner-cookies">
<span>
Ta strona używa ciasteczek do zapamiętywania Twoich ustawień.
</span>
<form method="post" action="">
<button type="submit" name="akcja" value="akceptuj_cookies">
Rozumiem
</button>
</form>
</div>
<?php endif; ?>
</body>
</html>
Jak użyć tego skryptu
- Zapisz kod jako
ciasteczka-demo.phpi przetestuj: zmień motyw, odśwież stronę, zamknij baner. - Funkcje
ustaw_ciasteczko(),czytaj_ciasteczko()iusun_ciasteczko()przenieś do wspólnego pliku i używaj w całym serwisie. - Pamiętaj o kolejności: najpierw cała logika ciasteczek, dopiero potem pierwszy znak HTML.
- Wartość ciasteczka ustawionego w tym żądaniu odczytasz z
$_COOKIEdopiero przy następnym — dlatego skrypt po zapisie przekierowuje.
Warto wiedzieć
- Flaga
httponlychroni ciasteczko przed odczytem z JavaScriptu (utrudnia kradzież przy XSS), asamesite=Laxogranicza wysyłanie go z obcych stron. - Jeżeli w cookies trzymasz coś więcej niż drobne ustawienia, szyfruj lub podpisuj wartość — użytkownik może dowolnie edytować swoje ciasteczka.
- Baner z przykładu to informacja o cookies technicznych. Jeśli używasz śledzących skryptów marketingowych, RODO wymaga prawdziwej zgody (opt-in) zanim je załadujesz — sama informacja nie wystarczy.
- Limit rozmiaru ciasteczka to ok. 4 KB — większe dane trzymaj w sesji lub bazie, a w cookie tylko identyfikator.
Podobne skrypty
Pobieranie danych z API (cURL + JSON) na przykładzie kursów NBP
Uniwersalna funkcja pobierania JSON-a z dowolnego API przez cURL — z limitem czasu, obsługą błędów i buforowaniem do pliku. Przykład: aktualne kursy walut z API NBP.
średni Zobacz kod → WWW i APIWłasny skracacz linków (bez bazy danych)
Miniskracacz URL w jednym pliku: krótkie kody generowane z random_int(), zapis w pliku JSON z blokadą, przekierowania 301 i licznik kliknięć.
średni Zobacz kod → WWW i APIGenerator mapy strony (sitemap.xml)
Generowanie sitemap.xml dla wyszukiwarek: strony statyczne z tablicy plus wpisy dynamiczne z bazy danych, poprawne kodowanie XML i daty ostatniej modyfikacji.
średni Zobacz kod →