Справочники, инструменты, документация

PHP: Cookie — практические примеры использования

Что же такое куки в PHP? Это один из способов хранения определенных данных на стороне клиента. Если говорить проще, то куки хранятся в браузере пользователя. Например при авторизации. Когда юзер отправляет данные, они сохраняются на устройстве.

Как установить куки в PHP

Все не так сложно, как может показаться. Установка cookie происходит следующим образом:

setcookie('name', 'value');

Это базовые значения, которые обязательны для заполнения. Но параметров гораздо больше, а именно 7 и вот для чего каждый из них нужен:

  1. Name - название (имя) cookie
  2. Value - значение (как правило переменная)
  3. Expires - Время жизни куки
  4. Path - Путь для которого будут сохранены куки
  5. Domain - Можно указать поддомен
  6. Secure - Использование только на HTTPS (true или false)
  7. HttpOnly - Использование только на HTTP (true или false)

В подавляющем большинстве случаев используются первые 3 параметра чтобы записать cookie в PHP. То есть имя, значение и время жизни. Этого вполне достаточно для полноценной работы. Давайте к практике.

setcookie('name', 5, time()+60)

Здесь мы установим cookie name со значением — 5, которая удалится через 1 минуту.

Как получить, прочитать, проверить cookie в PHP

В этом нам поможет глобальный массив COOKIE. Чтобы получить значение куки нам нужно вызвать ее по имени.

echo $_COOKIE['name'];

Как вы уже догадались, на экран выведется пятерка. Теперь сделаем проверку. Если данная кука была установлена, то выедем одно сообщение, если не была, то другое.

if(isset($_COOKIE['name'])){
 echo 'Куки успешно установлены!';
} else {
 echo 'Куки НЕ установлены!';
}

Есть один маленький нюанс. При первом заходе на страницу будет выведено сообщение, что куки не установлены, однако, если заглянуть в консоль браузера, то увидим, что она там есть. В чем же дело? Элементарно. Дело в том, что запрос на проверку и сама установка куки идут ОДНОВРЕМЕННО. Поэтому сообщение об успешной установке мы увидим только после следующей перезагрузке страницы.

Теперь у нас есть условие и его можно использовать в некоторых случаях.

Авторизация с использованием PHP Cookie

Для примера я создам 2 формы. Первая с одним единственным полем, в которое будем писать свое имя. Пока не будет введено и отправлено имя, пользователю будут недоступны некоторые элементы страницы. То есть, если он не авторизован, то какие-то функции сайта от него будут скрыты, а так же показано приветствие. После того, как данные с формы будут отправлены, эта форма будет скрыта и показана другая, которая просто будет запоминать все данные, введенные пользователем.

$count = 0;
if (isset($_COOKIE['count'])) {
 $count = $_COOKIE['count'];
 $count++;
}
setcookie('count', $count);

Теперь осталось в HTML вставить нужные переменные.

<div class="container">
 <div class="row">
  <div class="col-md-12">
   <?=$head?>
   <?=$head_two?>
  </div>
 </div> 
 <div class="row">
  <div class="col-md-12">
   <div class="col"><?=$val1_c?></div>
   <div class="col"><?=$val1_c?></div>
  </div>
 </div>
 <div class="row">
  <div class="col-md-4 col-sm-12">
   <?=$form?>
   <?=$form2?>
  </div>
 </div>
</div>

Счетчик просмотров страницы на PHP + cookie

Здесь мы покажем сколько раз каждый их юзеров был на этой странице. Благо делается он очень просто. Вот его код:

setcookie('name', '');
setcookie('name', '$value', time()-86400);

Потом просто выводим на странице переменную count.

Время жизни cookie в PHP

Если не указан третий параметр (Expires), то куки будут храниться до окончания сессии, то есть пока вы не закроете браузер. Но можно выставить и другие временные рамки, к примеру на 1 час или на 1 день и т.д. Вот некоторые примеры:

  • time()+3600 — один час
  • time()+86400 — один день
  • time()+86400 * 30 — 30 дней
  • time()+86400 * 30 * 12 — 1 год

Этого вполне достаточно, но многие интересуются, как сделать так, чтобы куки жили вечно или сделать время жизни бесконечным. Не очень понимаю в каких случаях это может понадобиться, однако ответ на этот вопрос будет — НЕТ, нельзя. Но можно поставить максимальное время. Пишется так: 0x7FFFFFFF — дата 19.01.2038 года.

Как удалить или очистить (unset) куки в PHP

Удаление куки в PHP можно сделать двумя способами. Оставить значение пустым или установить прошедшую дату, со знаком минус:

setcookie('name', '');
setcookie('name', '$value', time()-86400);

Полный пример скрипта:

