Всем добрый вечер. Попробовал на днях "подружить" HLStatsX:CE и MySQL 5.7. Из-за некоторых особенностей новой версии сервера БД, они стабильно и адекватно вместе не работают, а на Ubuntu 16.04, по дефолту идёт именно версия 5.7. Решения из Интернета полноценно не помогли, пришлось снова допиливать под себя. Делюсь инструкцией, вдруг у кого-то такой же "маразм" пробудится (вроде запуска HLStatsX:CE на последней версии MySQL), как у меня.
1). Выключаем демона, если он запущен.
2). Открываем файл /HLstats.plib в папке с демоном, ищем:
Заменяем на:
Сохраняем изменения, закрываем.
3). Создаём файл на веб-хостинге с именем, скажем, /hlstats_mysql57_convert.php, помещаем его в одной папке с веб-частью HLStatsX:CE. Копируем код из под спойлера, и вставляем в него:
4). Запускаем скрипт через браузер. Если вылезет "Всё хорошо.", значит, теперь можно запускать демона.
Теперь необходимо починить веб-часть. Если она выдаёт ошибку при открытии профилей игроков, и показывает не весь профиль, то Вам эти шаги так же надо сделать.
1). Подключаемся к веб-серверу через SSH или открываем ISP Manager.
2). Заходим в конфигурацию MySQL сервера.
После всех вышепроделанных операций, демон и веб-часть HLStatsX:CE "подружились" с новой версией MySQL. По крайней мере, ошибками не сыплет, вроде как.
Тема будет обновляться по мере возникновения новых проблем у этой связки.
1). Выключаем демона, если он запущен.
2). Открываем файл /HLstats.plib в папке с демоном, ищем:
Код:
$db_conn->do("SET NAMES 'utf8'");
Код:
$db_conn->do("SET NAMES 'utf8mb4'");
3). Создаём файл на веб-хостинге с именем, скажем, /hlstats_mysql57_convert.php, помещаем его в одной папке с веб-частью HLStatsX:CE. Копируем код из под спойлера, и вставляем в него:
Код:
<?php
Header("Content-Type: text/plain");
define('IN_HLSTATS', true);
require_once('config.php');
define('DB_PORT', 3306); // порт от сервера БД. Измените, если он не стандартный.
$hDB = null;
$errors = false;
$pdo_options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
try {
$hDB = new PDO(sprintf("mysql:host=%s;dbname=%s;charset=utf8;port=%d", DB_ADDR, DB_NAME, DB_PORT), DB_USER, DB_PASS, $pdo_options);
} catch (PDOException $e) {
echo($e->getMessage());
exit(-1);
}
$hTables = $hDB->query("SHOW TABLES;");
while ($row = $hTables->fetch(PDO::FETCH_BOTH)) {
try {
$table = $row[0];
$data = $hDB->query("DESCRIBE `" . $table . "`;");
while ($structrow = $data->fetch(PDO::FETCH_BOTH)) {
if ($structrow['Type'] == "datetime")
$hDB->exec("ALTER TABLE `" . $table . "` CHANGE `" . $structrow['Field'] . "` `" . $structrow['Field'] . "` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;");
else if ($structrow['Type'] == "date")
$hDB->exec("ALTER TABLE `" . $table . "` CHANGE `" . $structrow['Field'] . "` `" . $structrow['Field'] . "` DATE NOT NULL;");
}
$hDB->exec("ALTER TABLE `" . $table . "` ROW_FORMAT=DYNAMIC;");
$hDB->exec("ALTER TABLE `" . $table . "` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;");
} catch (PDOException $e) {
echo("Произошла ошибка при обработке таблицы ");
echo($table);
echo("\n");
echo($e->getMessage());
echo("\n\n");
$errors = true;
}
}
if (!$errors) {
echo("Всё хорошо.");
} else {
echo("Возникли некоторые проблемы. Обратитесь в тему, скопировав лог ошибок.");
}
Теперь необходимо починить веб-часть. Если она выдаёт ошибку при открытии профилей игроков, и показывает не весь профиль, то Вам эти шаги так же надо сделать.
1). Подключаемся к веб-серверу через SSH или открываем ISP Manager.
2). Заходим в конфигурацию MySQL сервера.
Обратите внимание: заходить надо из под пользователя root!
1). Открываем раздел "Настройки", ищем "Серверы баз данных".
2). Выбираем свой сервер, нажимаем "Настройки".
3). Ищем параметр "sql-mode", нажимаем "Изменить".
4). Добавляем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!).
5). Нажимаем "Ok".



1). Открываем раздел "Настройки", ищем "Серверы баз данных".
2). Выбираем свой сервер, нажимаем "Настройки".
3). Ищем параметр "sql-mode", нажимаем "Изменить".
4). Добавляем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!).
5). Нажимаем "Ok".



1). Переходим в папку конфигурации MySQL и открываем файл любым удобным текстовым редактором.
2). Ищем параметр sql-mode, дописываем в самое начало "STRICT_TRANS_TABLES," (запятая обязательна!). Если не нашли, копируем и вставляем следующую строку в самый конец файла:
3). Сохраняем файл и закрываем редактор. В nano для сохранения - это комбинация клавиш CTRL + O, после чего Enter. Закрытие редактора - CTRL + X.
4). Перезапускаем MySQL-сервер.
Код:
root@kruzefag:~# cd /etc/mysql/mysql.conf.d/
root@kruzefag:/etc/mysql/mysql.conf.d# nano mysqld.cnf
Код:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
4). Перезапускаем MySQL-сервер.
Код:
root@kruzefag:/etc/mysql/mysql.conf.d# service mysqld restart
Тема будет обновляться по мере возникновения новых проблем у этой связки.