добавлена поддержка эмуляции "ADD IF NOT EXISTS" для колонок (MySQL 8) при обновлении модуля

This commit is contained in:
2026-01-28 17:41:12 +05:00
parent 992406845d
commit d8ac60a675

View File

@@ -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