<?php
$name = $_POST['name'];
if (isset($_POST['submit_two'])) {
 setcookie('name', $name);
 header('Location: ' .$_SERVER["HTTP_REFERER"]);
}
$name_c = $_COOKIE['name'];
$val_1 = $_POST['val1'];
$val_2 = $_POST['val2'];
$range = $_POST['range'];
if(isset($_POST['submit'])){
 setcookie('val_1', $val_1);
 setcookie('val_2', $val_2);
 setcookie('range', $range);
 header('Location: ' .$_SERVER["HTTP_REFERER"]);
}
$val1_c = $_COOKIE['val_1'];
$val2_c = $_COOKIE['val_2'];
$range_c = $_COOKIE['range'];
if (!isset($_COOKIE['range'])) {
    $range_c = 0;
}

//счетчик
$count = 0;
if (isset($_COOKIE['count'])) {
    $count = $_COOKIE['count'];
    $count++;
}
setcookie('count', $count, 0x7FFFFFFF);
if(isset($_COOKIE['name'])){
 $head = '<div class="block-cookie"><b>Привет, '.$name_c. '. Это ваше '.$count.'-е посещение страницы!</b></div>';
 $form = '
<form action="" method="post">
 <div class="form-group">
  <small>* Заполните поля и нажмите кнопку отправить</small>
  <input type="text" name="val1" class="form-control" placeholder="Имя" value="'. $val1_c.'""/>
 </div>
 <div class="form-group">
  <input type="text" name="val2" class="form-control"placeholder="Сообщение" value="'.$val2_c.'" />
 </div>
 <div class="form-group cntr">
        <span id="one">'.$range_c.'</span>
        <input type="range" name="range" value="'.$range_c.'" min="0" max="500" step="10" oninput="ranger()" id="range">
    </div>
 <div class="form-group">
  <input type="submit" name="submit" value="Отправить" class="btn btn-primary"/>
  <small>* Потом пробуйте обновить страницу</small>
 </div>
</form>';
}else{
 $head_two = '
<div class="block-cookie2">Введите свое имя, чтобы продолжить.</div>
<p>Этот абзац пропадет после того, как вы введете имя и отправите данные, нажав на кнопку.</p>';
$form2 = '
<form action="" method="post">
 <div class="form-group">
  <input type="text" name="name" class="form-control" placeholder="Введите имя"/>
 </div>
 <input type="submit" name="submit_two" class="btn btn-success"/>
</form>';
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Как установить и удалить куки в PHP</title>
<meta name="description" content="Работа с Cookie в PHP">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<style type="text/css">body {
  font-family: sans-serif;
}

.block-cookie {
  background: #4caf50;
  padding: 5px;
  color: #fff;
  transition: .5s;
}

.block-cookie2 {
  background: #ff5722;
  padding: 5px;
  color: #fff;
  transition: .5s;
}

input[type="range"] {
  width: 100%;
  -webkit-appearance: none;
  background-color: #ff9800;
  height: 10px;
  outline: 0;
  cursor: pointer;
  border-radius: 5px;
}

input[type='range']::-webkit-slider-thumb {
  width: 25px;
  -webkit-appearance: none;
  height: 25px;
  border-radius: 50%;
  cursor: pointer;
  background: #4caf50;
}

span #one {
  position: relative;
  background: #ff5722;
  padding: 2px 10px;
  color: #fff;
  border-radius: 4px;
  top: -10px;
  display: inline-block;
}

span #one:after {
  content: "";
  display: block;
  border: 10px solid transparent;
  border-top: 10px solid #ff5722;
  position: absolute;
  left: 50%;
  transform: translate(-50%, 0);
}

.form-group.cntr {
  text-align: center;
}
</style>
</head>
<body>
<div class="container">
 <div class="row">
  <div class="col-md-12">
   <?=$head ?>
   <?=$head_two ?>
  </div>
 </div> 
 <div class="row">
  <div class="col-md-12">
   <div class="col"><?=$val1_c ?></div>
   <div class="col"><?=$val2_c ?></div>
  </div>
 </div>
 <div class="row">
  <div class="col-md-4 col-sm-12">
   <?=$form ?>
   <?=$form2 ?>
  </div>
 </div>
</div>

<script>
function ranger() {
  var rng=document.getElementById('range'); //rng - это Input
    var p=document.getElementById('one'); // p - абзац
  p.innerHTML=rng.value;
}
</script>

</body>
</html>

Устанавливаем Cookie на один час

// устанавливаем Cookie 'test' со значением 'Hello' на один час
print_r($_COOKIE);
setcookie("test","Hello",time() + 3600);

// при следующем запросе скрипта выводит 'Hello':
echo @$_COOKIE['test'];

setcookie("mm_login", $_SESSION['login'], time() + 3600, "/"); // на час
setcookie("mm_login", $_SESSION['login'], time() - 3600, "/"); // удаление

setcookie("mm_login", $_SESSION['login'], time() + 2592000, "/"); // на месяц
setcookie("zoo_cookie", $row["cookie"], time() + 15000000, "/", ".my-site.by");