MakeCookie - установить новое значение COOKIE в браузере, заменить это значение во внутреннем массиве $_COOKIE и установить новое значение переменной-кукиса в сценарии

Функция установливает новое значение кукиса в браузере и синхронизирует это значение еще с двумя объектами:

а) обновляет значение данного кукиса в глобальном массиве $_COOKIE. Это действие позволяет использовать значение уже в текущем PHP-сценарии без перезагрузки страницы;

б) возращает указанное значение по завершении работы для передачи его соответствующей переменной-кукису.

Возникновение ошибок при выполнении функции или отсутствие поддержки кукисов в браузере не влияет на установление значения переменой-кукиса на сервере и соответствующего значения в массиве $_COOKIE. Эти значения могут быть подтверждены при следующей загрузке страницы

Синтаксис

$Result=MakeCookie($Name,$Value=null,$Type=tStr,$Init=false,$Duration=cook512,
   $Options=["path"=>"/","domain"=>"","secure"=>false,"httponly"=>false,"samesite"=>null],
   $ModeError=rvsTriggerError);

Параметры

$Name - имя кукиса в браузере клиента (по имени кукиса можно формировать 
глобальную переменную сайтовой страницы добавлением префикса "с_". 
Например: "BrowEntry" --> "$с_BrowEntry");

$Value - значение кукиса браузера, это же значение во внутреннем массиве 
$_COOKIE и у соответствующей глобальной переменной сайтовой страницы. 
Если $Value=null или неопределено, то функция возвращает установленное 
значение кукиса;

$Type - константа, определяющая тип значения: tInt - integer, целое число 
(из множества {...,-2,-1,0,1,2,...}); tFloat - double, число с плавающей точкой;
tStr - string, набор символов=байт (256 различных значений); tBool - boolean, 
простейший тип, выражающие истинность значения. По умолчанию - tStr;

$Init = true, это означает, что требуется установить указанное значение кукиса, 
только в том случае, если кукиса еще не было. В обычных условиях (по умолчанию, 
когда $Init=false) значение кукиса меняется всегда;

$Duration - время жизни кукиса (по умолчанию 44236800 = 512 дней = 512д*24ч*60м*60с):

cook512=44236800,  время жизни кукиса составляет 512 дней;
cookSession=0,     время жизни кукиса - до завершения сеанса браузера;
cookDelete=-1,     кукис удалить по завершении сеанса браузера

$Options - дополнительные параметры (RFC6265bis), по умолчанию 
$Options = ["path"=>"/","domain"=>"","secure"=>false,"httponly"=>false,"samesite"=>null], где 

"path" - путь к каталогу на сервере, из которого будет доступен кукис; 
"domain" - домен, на котором возникает кукис; "secure" - указывает на то, что 
кукис должен передаваться от клиента по защищенному соединению; 
"httponly" - кукис будет доступен только через HTTP-протокол; 
"samesite" - режим связывания кукиса со сторонними сайтами (должен быть либо 
None, либо Lax, либо Strict)

$ModeError - режим вывода сообщений об ошибке (по умолчанию через исключение с 
пользовательской ошибкой на сайте doortry.ru):

rvsCurrentPos=-1,   в текущей позиции сайта; 
rvsTriggerError=0,  исключение с пользовательской ошибкой на подключенном сайте;  
rvsMakeDiv=1,       в дополнительном div-е для сообщения;   
rvsDialogWindow=2,  в диалоговом окне с помощью JQueryUI

Возвращаемое значение

$Result - установленное значение COOKIE в браузере, во внутреннем массиве
   $_COOKIE и переменной-кукиса в сценарии сайтовой страницы

Зарегистрированные ошибки/исключения

CantСookiesToType - "Невозможно привести кукис к указанному типу";
SendCookieFailed  - "Отправка кукиса потерпела неудачу";

Замечания

1. При изменении кукиса встроенной функцией PHP setcookie меняется только 
   значение кукиса в браузере, а его величина в массиве $_COOKIE в текущем 
   PHP-сценарии остается без изменения. Поэтому для синхронизации значений 
   (на сервере) следует использовать MakeCookie.
   
2. На 05.03.2020 в версии PHP 7.3.8 не удалось проверить действие параметра 
   "samesite". Не обнаруживаются константы None, Lax, Strict.
<?php namespace prown
                                         
// PHP7/HTML5, EDGE/CHROME                               *** MakeCookie.php ***

// ****************************************************************************
// * TPhpPrown          Установить новое значение COOKIE в браузере, заменить *
// *              этим значением соответствующее данное во внутреннем массиве *
// *       $_COOKIE и установить новое значение переменной-кукиса в программе *
// *                                                                          *
// * v1.5, 25.03.2020                              Автор:       Труфанов В.Е. *
// * Copyright © 2018 tve                          Дата создания:  03.02.2018 *
// ****************************************************************************

require_once "CommonPrown.php";
require_once 
"iniConstMem.php";
require_once 
"iniErrMessage.php";
require_once 
"MakeType.php";
require_once 
"MakeUserError.php";

