From 444983e2d7c44c995f0cfd3f9b516b1cd50150c8 Mon Sep 17 00:00:00 2001 From: Repellent Date: Mon, 13 Oct 2025 17:19:32 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=B7=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=D1=81=D1=8F=20=D0=BE=D1=82=20Warning=20=20=D0=B8?= =?UTF-8?q?=20Deprecated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/class.core.php | 26 ++++--- class/class.database.php | 14 +++- class/class.session.files.php | 125 ++++++++++++++++++------------ class/class.session.memcached.php | 71 ++++++++++------- class/class.session.php | 59 ++++++++------ class/class.template.php | 38 ++++++--- functions/func.fields.php | 64 ++++++++------- inc/init.php | 11 +-- 8 files changed, 245 insertions(+), 163 deletions(-) diff --git a/class/class.core.php b/class/class.core.php index 3a3cf66..a9c221e 100644 --- a/class/class.core.php +++ b/class/class.core.php @@ -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", '', $rubTmpl); + $main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '', $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", '', $rubTmpl); + $main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '', $main_content); } $main_content = str_replace('[tag:if: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); diff --git a/class/class.database.php b/class/class.database.php index b7ae356..db8edec 100644 --- a/class/class.database.php +++ b/class/class.database.php @@ -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); diff --git a/class/class.session.files.php b/class/class.session.files.php index b68083a..6ecb112 100644 --- a/class/class.session.files.php +++ b/class/class.session.files.php @@ -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'); } } diff --git a/class/class.session.memcached.php b/class/class.session.memcached.php index 806812b..01f630d 100644 --- a/class/class.session.memcached.php +++ b/class/class.session.memcached.php @@ -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; } } ?> \ No newline at end of file diff --git a/class/class.session.php b/class/class.session.php index 9b092eb..2864a34 100644 --- a/class/class.session.php +++ b/class/class.session.php @@ -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; } } +?> diff --git a/class/class.template.php b/class/class.template.php index be46651..cb88bfc 100644 --- a/class/class.template.php +++ b/class/class.template.php @@ -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); diff --git a/functions/func.fields.php b/functions/func.fields.php index 12e8078..c51672d 100644 --- a/functions/func.fields.php +++ b/functions/func.fields.php @@ -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); diff --git a/inc/init.php b/inc/init.php index a840c29..511a5e4 100644 --- a/inc/init.php +++ b/inc/init.php @@ -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)