CommonPrown - блок общих функций.

Программный модуль CommonPrown содержит в себе небольшие функции, которые могут быть использованы при написании сайта на PHP или в backend-разработке проекта.

Функции Alert и ConsoleLog выводят сообщения на странице в браузере. Alert выводит сообщение на экран и приостанавливает работу сайта. ConsoleLog может быть использована при динамической отладке сервера сайта. Она выводит сообщение в консоли браузера, не останавливая вывод на странице.

Функция getAbove по абсолютному пути каталога выделяет вышестоящий каталог. Как правило, используется для технического подъема по каталогам хостинга сайта, построенного на Windows IIS, Apache, Linux.

Две функции getComRequest, isComRequest позволяют выбирать или проверять значения параметров в GET или POST запросах, направляемых к сайту. По умолчанию предполагаются для проверки или выборки, так называемые команды в запросе к сайту, то есть параметры с именем "Com". Например, в запросе для сайта kwinflat.ru "показать справочник услуг", который выглядит следующим образом: https://kwinflat.ru/Main.php?Com=Uslugi, параметр "Com" имеет значение "Uslugi".

ЗАМЕЧАНИЕ: При одноименном кукисе на сайте, значение кукиса имеет приоритет над параметром POST.

Функция getPhpVersion формирует пятиразрядное число, указывающее на текущую версию интерпретатора PHP. Используется для управления кодом проекта на PHP в зависимости от версии.

Функции NoSpace и NoZero заменяют вывод околонулевых значений, то есть маленьких чисел в диапазоне [-0.0001, 0.0001] на пробел. Функция NoSpace дополнительно выводит указанное сообщение, если число вне диапазона околонулевых значений.

Функция sayLogic преобразовывает логическое значение в соответствующий текст.

Функции makeLabel и isLabel позволяют передавать и обнаруживать сообщения, содержащие заданную метку. Метка - это фрагмент строки, ограниченный с левой и правой стороны некоторыми наборами контрольных символов. Функция makeLabel задает метку, а функция isLabel вылавливает метку в переданном текстовом сообщении.

<?php namespace prown;

// PHP7/HTML5, EDGE/CHROME                              *** CommonPrown.php ***
// ****************************************************************************
// * TPhpPrown                                             Блок общих функций *
// *                                                                          *
// * v1.8, 30.07.2021                               Автор:      Труфанов В.Е. *
// * Copyright © 2018 tve                           Дата создания: 17.05.2023 *
// ****************************************************************************

