избавляемся от Warning и Deprecated

This commit is contained in:
2025-10-13 17:19:32 +05:00
parent 9d427f4870
commit 444983e2d7
8 changed files with 245 additions and 163 deletions

View File

@@ -8,7 +8,7 @@
* замена системных тегов соответствующими функциями, а также разбор url параметров и поиск документов по url.
*
* @package AVE.cms
* @version 3.x
* @version 4.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
@@ -664,13 +664,13 @@
// Проверяем теги полей в шаблоне рубрики на условие != ''
if (defined('USE_GET_FIELDS') && USE_GET_FIELDS)
{
$main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl);
$main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content);
$main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl);
$main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content);
}
else
{
$main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl);
$main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content);
$main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl);
$main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content);
}
$main_content = str_replace('[tag:if:else]', '<?php }else{ ?>', $main_content);
@@ -759,8 +759,10 @@
$main_content
);
$main_content = str_replace('[tag:docdate]', translate_date(strftime(DATE_FORMAT, $this->curentdoc->document_published)), $main_content);
$main_content = str_replace('[tag:doctime]', translate_date(strftime(TIME_FORMAT, $this->curentdoc->document_published)), $main_content);
// ИСПРАВЛЕНИЕ DEPRECATED: strftime() заменена на date()
$main_content = str_replace('[tag:docdate]', translate_date(date(DATE_FORMAT, $this->curentdoc->document_published)), $main_content);
$main_content = str_replace('[tag:doctime]', translate_date(date(TIME_FORMAT, $this->curentdoc->document_published)), $main_content);
$main_content = str_replace('[tag:humandate]', human_date($this->curentdoc->document_published), $main_content);
$main_content = str_replace('[tag:docauthorid]', $this->curentdoc->document_author_id, $main_content);
@@ -1183,6 +1185,10 @@
: $this->curentdoc->rubric_id);
$main_content = '';
// ИСПРАВЛЕНИЕ: Инициализируем $out пустой строкой, чтобы избежать "Undefined variable $out"
// если условие кэша не выполняется (например, при AJAX запросе).
$out = '';
if ((defined('CACHE_DOC_FULL') && CACHE_DOC_FULL) && isAjax() == false)
{
@@ -1354,7 +1360,7 @@
count
)
VALUES (
'" . $id . "', '".$curdate."', '1'
'" . $id . "',  '".$curdate."', '1'
)
");
}
@@ -1587,7 +1593,7 @@
ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/',
ABS_PATH,
htmlspecialchars(get_settings('site_name'), ENT_QUOTES),
(isset($_REQUEST['id'])) ? isset ($this->curentdoc->document_alias) ? $this->curentdoc->document_alias : '' : '',
(isset($_REQUEST['id'])) ? (isset ($this->curentdoc->document_alias) ? $this->curentdoc->document_alias : '') : '',
getSiteUrl(),
get_home_link(),
(isset($this->curentdoc->document_meta_robots) ? $this->curentdoc->document_meta_robots : ''),
@@ -1739,7 +1745,7 @@
// ЧПУ
$out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out)));
unset ($search, $replace, $main_content); //Убираем данные
unset ($search, $replace, $main_content); //Убираем данные
$GLOBALS['block_generate']['DOCUMENT']['FETCH'] = Debug::endTime('DOC_' . $id);

View File

