From d8ac60a675970adac82978ae248924ae3f0c0f05 Mon Sep 17 00:00:00 2001 From: Repellent Date: Wed, 28 Jan 2026 17:41:12 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=8D=D0=BC=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20"AD?= =?UTF-8?q?D=20IF=20NOT=20EXISTS"=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=BE=D0=BA=20(MySQL=208)=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- class/class.modules.php | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/class/class.modules.php b/class/class.modules.php index 8d2279e..764db25 100644 --- a/class/class.modules.php +++ b/class/class.modules.php @@ -408,9 +408,9 @@ } - /** +/** * Метод, предназначенный для обновления модуля при увеличении номера версии модуля - * + * Модернизирован: добавлена поддержка эмуляции "ADD IF NOT EXISTS" для колонок (MySQL 8) */ public function moduleUpdate () { @@ -431,10 +431,36 @@ include ($sql_file); // Выполняем запросы обновления модуля - // из массива $module_sql_update файла sql.php foreach ($module_sql_update AS $sql) { - $AVE_DB->Query(str_replace('%%PRFX%%', PREFIX, $sql)); + // Заменяем префикс в запросе + $sql = str_replace('%%PRFX%%', PREFIX, $sql); + + // Эмуляция ADD IF NOT EXISTS для колонок + if (stripos($sql, 'ADD IF NOT EXISTS') !== false) + { + // Ищем имя таблицы и колонки, игнорируя кавычки + if (preg_match('/ALTER\s+TABLE\s+[`"\'\s]?([\w%]+)[`"\'\s]?\s+ADD\s+IF\s+NOT\s+EXISTS\s+[`"\'\s]?([\w]+)[`"\'\s]?/i', $sql, $matches)) + { + $tableName = $matches[1]; + $columnName = $matches[2]; + + // Проверяем, существует ли уже колонка в базе + $check = $AVE_DB->Query("SHOW COLUMNS FROM `{$tableName}` LIKE '{$columnName}'"); + + // Если поле уже найдено — переходим к следующему запросу в массиве + if ($check && $check->FetchRow()) { + continue; + } + + // Если поля нет — убираем "IF NOT EXISTS", превращая в легальный ADD + // При этом хвост запроса (тип поля, AFTER и т.д.) сохраняется + $sql = str_replace('IF NOT EXISTS', '', $sql); + } + } + + // Выполняем итоговый запрос + $AVE_DB->Query($sql); } } // Обновляем модуль, если в нем не применяется (отсутствует) файл sql.php