// ****************************************************************************
// *      Вывести сообщение на странице сайта и приостановить его работу      *
// ****************************************************************************
function Alert($String,$Parm=null)
{
   
// Формируем текст сообщения
   
if ($Parm==null$messa=$String;
   else 
$messa=$String.'='.$Parm;
   
// Выводим сообщение
   
?>
   <script>
      var messa="<?php echo $messa?>";
      alert(messa);
   </script>
   <?php
}
// ****************************************************************************
// *                     Вывести сообщение в консоли браузера                 *
// *                                                                          *
// *   (следует отметить, что фунция использует js, то есть уже отправляет    *
// * данные в браузер. Поэтому, например, при следуэющем формировании кукисов *
// * будет ошибка: "Cannot modify header information - headers already sent") *
// ****************************************************************************

/**
 * а) если второй параметр функции не передается (или имеет значение null), то 
 * в консоли браузера выводится просто текст, указанный в первом параметре;
 * б) если второй параметр указан, то он интерпретируется, как значение 
 * переменной, указанной в первом параметре и сообщение выводится в виде:
 * "переменная"="значение";
 * в) если любой из первых двух параметров содержит спецсимволы (например:
 * одиночная кавычка - ', двойная кавычка - ", обратный слэш - \ или NUL - 
 * байт NULL), то для правильного отображения в консоли подстроки экранируются
 * (по умолчанию) $isEscape=true.
**/

function ConsoleLog($Stringi,$Parmi=null,$isEscape=true
{
   
$iString=$Stringi$Parm=$Parmi;
   
// Экранируем параметры при необходимости
   
if ($isEscape)
   {
      if (
gettype($iString)=='string'$iString=addslashes($iString);
      if (
gettype($Parm)=='string'$Parm=addslashes($Parm);
   }
   
// Формируем текст сообщения
   
if ($Parm===null$messa=$iString;
   else 
$messa=$iString.'='.$Parm;
   
// Выводим сообщение
   
?>
   <script>
      messa="<?php echo $messa?>";
      console.log(messa);
   </script>
   <?php
}
// ****************************************************************************
// *        По абсолютному пути каталога выделить вышестоящий каталог         *
// *   (основное назначение - по абсолютному пути корневого каталога сайта    *
// *          выбрать путь надсайтового каталога и каталога хостинга)         *
// ****************************************************************************
function getAbove($SiteRoot)
{
   
$Result=$SiteRoot;
   
// Считаем, что отладка идет в Windows IIS,
   // поэтому вначале ищем последний обратный слэш
   
$Point=strrpos($Result,'\\');
   
// Обратный слэш не найден, считаем что на хостинге (Apache,Linux)
   
if ($Point==0
   {
      
// Ищем последний слэш
      
$Point=strrpos($Result,'/');
       
// Если слэш найден, выделяем надсайтовый каталог
      
if ($Point>0$Result=substr($SiteRoot,0,$Point);
   }
   
// Обратный слэш найден, выделяем надсайтовый каталог в Windows
   
else 
   {
      
$Result=substr($SiteRoot,0,$Point);
   }
   return 
$Result;
}
// ****************************************************************************
// *          Получить значение указанного параметра из запроса к сайту       *
// *                        (получить команду через параметр)                 *
// ****************************************************************************
function getComRequest($Com='Com')
{
   
$Result=NULL;
   if (IsSet(
$_REQUEST[$Com]))
   { 
      
$Result=$_REQUEST[$Com];
   }
   return 
$Result;
}
// ****************************************************************************
// *    Сформировать пятиразрядную версию используемого интерпретатора PHP    *
// ****************************************************************************
function getPhpVersion()
{
   
$Result=00000;
   
// PHP_VERSION_ID доступна в версиях PHP 5.2.7 и выше. Если
   // фактическая версия ниже, можно ее воспроизвести по PHP_VERSION
   
if (defined('PHP_VERSION_ID')) 
   {
      
$Result=PHP_VERSION_ID;
   } 
   elseif (
defined('PHP_VERSION')) 
   { 
      
$version=explode('.',PHP_VERSION);
      
$Result=$version[0]*10000+$version[1]*100+$version[2];
   }
   return 
$Result;
}
// ****************************************************************************
// *             Выбрать значение URL-параметра $_POST или $_GET              *
// * (важно, чтобы срабатывало и при отладке, и при эксплуатации, так как при *
// *               отладке часто $_POST заменяется на $_GET)                  *
// ****************************************************************************
function getPOSTorGET($Name
{
   
$Result=NULL;
   if (IsSet(
$_GET[$Name]))
   { 
      
$Result=htmlspecialchars($_GET[$Name]);
   }
   else
   {
      if (IsSet(
$_POST[$Name]))
      { 
         
$Result=htmlspecialchars($_POST[$Name]);
      }
   }
   return 
$Result;
}
// ****************************************************************************
// *     Проверить присутствует ли в запросе к сайту параметр с указанным     *
// *      значением (проверить передана ли данная команда через параметр)     *
// ****************************************************************************
function isComRequest($subs,$Com='Com')
{
   
$Result=false;
   if (IsSet(
$_REQUEST[$Com]))
   { 
      if (
$_REQUEST[$Com]==$subs$Result=true;
   }
   return 
$Result;
}
// ****************************************************************************
// *             Проверить, есть ли метка в переданном сообщении              *
// ****************************************************************************
function isLabel($mess,$subs,$Before='~~~',$After='~~~')
{
   
$Result=false;
   
$Label=makeLabel($subs,$Before,$After);
   
$regLabel="/".$Label."/u";
   
$s=Findes($regLabel,$mess);
   if (
$s==$Label$Result=true;
   return 
$Result;
}
// ****************************************************************************
// *            Добавить метку (наборы символов до и после) для отправляемого *
// *                                 сообщения. В частности это используется: *
// *  а) в АЯКС-запросах на jQuery, когда от сервера передается сообщение в   *
// *  js, то (фактически - 19.01.2023) перед сообщением подвешивается сам     *
// *  js-скрипт запроса.                                                      *
// ****************************************************************************
function makeLabel($subs,$Before='~~~',$After='~~~')
{
   
$Result=$Before.$subs.$After;
   return 
$Result;
}
// ****************************************************************************
// * Обеспечить вывод околонулевого значения в браузере (вместо околонулевого *
// *     пробел, иначе число и связанную с ним дополнительную подстроку)      *
// ****************************************************************************
function NoSpace($Value,$Ext)
{
   
$Result=" ";
   if (
$Value<0)
   {
      if (
$Value<-0.0001$Result="$Value"."$Ext"
   }
   if (
$Value>0)
   {
      if (
$Value>0.0001$Result="$Value"."$Ext"
   }
   return 
$Result;
}
// ****************************************************************************
// *            Обеспечить вывод околонулевого значения  в браузере           *
// *             (вместо околонулевого - пробел, иначе само число)            *
// ****************************************************************************
function NoZero($Value)
{
   
$Result=" ";
   if (
$Value<0)
   {
      if (
$Value<-0.0001$Result=$Value
   }
   if (
$Value>0)
   {
      if (
$Value>0.0001$Result=$Value
   }
   return 
$Result;
}
// ****************************************************************************
// *               Занести строку информации об ошибке в лог-файл             *
// *         (по умолчанию лог-файл разместить в корневом каталоге сайта)     *
// ****************************************************************************
define ("onlyMess",'Вывести только сообщение!');  
function 
putErrorInfo($Name,$errno,$errstr,$errfile,$errline,$logfile='x')
{
   
// Переопределяем имя лог-файла
   
if ($logfile==='x'$logfile=$_SERVER['DOCUMENT_ROOT']."/errors.txt";
   
// Формируем строку для выгрузки в лог-файл ошибок: $Name - название 
   // модуля, сбрасывающего ошибку; $Today - текущая дата и время в формате
   // MySQL DATETIME;
   
$Today=date("Y-m-d H:i:s");
   
   
// Формируем строку в случае "Вывести только сообщение!"
   
if ($errfile==onlyMess)
   {
      
$Result="$Name "."$Today "."$errstr "."\r\n";
   } 
   
// Иначе склеиваем строку с пользовательской информацией
   
else
   {
      
$Result="$Name "."$Today ".'$errno='.$errno.$errstr ".
         
"$errfile ".'$errline='.$errline."\r\n";
   }
   
// Открываем лог-файл ошибок для чтения и записи:"a+"; помещаем указатель 
   // в конец файла. Если файл не существует, пытаемся его создать. В данном 
   // режиме функция fseek() влияет только на позицию чтения, записи всегда 
   // добавляются в конец
   
$fp fopen($logfile,"a+");
   
// Блокируем файл для записи данных об ошибке (LOCK_EX для получения 
   // эксклюзивной блокировки на запись
   
if (flock($fp,LOCK_EX)) 
   
// В случае успешной блокировки записываем строку, снимаем блокировку,
   // закрываем файл
   

      
fputs($fp,$Result);
      
flock($fpLOCK_UN); 
      
fclose($fp);
   } 
   
// Если файл занят, то выдаем сообщение
   
else 
   {
      
Alert('Не удалось сбросить ошибку в лог-файл: \r\n'.$Result);
   }
 }
// ****************************************************************************
// *        Преобразовать логическое значение в соответствующий текст         *
// ****************************************************************************
function sayLogic($logic)
{
   
$Result='false';
   if (
$logic$Result='true';
   return 
$Result;
}

// ******************************************************** CommonPrown.php ***