@@ -6,7 +6,7 @@
* Класс предназначен для создания обертки над MySql запросами к БД.
*
* @package AVE.cms
* @version 3.x
* @version 4.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
@@ -348,6 +348,13 @@ public function Close()
*/
protected $db_pass;
/**
* Пароль (используется в конструкторе)
*
* @var string
*/
protected $db_password; // <--- ДОБАВЛЕНО: Это устранит Deprecated
/**
* Номер порта
*
@@ -1003,7 +1010,7 @@ public function Close()
/**
* Метод, предназначенный для экранирования и очищения значения при поиске url в базе
*
* @param string $value - обрабатываемое значение
* @param string $url - обрабатываемое значение
* @return string - возвращает строку запроса вычещенной
*/
function ClearUrl($url)
@@ -1024,7 +1031,8 @@ public function Close()
$url = str_ireplace('%3Cscript', '', $url);
// Применяем встроенный SANITIZE
$url = filter_var($url, FILTER_SANITIZE_STRING);
// ИСПРАВЛЕНИЕ PHP 8.1+: FILTER_SANITIZE_STRING устарел. Заменяем на FILTER_SANITIZE_FULL_SPECIAL_CHARS.
$url = filter_var($url, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// Переводим html в сущности, если чтото осталось
$url = htmlspecialchars($url);

View File

@@ -4,21 +4,23 @@
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @version 4.x (PHP 8+ compatible)
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
* @copyright © 2007-2025 AVE.cms, https://www.ave.gitget.ru
*
* @license GPL v.2
*/
class AVE_Session
// Класс уже объявлен с implements SessionHandlerInterface - это правильно.
class AVE_Session implements SessionHandlerInterface
{
// Типизация $sess_lifetime должна быть int для PHP 8.1+, но оставлю без типа, чтобы не вызвать новых ошибок
public $sess_lifetime;
function __construct()
{
ini_set('session.save_handler', 'user');
// ini_set('session.save_handler', 'user'); // Этот вызов устарел; session_set_save_handler() уже выполняет эту роль.
$this->sess_lifetime = (defined('SESSION_LIFETIME') && is_numeric(SESSION_LIFETIME))
? SESSION_LIFETIME
@@ -27,26 +29,33 @@
return true;
}
/* Open session */
function _open($sess_save_path, $session_name)
// ИСПРАВЛЕНИЕ: Убран префикс '_' для соответствия SessionHandlerInterface
public function open(string $path, string $name): bool
{
global $sess_save_path, $sess_session_name;
// $path - это путь, переданный PHP, но CMS использует свой путь:
$sess_save_path = BASE_DIR . '/tmp/session';
$sess_session_name = $session_name;
$sess_session_name = $name;
// Создание папки, если ее нет
if (!is_dir($sess_save_path)) {
@mkdir($sess_save_path, 0777, true);
}
return true;
}
/* Close session */
function _close()
// ИСПРАВЛЕНИЕ: Убран префикс '_' для соответствия SessionHandlerInterface
public function close(): bool
{
$this->_gc($this->sess_lifetime);
// Вызываем gc, чтобы не полагаться на system gc (хотя open/close не должны это делать)
$this->gc($this->sess_lifetime);
return true;
}
/* Read session */
function _read($id)
// ИСПРАВЛЕНИЕ: Убран префикс '_' для соответствия SessionHandlerInterface
public function read(string $id): string|false
{
global $sess_save_path, $sess_session_name, $sess_session_id;
@@ -55,42 +64,33 @@
if (!file_exists($sess_file)) return "";
if ($fp = @fopen($sess_file, "r"))
{
$sess_data = fread($fp, filesize($sess_file));
return($sess_data);
}
else
{
return '';
}
// Используем file_get_contents для более чистой работы с файлами
$sess_data = @file_get_contents($sess_file);
// _read должен возвращать строку или false. Возвращаем пустую строку при ошибке.
return ($sess_data !== false) ? $sess_data : '';
}
/* Write new data */
function _write ($id, $sess_data)
// ИСПРАВЛЕНИЕ: Убран префикс '_' для соответствия SessionHandlerInterface
public function write (string $id, string $sess_data): bool
{
global $sess_save_path, $sess_session_name, $sess_session_id;
global $sess_session_id;
$sess_session_id = $id;
$sess_file = $this->_folder() . '/' . $id . '.sess';
$sess_folder = $this->_folder();
$sess_file = $sess_folder . '/' . $id . '.sess';
if(!file_exists($this->_folder()))
mkdir($this->_folder(), 0777, true);
if(!file_exists($sess_folder))
@mkdir($sess_folder, 0777, true);
if ($fp = @fopen($sess_file, "w"))
{
return fwrite($fp, $sess_data);
}
else
{
return false;
}
// Используем file_put_contents для более чистой записи
return (bool)@file_put_contents($sess_file, $sess_data);
}
/* Destroy session */
function _destroy ($id)
// ИСПРАВЛЕНИЕ: Убран префикс '_' для соответствия SessionHandlerInterface
public function destroy (string $id): bool
{
global $sess_save_path, $sess_session_name, $sess_session_id;
global $sess_session_id;
$sess_session_id = $id;
$sess_dir = $this->_folder();
@@ -99,35 +99,57 @@
return @unlink($sess_file);
}
/* Garbage collection, deletes old sessions */
function _gc ($maxlifetime)
// ИСПРАВЛЕНИЕ: Убран префикс '_' и изменен возвращаемый тип на int|false
public function gc (int $maxlifetime): int|false
{
global $sess_save_path, $sess_session_id;
global $sess_save_path;
$this->_clear($sess_save_path, 'sess', $maxlifetime);
// Убеждаемся, что путь к сессиям установлен
if (!isset($sess_save_path)) {
$sess_save_path = BASE_DIR . '/tmp/session';
}
return true;
// Вызываем модифицированную функцию _clear, которая теперь возвращает count
$deleted_count = $this->_clear($sess_save_path, 'sess', $maxlifetime);
// Возвращаем количество удаленных файлов (требование интерфейса)
return $deleted_count;
}
function _clear($dir, $mask, $maxlifetime)
// ИСПРАВЛЕНИЕ: Модифицирована для подсчета и возврата удаленных файлов
private function _clear(string $dir, string $mask, int $maxlifetime): int
{
$deleted_count = 0;
// Проверка существования каталога перед glob
if (!is_dir($dir)) return 0;
foreach(glob($dir . '/*') as $filename)
{
if (strtolower(substr($filename, strlen($filename) - strlen($mask), strlen($mask))) == strtolower($mask))
{
if ((filemtime($filename) + $maxlifetime) < time())
@unlink($filename);
if ((filemtime($filename) + $maxlifetime) < time()) {
if (@unlink($filename)) {
$deleted_count++; // Увеличиваем счетчик
}
}
}
if (is_dir($filename))
if (! count(glob($filename.'/*')))
@rmdir($filename);
if (is_dir($filename)) {
// Сначала рекурсивно очищаем вложенные папки
$deleted_count += $this->_clear($filename, $mask, $maxlifetime);
self::_clear($filename, $mask, $maxlifetime);
// Удаляем пустую папку после очистки
if (!count(glob($filename.'/*'))) {
@rmdir($filename);
}
}
}
return $deleted_count; // Возвращаем общее количество удаленных
}
function _folder()
private function _folder(): string
{
global $sess_session_id, $sess_save_path;
@@ -136,6 +158,7 @@
function __destruct ()
{
// Оставляем как есть, хотя в современном PHP не требуется
register_shutdown_function('session_write_close');
}
}

View File

@@ -4,69 +4,84 @@
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @version 4.x (PHP 8+ compatible)
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
* @copyright © 2007-2025 AVE.cms, https://www.ave.gitget.ru
*
* @license GPL v.2
*/
class AVE_Session_Memcached
// ИСПРАВЛЕНИЕ #1: Добавлено implements SessionHandlerInterface для совместимости с PHP 8+
class AVE_Session_Memcached implements SessionHandlerInterface
{
private $memcached;
private $ttl;
private $prefix;
private Memcached $memcached;
private int $ttl;
private string $prefix;
function __construct()
{
// Добавим проверку на существование констант, чтобы избежать ошибок.
if (!defined('MEMCACHED_SERVER') || !defined('MEMCACHED_PORT')) {
// В реальной CMS здесь должна быть обработка ошибки, но для примера просто выйдем.
throw new Exception('Memcached configuration constants are missing.');
}
$this->memcached = new Memcached;
$this->memcached->addServer(MEMCACHED_SERVER, MEMCACHED_PORT);
$this->ttl = (defined('SESSION_LIFETIME') && is_numeric(SESSION_LIFETIME))
? SESSION_LIFETIME
: (get_cfg_var("session.gc_maxlifetime") < 1440 ? 1440 : get_cfg_var("session.gc_maxlifetime"));
? (int)SESSION_LIFETIME
: (get_cfg_var("session.gc_maxlifetime") < 1440 ? 1440 : (int)get_cfg_var("session.gc_maxlifetime"));
$this->prefix = 'sess_';
}
/* Open session */
function _open($sess_save_path, $session_name)
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
public function open(string $path, string $name): bool
{
return true;
}
/* Close session */
function _close()
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
public function close(): bool
{
return true;
}
/* Read session */
function _read($id)
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
public function read(string $id): string
{
return $this->memcached->get($this->prefix . $id) ? : '';
// Memcached::get возвращает false при промахе, поэтому используем ?: ''
// для соответствия требованию read() всегда возвращать строку (string)
$data = $this->memcached->get($this->prefix . $id);
return $data !== false ? $data : '';
}
/* Write new data */
function _write ($id, $sess_data)
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
public function write (string $id, string $data): bool
{
$this->memcached->set($this->prefix . $id, $sess_data, time() + $this->ttl);
return true;
// Время жизни (TTL) передается в виде абсолютной UNIX метки времени
// или в секундах, если оно меньше 30 дней.
return $this->memcached->set($this->prefix . $id, $data, time() + $this->ttl);
}
/* Destroy session */
function _destroy ($id)
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
public function destroy (string $id): bool
{
$this->memcached->delete($this->prefix . $id);
return true;
// delete() возвращает true/false/int
$result = $this->memcached->delete($this->prefix . $id);
// Возвращаем булево значение (true, если запись была удалена или отсутствовала,
// но не было критической ошибки)
return $result !== false;
}
/* Garbage collection, deletes old sessions */
function _gc ($maxlifetime)
// ИСПРАВЛЕНИЕ #2 и #3: Убран префикс '_' и изменен возвращаемый тип на int|false
public function gc (int $maxlifetime): int|false
{
return true;
// Memcached автоматически управляет очисткой на основе TTL.
// Мы просто возвращаем 0 удаленных записей, чтобы соответствовать интерфейсу.
return 0;
}
}
?>

View File

@@ -11,7 +11,8 @@
* @license GPL v.2
*/
class AVE_Session_DB
// ИСПРАВЛЕНИЕ #1: Добавлено implements SessionHandlerInterface для соответствия PHP 8+
class AVE_Session_DB implements SessionHandlerInterface
{
public int $sess_lifetime;
@@ -51,9 +52,10 @@ class AVE_Session_DB
$this->mysql_connect->set_charset('utf8');
}
// ИСПРАВЛЕНИЕ #3: Замена mysqli::ping() на mysqli::stat() для устранения Deprecated
private function ensureConnection(): bool
{
if (!($this->mysql_connect instanceof mysqli) || !$this->mysql_connect->ping()) {
if (!($this->mysql_connect instanceof mysqli) || !$this->mysql_connect->stat()) {
$this->connect();
if (!$this->mysql_connect || $this->mysql_connect->connect_error) {
return false;
@@ -70,12 +72,14 @@ class AVE_Session_DB
}
}
public function _open(string $path, string $name): bool
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' для соответствия SessionHandlerInterface
public function open(string $path, string $name): bool
{
return true;
}
public function _close(): bool
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' для соответствия SessionHandlerInterface
public function close(): bool
{
if (!$this->ensureConnection()) {
return false;
@@ -84,7 +88,7 @@ class AVE_Session_DB
$sql = "DELETE FROM " . $this->db_prefix . "_sessions WHERE expiry < ?";
$stmt = $this->mysql_connect->prepare($sql);
if (!$stmt) {
error_log("Prepare failed in _close: " . $this->mysql_connect->error);
error_log("Prepare failed in close: " . $this->mysql_connect->error);
return false;
}
$now = time();
@@ -97,7 +101,8 @@ class AVE_Session_DB
return true;
}
public function _read(string $ses_id): string
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' для соответствия SessionHandlerInterface
public function read(string $ses_id): string
{
if (!$this->ensureConnection()) {
return '';
@@ -106,7 +111,7 @@ class AVE_Session_DB
$sql = "SELECT value, Ip FROM " . $this->db_prefix . "_sessions WHERE sesskey = ? AND expiry > ?";
$stmt = $this->mysql_connect->prepare($sql);
if (!$stmt) {
error_log("Prepare failed in _read: " . $this->mysql_connect->error);
error_log("Prepare failed in read: " . $this->mysql_connect->error);
return '';
}
@@ -123,7 +128,8 @@ class AVE_Session_DB
return $result;
}
public function _write(string $ses_id, string $data): bool
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' для соответствия SessionHandlerInterface
public function write(string $ses_id, string $data): bool
{
if (!$this->ensureConnection()) {
return false;
@@ -133,8 +139,8 @@ class AVE_Session_DB
$remoteAddr = $_SERVER['REMOTE_ADDR'] ?? '';
$sql = "INSERT INTO " . $this->db_prefix . "_sessions (sesskey, expiry, value, Ip, expire_datum)
VALUES (?, ?, ?, ?, FROM_UNIXTIME(?,'%d.%m.%Y, %H:%i:%s'))
ON DUPLICATE KEY UPDATE
VALUES (?, ?, ?, ?, FROM_UNIXTIME(?,'%d.%m.%Y, %H:%i:%s'))
ON DUPLICATE KEY UPDATE
expiry = VALUES(expiry),
value = VALUES(value),
Ip = VALUES(Ip),
@@ -142,21 +148,22 @@ class AVE_Session_DB
$stmt = $this->mysql_connect->prepare($sql);
if (!$stmt) {
error_log("Prepare failed in _write: " . $this->mysql_connect->error);
error_log("Prepare failed in write: " . $this->mysql_connect->error);
return false;
}
$stmt->bind_param('sisss', $ses_id, $expiry, $data, $remoteAddr, $expiry);
$result = $stmt->execute();
if (!$result) {
error_log("Execute failed in _write: " . $stmt->error);
error_log("Execute failed in write: " . $stmt->error);
}
$stmt->close();
return $result;
}
public function _destroy(string $ses_id): bool
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' для соответствия SessionHandlerInterface
public function destroy(string $ses_id): bool
{
if (!$this->ensureConnection()) {
return false;
@@ -165,21 +172,22 @@ class AVE_Session_DB
$sql = "DELETE FROM " . $this->db_prefix . "_sessions WHERE sesskey = ?";
$stmt = $this->mysql_connect->prepare($sql);
if (!$stmt) {
error_log("Prepare failed in _destroy: " . $this->mysql_connect->error);
error_log("Prepare failed in destroy: " . $this->mysql_connect->error);
return false;
}
$stmt->bind_param('s', $ses_id);
$result = $stmt->execute();
if (!$result) {
error_log("Execute failed in _destroy: " . $stmt->error);
error_log("Execute failed in destroy: " . $stmt->error);
}
$stmt->close();
return $result;
}
public function _gc(int $maxlifetime): bool
// ИСПРАВЛЕНИЕ #4: Возвращаемый тип изменен на int|false и возвращается affected_rows
public function gc(int $maxlifetime): int|false
{
if (!$this->ensureConnection()) {
return false;
@@ -189,18 +197,24 @@ class AVE_Session_DB
$sql = "DELETE FROM " . $this->db_prefix . "_sessions WHERE expiry < ?";
$stmt = $this->mysql_connect->prepare($sql);
if (!$stmt) {
error_log("Prepare failed in _gc: " . $this->mysql_connect->error);
error_log("Prepare failed in gc: " . $this->mysql_connect->error);
return false;
}
$stmt->bind_param('i', $threshold);
$result = $stmt->execute();
if (!$result) {
error_log("Execute failed in _gc: " . $stmt->error);
if ($result) {
// Возвращаем количество удаленных строк (требование интерфейса)
$deleted_rows = $stmt->affected_rows;
$stmt->close();
return $deleted_rows;
} else {
// Ошибка выполнения
error_log("Execute failed in gc: " . $stmt->error);
$stmt->close();
return false;
}
$stmt->close();
return $result;
}
private function error(): void
@@ -214,3 +228,4 @@ class AVE_Session_DB
die;
}
}
?>

View File

@@ -4,7 +4,7 @@
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @version 4.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
@@ -24,6 +24,11 @@
/**
* СВОЙСТВА
*/
// Явное объявление свойств для устранения Deprecated в PHP 8.2+
public string $cache_dir_root;
public string $module_cache_dir;
public string $session_dir;
public string $sql_cache_dir;
/**
* Конструктор
@@ -195,6 +200,7 @@
*
* @param string $resource_name
* @param string $cache_id
*
* @param string $compile_id
*/
function display($resource_name, $cache_id = null, $compile_id = null)
@@ -245,7 +251,7 @@
write_htaccess_deny($this->cache_dir . '/');
// Memcached
if (MEMCACHED_SERVER && MEMCACHED_PORT)
if (defined('MEMCACHED_SERVER') && defined('MEMCACHED_PORT') && MEMCACHED_SERVER && MEMCACHED_PORT)
{
$m = new Memcached();
$m->addServer(MEMCACHED_SERVER, MEMCACHED_PORT);
@@ -256,13 +262,15 @@
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS_LOG'));
// Очищаем кэш сессий в БД в таблице _sessions
$AVE_DB->Query("
DELETE FROM
" . PREFIX . "_sessions
");
if (defined('PREFIX') && $AVE_DB) {
$AVE_DB->Query("
DELETE FROM
" . PREFIX . "_sessions
");
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS_LOG'));
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS_LOG'));
}
}
@@ -284,8 +292,10 @@
//Метод удаления скомпилированных шаблонов модулей
if (isset($_REQUEST['moduleCache']) && $_REQUEST['moduleCache'] == '1')
{
$this->recursivDelete($this->module_cache_dir);
if (is_dir($this->module_cache_dir)) {
$this->recursivDelete($this->module_cache_dir);
}
mkdir($this->module_cache_dir, 0777, true);
write_htaccess_deny($this->module_cache_dir . '/');
@@ -298,7 +308,9 @@
//Метод удаления всех сессий
if (isset($_REQUEST['sessionUsers']) && $_REQUEST['sessionUsers'] == '1')
{
$this->recursivDelete($this->session_dir);
if (is_dir($this->session_dir)) {
$this->recursivDelete($this->session_dir);
}
mkdir($this->session_dir, 0777, true);
@@ -312,7 +324,9 @@
//Метод удаления кэша запросов
if (isset($_REQUEST['sqlCache']) && $_REQUEST['sqlCache'] == '1')
{
$this->recursivDelete($this->sql_cache_dir);
if (is_dir($this->sql_cache_dir)) {
$this->recursivDelete($this->sql_cache_dir);
}
mkdir($this->sql_cache_dir, 0777, true);

View File

@@ -4,7 +4,7 @@
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @version 4.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
@@ -410,10 +410,10 @@
/**
* Функция возвращает массив со значениями полей
*
* @param $document_id
* @param array $values если надо вернуть документ с произвольными значениями - используется для ревизий документов
* @internal param int $id id документа
* @return mixed
* @param $document_id
* @param array $values если надо вернуть документ с произвольными значениями - используется для ревизий документов
* @internal param int $id id документа
* @return mixed
*/
function get_document_fields ($document_id, $values = null)
{
@@ -450,9 +450,13 @@
if ($cache_time == 0)
$cache_time = -1;
// Переменная для безопасного доступа к ID вне цикла.
$last_rubric_field_id = null;
if (! isset($document_fields[$document_id]))
{
$document_fields[$document_id] = false;
// ИСПРАВЛЕНИЕ: Инициализируем пустым массивом, чтобы избежать 'Automatic conversion of false to array is deprecated'
$document_fields[$document_id] = [];
$where = "WHERE doc_field.document_id = '" . $document_id . "'";
@@ -519,6 +523,9 @@
while ($row = $sql->FetchAssocArray())
{
// Сохраняем ID для использования после цикла
$last_rubric_field_id = $row['rubric_field_id'];
$row['tpl_req_empty'] = (trim($row['rubric_field_template_request']) == '');
$row['tpl_field_empty'] = (trim($row['rubric_field_template']) == '');
@@ -552,38 +559,39 @@
$document_fields[$document_id][$row['rubric_field_id']] = [
'Id' => $row['Id'],
'document_id' => $row['document_id'],
'document_author_id' => $row['document_author_id'],
'rubric_field_id' => $row['rubric_field_id'],
'field_value' => $row['field_value'],
'field_value_more' => $row['field_value_more'],
'tpl_req_empty' => $row['tpl_req_empty'],
'tpl_field_empty' => $row['tpl_field_empty'],
'rubric_id' => $row['rubric_id'],
'rubric_field_alias' => $row['rubric_field_alias'],
'rubric_field_type' => $row['rubric_field_type'],
'rubric_field_default' => $row['rubric_field_default'],
'rubric_field_numeric' => $row['rubric_field_numeric'],
'rubric_field_title' => $row['rubric_field_title'],
'rubric_field_template' => $row['rubric_field_template'],
'Id' => $row['Id'],
'document_id' => $row['document_id'],
'document_author_id' => $row['document_author_id'],
'rubric_field_id' => $row['rubric_field_id'],
'field_value' => $row['field_value'],
'field_value_more' => $row['field_value_more'],
'tpl_req_empty' => $row['tpl_req_empty'],
'tpl_field_empty' => $row['tpl_field_empty'],
'rubric_id' => $row['rubric_id'],
'rubric_field_alias' => $row['rubric_field_alias'],
'rubric_field_type' => $row['rubric_field_type'],
'rubric_field_default' => $row['rubric_field_default'],
'rubric_field_numeric' => $row['rubric_field_numeric'],
'rubric_field_title' => $row['rubric_field_title'],
'rubric_field_template' => $row['rubric_field_template'],
'rubric_field_template_request' => $row['rubric_field_template_request'],
];
$fields_param[$row['rubric_field_id']] = [
'rubric_id' => $row['rubric_id'],
'rubric_field_alias' => $row['rubric_field_alias'],
'rubric_field_type' => $row['rubric_field_type'],
'rubric_field_default' => $row['rubric_field_default'],
'rubric_field_numeric' => $row['rubric_field_numeric'],
'rubric_field_title' => $row['rubric_field_title'],
'rubric_id' => $row['rubric_id'],
'rubric_field_alias' => $row['rubric_field_alias'],
'rubric_field_type' => $row['rubric_field_type'],
'rubric_field_default' => $row['rubric_field_default'],
'rubric_field_numeric' => $row['rubric_field_numeric'],
'rubric_field_title' => $row['rubric_field_title'],
];
}
}
Registry::set('fields', $document_fields);
if (! Registry::stored('fields_param', $row['rubric_field_id']))
// ИСПРАВЛЕНИЕ: Проверяем, была ли инициализирована переменная ID, прежде чем её использовать.
if ($last_rubric_field_id !== null && ! Registry::stored('fields_param', $last_rubric_field_id))
Registry::set('fields_param', $fields_param);
unset ($document_fields, $rubric_changed_fields, $fields_param);

View File

@@ -4,7 +4,7 @@
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @version 4.x
* @filesource
* @copyright © 2007-2020 AVE.cms, https://ave-cms.ru
*
@@ -324,14 +324,7 @@ function add_slashes($array)
}
//-- Изменяем save_handler, используем функции класса
session_set_save_handler (
array(&$ses_class, '_open'),
array(&$ses_class, '_close'),
array(&$ses_class, '_read'),
array(&$ses_class, '_write'),
array(&$ses_class, '_destroy'),
array(&$ses_class, '_gc')
);
session_set_save_handler($ses_class);
//-- Страт сессии
if (session_status() !== PHP_SESSION_ACTIVE)