Przejdź do treści

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 104 linii Pobierz .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

  1. Zapisz kod jako ciasteczka-demo.php i przetestuj: zmień motyw, odśwież stronę, zamknij baner.
  2. Funkcje ustaw_ciasteczko(), czytaj_ciasteczko() i usun_ciasteczko() przenieś do wspólnego pliku i używaj w całym serwisie.
  3. Pamiętaj o kolejności: najpierw cała logika ciasteczek, dopiero potem pierwszy znak HTML.
  4. Wartość ciasteczka ustawionego w tym żądaniu odczytasz z $_COOKIE dopiero przy następnym — dlatego skrypt po zapisie przekierowuje.

Warto wiedzieć

  • Flaga httponly chroni ciasteczko przed odczytem z JavaScriptu (utrudnia kradzież przy XSS), a samesite=Lax ogranicza 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.
#cookies #ciasteczka #rodo #samesite #ustawienia

Podobne skrypty