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