Функция установливает новое значение кукиса в браузере и синхронизирует это значение еще с двумя объектами:
а) обновляет значение данного кукиса в глобальном массиве $_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 ***
Сообщения выполненного теста функции