function 
_MakeCookie($Name,$Value,$Type,$Dur,$Options,$ModeError)
{
   
$PhpVersion=getPhpVersion(); 
   
// Приводим кукис к заданному типу
   
$Result=MakeType($Value,$Type);
   
// Отмечаем, что "Невозможно привести кукис к указанному типу"
   
if ($Result===null)
   {
      
MakeUserError(CantСookiesToType.' ['.$Value.'-->'.$Type.']','TPhpPrown',$ModeError);
   }
   
// Определяем длительность кукиса
   
if ($Dur==cookSession$Duration=cookSession;
   elseif (
$Dur==cookDelete$Duration=cookDelete;
   else 
$Duration=time()+$Dur;
   
// Определяем другие параметры кукиса
   
if (IsSet($Options['path'])) $Pathi=$Options['path']; else $Pathi="/";
   if (IsSet(
$Options['domain'])) $Domaini=$Options['domain']; else $Domaini="";
   if (IsSet(
$Options['secure'])) $Securi=$Options['secure']; else $Securi=FALSE;
   if (IsSet(
$Options['httponly'])) $Httponli=$Options['httponly']; else $Httponli=FALSE;
   if (IsSet(
$Options['samesite'])) $Samesite=$Options['samesite']; else $Samesite=null;
   
// Отправляем новое куки браузеру для соответствующих версий
   
if ($PhpVersion<50200)
   {
      
$Ret=setcookie($Name,$Value,$Duration,$Pathi,$Domaini,$Securi);
   }
   elseif (
$PhpVersion<70300)
   {
      
$Ret=setcookie($Name,$Value,$Duration,$Pathi,$Domaini,$Securi,$Httponli);
   }
   else
   {
      
// $Ret=setcookie($Name,$Value,$Options); 05.03.2020, "samesite" не работает
      
$Ret=setcookie($Name,$Value,$Duration,$Pathi,$Domaini,$Securi,$Httponli);
   }
   
// Если перед вызовом функции клиенту уже передавался какой-либо вывод 
   // (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит 
   // неудачу и вернет FALSE. Если setcookie() успешно отработает, то вернет 
   // TRUE. Это, однако, не означает, что клиентское приложение (браузер) 
   // правильно приняло и обработало cookie.
   
if ($Ret==FALSE)
   {
      
MakeUserError(SendCookieFailed.' ['.$Name.']','TPhpPrown',$ModeError);
   }
   
// Устанавливаем новое куки в массиве кукисов
   
else $_COOKIE[$Name]=$Value;
   
// Возвращаем новое куки на выход в переменную страницы сайта
   
return $Result;
}

function 
MakeCookie($Name,$Value=null,$Type=tStr,$Init=false,$Duration=cook512,
   
$Options=["path"=>"/","domain"=>"","secure"=>false,"httponly"=>false,"samesite"=>null],
   
$ModeError=rvsTriggerError)
{
   
// Устанавливаем значение, если инициализация
   
if ($Init===true
   {
      
// Если кукиса еще нет, то устанавливаем его
      
if (!(IsSet($_COOKIE[$Name]))) 
      {
         
$Result=_MakeCookie($Name,$Value,$Type,$Duration,$Options,$ModeError);
      }
      
// Если кукис уже есть, но требуется ему установить время до закрытия
      // браузера, то устанавливаем
      
else 
      {
         
$Result=$_COOKIE[$Name];
         if ((
$Duration==cookDelete)||($Duration==cookSession))
         {
            
$Result=_MakeCookie($Name,$Value,$Type,$Duration,$Options,$ModeError);
         }
      }
   }
   
// При запросе значения, возвращаем установленное значение кукиса
   // (здесь идет проверка по типу и значению, так как проверка только по 
   // значению может не отличить 0 от NULL)
   
elseif ($Value===null
   {
      
$Result=$_COOKIE[$Name];
   }
   
// Устанавливаем значение в обычном режиме
   
else 
   {
      
$Result=_MakeCookie($Name,$Value,$Type,$Duration,$Options,$ModeError);
   } 
   return 
$Result;
}
// ********************************************************* MakeCookie.php ***
 


Сообщения выполненного теста функции


MakeCookie

Браузер перед тестами MakeCookie был перезапущен ............................... t00: Оставшихся кукисов от прежних тестов не обнаружено
MakeCookie:cookTypeStr=Типичный,cookTypeInt=137,cookTypeFloat=3.1415926 ........ t11-t13: Установка кукисов по именам и значениям подтверждена
prown\MakeCookie("Zero",0,tInt,true); prown\MakeCookie("Zero",16,tInt,true); ... Zero=0, Повторной инициализации кукиса не произошло
MakeCookie:cookTypeStr=Типичный,cookTypeInt=137,cookTypeFloat=3.1415926 ........ t22-t24: Выполнена проверка значений кукисов по именам
1/1 test cases complete: 11 passes, 0 fails and 0 exceptions.