избавляемся от Warning и Deprecated
This commit is contained in:
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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');
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
@@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
11
inc/init.php
11
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)
|
||||
|
Reference in New Issue
Block a user