Запоминай посетителей от страницы к странице: безопасный вход, корзина в сессии и правильно защищённые куки.
Открыть этот урок в KodokonHTTP ничего не помнит: каждый запрос приходит как новый, без связи с предыдущим. Сессии решают эту проблему: session_start() связывает посетителя с уникальным идентификатором, который передаётся в куке, и с хранилищем на стороне сервера, доступным через $_SESSION. Вызывай session_start() в самом начале каждой нужной страницы, до любого вывода.
<?php
declare(strict_types=1);
session_start();
$storedHash = password_hash('secret123', PASSWORD_DEFAULT);
$password = $_POST['password'] ?? '';
if (password_verify($password, $storedHash)) {
session_regenerate_id(true);
$_SESSION['user_id'] = 42;
header('Location: /account.php');
exit;
}
echo "Invalid credentials.";Защита страницы сводится к проверке того, что пользователь есть в сессии, и к редиректу в противном случае. Сессия также идеально подходит как временное хранилище для корзины: ассоциативный массив id товара => количество переживает переходы между страницами.
<?php
declare(strict_types=1);
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
$_SESSION['cart'] ??= [];
$productId = filter_input(
INPUT_POST,
'product_id',
FILTER_VALIDATE_INT
);
if (is_int($productId)) {
$qty = $_SESSION['cart'][$productId] ?? 0;
$_SESSION['cart'][$productId] = $qty + 1;
}
$count = array_sum($_SESSION['cart']);
echo "Cart: " . $count . " item(s)";Куки, наоборот, живут на устройстве пользователя и переживают закрытие браузера: отлично подходят для темы оформления или выбранного языка. Начиная с PHP 7.3 setcookie() принимает массив опций: требуй secure (только по HTTPS), httponly (невидим для JavaScript) и samesite (ограничивает отправку с других сайтов).
<?php
setcookie('theme', 'dark', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
$theme = $_COOKIE['theme'] ?? 'light';
echo "Active theme: " . $theme;Выход должен быть проработан так же тщательно, как вход: очисти $_SESSION, уничтожь сессию на стороне сервера и просрочь куку, которая несла идентификатор.
<?php
session_start();
$_SESSION = [];
session_destroy();
setcookie(session_name(), '', time() - 3600, '/');
header('Location: /login.php');
exit;