не производится сохранение данных в db

Сообщения
66
Реакции
7
Помог
1 раз(а)
Ошибка
не имеется.
ОС
Linux
Amx Mod X
amxx version
AMX Mod X 1.9.0.5249 (http://www.amxmodx.org)
Authors:
        David "BAILOPAN" Anderson, Pavol "PM OnoTo" Marko
        Felix "SniperBeamer" Geyer, Jonny "Got His Gun" Bergstrom
        Lukasz "SidLuke" Wlasinski, Christian "Basic-Master" Hammacher
        Borja "faluco" Ferrer, Scott "DS" Ehlert
Compiled: Jun 19 2019 13:32:02
Built from: https://github.com/alliedmodders/amxmodx/commit/6cecb34e
Build ID: 5249:6cecb34e
Core mode: JIT+ASM32
C++
Билд
version
Protocol version 48
Exe version 1.6.3.7/Stdio (cstrike)
ReHLDS version: 3.13.0.788-dev
Build date: 07:37:36 Jul 12 2023 (3378)
Build from: https://github.com/dreamstalker/rehlds/commit/f955b07
C++
ReGamedll
game version
ReGameDLL version: 5.26.0.668-dev
Build date: 19:02:33 Dec 31 2023
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/d3c0ec8
C++
Версия Metamod
meta version
Metamod-r v1.3.0.128, API (5:13)
Metamod-r build: 15:47:38 Aug 24 2018
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/0cf2f70
C++
Список метамодулей
description  stat pend  file            vers             src  load  unload
 [ 1] AMX Mod X    RUN   -    amxmodx_mm.dll  v1.9.0.5249      ini  Start ANY
 [ 2] Reunion      RUN   -    reunion_mm.dll  v0.1.0.92        ini  Start Never
 [ 3] Revoice      RUN   -    revoice_mm.dll  v0.1.0.32        ini  Start Never
 [ 4] ReAPI        RUN   -    reapi_amxx.dll  v5.24.0.300-dev  pl1  ANY   Never
 [ 5] GeoIP        RUN   -    geoip_amxx.dll  v1.9.0.5249      pl1  ANY   ANY
 [ 6] MySQL        RUN   -    mysql_amxx.dll  v1.9.0.5249      pl1  ANY   ANY
6 plugins, 6 running
C++
Список плагинов
[  1] Custom Player Informer  1.2 Pre-re  kreedzru          CustomPlayerInf  debug
 [  2] Admin Base              1.9.0.5249  AMXX Dev Team     admin.amxx       running
 [  3] Admin Commands          1.9.0.5249  AMXX Dev Team     admincmd.amxx    running
 [  4] Admin Help              1.9.0.5249  AMXX Dev Team     adminhelp.amxx   running
 [  5] Slots Reservation       1.9.0.5249  AMXX Dev Team     adminslots.amxx  running
 [  6] Multi-Lingual System    1.9.0.5249  AMXX Dev Team     multilingual.am  running
 [  7] Menus Front-End         1.9.0.5249  AMXX Dev Team     menufront.amxx   running
 [  8] Commands Menu           1.9.0.5249  AMXX Dev Team     cmdmenu.amxx     running
 [  9] Players Menu            1.9.0.5249  AMXX Dev Team     plmenu.amxx      running
 [ 10] Maps Menu               1.9.0.5249  AMXX Dev Team     mapsmenu.amxx    running
 [ 11] Plugin Menu             1.9.0.5249  AMXX Dev Team     pluginmenu.amxx  running
 [ 12] Admin Chat              1.9.0.5249  AMXX Dev Team     adminchat.amxx   running
 [ 13] Anti Flood              1.9.0.5249  AMXX Dev Team     antiflood.amxx   running
 [ 14] Scrolling Message       1.9.0.5249  AMXX Dev Team     scrollmsg.amxx   running
 [ 15] Info. Messages          1.9.0.5249  AMXX Dev Team     imessage.amxx    running
 [ 16] Admin Votes             1.9.0.5249  AMXX Dev Team     adminvote.amxx   running
 [ 17] NextMap                 1.9.0.5249  AMXX Dev Team     nextmap.amxx     running
 [ 18] Nextmap Chooser         1.9.0.5249  AMXX Dev Team     mapchooser.amxx  running
 [ 19] TimeLeft                1.9.0.5249  AMXX Dev Team     timeleft.amxx    running
 [ 20] Pause Plugins           1.9.0.5249  AMXX Dev Team     pausecfg.amxx    running
 [ 21] Stats Configuration     1.9.0.5249  AMXX Dev Team     statscfg.amxx    running
21 plugins, 21 running
C++
Автор плагина
kreedzru
Версия плагина
1.2 Pre-release
Исходный код
#include <amxmodx>
#include <geoip>
#include <sqlx>

#define g_isPlugin "Custom Player Informer"
#define g_isVersion "1.2 Pre-release"
#define g_isAuthors "kreedzru"

// mysql integration :D
new Handle:g_SqlTuple;
new g_SqlHost[64], g_SqlUser[32], g_SqlPassword[32], g_SqlDatabase[64];
new g_SqlErrors[512];

new g_CPIEnabled,
    g_CPILogConsole,
    g_CPILogFile,
    g_CPIShowIpAdress,
    g_CPIShowSteamId,
    g_CPIClientCountry;

public plugin_init() 
{
    register_plugin(g_isPlugin, g_isVersion, g_isAuthors);
    register_dictionary("custom_player_informer.txt");
    
    register_cvar("cpi_enabled", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_log_console", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_log_file", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_show_ip", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_show_steamid", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_show_country", "1", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_sqlhost", "localhost", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_sqluser", "username", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_sqlpass", "password", FCVAR_SPONLY | FCVAR_UNLOGGED);
    register_cvar("cpi_dbname", "dbname", FCVAR_SPONLY | FCVAR_UNLOGGED);

    AutoExecConfig(true, "custom_player_informer");

    log_amx("[Custom Player Informer] Plugin is initialized // kreedzru");
}

public plugin_cfg()
{
    LoadSettings();
    LoadMySQLSettings();
    //ConnectToMySQL();
    ConnectToMySQL(g_SqlHost, g_SqlUser, g_SqlPassword, g_SqlDatabase);
    dbTableCreate();
}

LoadSettings()
{
    g_CPIEnabled = get_cvar_num("cpi_enabled");
    g_CPILogConsole = get_cvar_num("cpi_log_console");
    g_CPILogFile = get_cvar_num("cpi_log_file");
    g_CPIShowIpAdress = get_cvar_num("cpi_show_ip");
    g_CPIShowSteamId = get_cvar_num("cpi_show_steamid");
    g_CPIClientCountry = get_cvar_num("cpi_show_country");
    
    log_amx("[Custom Player Informer] Настройки плагина загружены.");
    //log_amx("[Custom Player Informer Debug] Settings: Enabled=%d, LogConsole=%d, , LogFile=%d, ShowIP=%d, ShowSteamID=%d, ShowCountry=%d", g_CPIEnabled, g_CPILogConsole, g_CPILogFile, g_CPIShowIpAdress, g_CPIShowSteamId, g_CPIClientCountry);
}

LoadMySQLSettings() {
    get_cvar_string("cpi_sqlhost", g_SqlHost, charsmax(g_SqlHost));
    get_cvar_string("cpi_sqluser", g_SqlUser, charsmax(g_SqlUser));
    get_cvar_string("cpi_sqlpass", g_SqlPassword, charsmax(g_SqlPassword));
    get_cvar_string("cpi_dbname", g_SqlDatabase, charsmax(g_SqlDatabase));
}

ConnectToMySQL(const g_SqlHost[], const g_SqlUser[], const g_SqlPassword[], const g_SqlDatabase[], timeout = 0) {
    g_SqlTuple = SQL_MakeDbTuple(g_SqlHost, g_SqlUser, g_SqlPassword, g_SqlDatabase, timeout);

    new errcode;
    new Handle:SqlConnection = SQL_Connect(g_SqlTuple, errcode, g_SqlErrors, charsmax(g_SqlErrors));
    if (SqlConnection == Empty_Handle) {
        log_amx("[Custom Player Informer] Ошибка при подключении к MySQL: %s", g_SqlErrors);
        return;
    }
    log_amx("[Custom Player Informer] Успешное подключение к MySQL.");
    SQL_FreeHandle(SqlConnection);
}

public client_putinserver(id)
{
    if(!g_CPIEnabled) {
        return;
    }
    
    new szName[32], szIp[16], szSteamId[35], szCountry[3], iUserid;
    new szTime[16];
    
    get_user_name(id, szName, charsmax(szName));
    get_user_ip(id, szIp, charsmax(szIp), 1);
    iUserid = get_user_userid(id);
    get_user_authid(id, szSteamId, charsmax(szSteamId));
    geoip_code2_ex(szIp, szCountry);
    get_time("%H:%M:%S", szTime, charsmax(szTime));
    
    new szLogMsg[256], iLen;
    
    iLen = formatex(szLogMsg, charsmax(szLogMsg), "[Custom Player Informer] Player: %s, Time: %s", szName, szTime);
    
    if(g_CPIShowIpAdress) {
        iLen += formatex(szLogMsg[iLen], charsmax(szLogMsg) - iLen, " || IP: %s", szIp);
    }
    if(g_CPIShowSteamId) {
        iLen += formatex(szLogMsg[iLen], charsmax(szLogMsg) - iLen, " || SteamID: %s", szSteamId);
    }
    if(g_CPIClientCountry) {
        iLen += formatex(szLogMsg[iLen], charsmax(szLogMsg) - iLen, " || Country: %s", szCountry);
    }
    
    formatex(szLogMsg[iLen], charsmax(szLogMsg) - iLen, " || UserID: %d", iUserid);
    
    if(g_CPILogConsole && !g_CPILogFile)
        log_amx(szLogMsg);
    
    if(g_CPILogFile)
    {
        new szFileName[64];
        get_time("CustomPlayerInformer_%Y-%m-%d.log", szFileName, charsmax(szFileName));
        log_to_file(szFileName, szLogMsg);
    }

    client_print(0, print_chat, "%L", LANG_PLAYER, "CPI_CONNECT", szName, szTime, szIp, szSteamId, szCountry, iUserid);
    iSaveDataPlayer(id);
}

// хз нах я сделал пустой обработчик sql-запросов ну лан
public Empty_Handler(FailState, Handle:Query, Error[], ErrCode, Data[], DataSize)
{
    if (FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
    {
        log_amx("[Custom Player Informer] SQL Error: %s", Error);
    }
}

dbTableCreate() {
    new errcode;
    new Handle:SqlConnection = SQL_Connect(g_SqlTuple, errcode, g_SqlErrors, charsmax(g_SqlErrors));
    if (SqlConnection == Empty_Handle) {
        log_amx("[Custom Player Informer] Ошибка подключения к MySQL: %s", g_SqlErrors);
        return;
    }

    new iQuery[512];
    formatex(iQuery, charsmax(iQuery),
    "CREATE TABLE IF NOT EXISTS `cpi_players` ( \
    `id` INT AUTO_INCREMENT PRIMARY KEY, \
    `name` VARCHAR(64) NOT NULL, \
    `ip` VARCHAR(16) NOT NULL, \
    `steamid` VARCHAR(35) NOT NULL, \
    `country` VARCHAR(3) NOT NULL, \
    `userid` INT NOT NULL, \
    `connect_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP \
    );")

    if (!SQL_ThreadQuery(g_SqlTuple, "Empty_Handler", iQuery)) {
        SQL_QueryError(SqlConnection, g_SqlErrors, charsmax(g_SqlErrors));
        log_amx("[Custom Player Informer] Ошибка при создании таблицы: %s", g_SqlErrors);
    }
    SQL_FreeHandle(SqlConnection);
    //SQL_ThreadQuery(g_SqlTuple, "Empty_Handler", iQuery);
}

iSaveDataPlayer(id) {
    new szName[32], szIp[16], szSteamId[35], szCountry[3], iUserid;

    get_user_name(id, szName, charsmax(szName));
    get_user_ip(id, szIp, charsmax(szIp), 1);
    iUserid = get_user_userid(id);
    get_user_authid(id, szSteamId, charsmax(szSteamId));
    geoip_code2_ex(szIp, szCountry);

    new iQuery[512];
    formatex(iQuery, charsmax(iQuery),
        "INSERT INTO `cpi_players` (`name`, `ip`, `steamid`, `country`, `userid`) \
        VALUES ('%s', '%s', '%s', '%s', '%d');",
        szName, szIp, szSteamId, szCountry, iUserid);

    SQL_ThreadQuery(g_SqlTuple, "Empty_Handler", iQuery);
}
C++
yo all, не судите за данное чудо-юдо.
суть проблемы:
плагин успешно соединяется с бд, создает таблицу все дела.
но, после подключения к серверу, данные не сохраняются в бд. // табличка пустая.

я уже 8 часов сижу колдую, думая что может быть не так.
думаю сделать экранирование строк через SQL_QuoteString, но скорее всего положительного результата не будет.
 
В этой теме было размещено решение! Перейти к решению.
Сообщения
210
Реакции
488
Помог
3 раз(а)
wuzzup-profile_image-372d4d3c1033807c-300x300.jpeg

думаю сделать экранирование строк
Так это нужно сделать обязательно, для всех строковых переменных перед вставкой в запрос. Иначе будут ошибки из-за спецсимволов + возможность для SQL инъекции.
 
Сообщения
66
Реакции
7
Помог
1 раз(а)
the_hunter, это понятно, я уже давно экранирование строк сделал, результата положительного не увидел.
таблица все равно пустая, скорее всего где-то в коде напортачил.
 
Сообщения
102
Реакции
8
Помог
1 раз(а)
Решение проблемы

1. Не закрывайте соединение в ConnectToMySQL

В ConnectToMySQL вы проверяете подключение, но сразу освобождаете SqlConnection. Вместо этого сохраните g_SqlTuple как глобальную переменную и используйте его для всех запросов.

Однако, поскольку вы используете SQL_ThreadQuery, вам не нужно вручную держать SqlConnection открытым — достаточно убедиться, что g_SqlTuple валиден. Уберите освобождение SQL_FreeHandle или оставьте его только для тестового подключения.
2. Используйте экранирование данных

В iSaveDataPlayer данные вроде szName могут содержать специальные символы (например, кавычки), что ломает запрос. Используйте SQL_QuoteString или аналогичную функцию для экранирования

3. Проверьте создание таблицы

Убедитесь, что таблица создается корректно. В dbTableCreate вы используете SQL_ThreadQuery, но не проверяете результат напрямую. Добавьте логирование успеха:

4. Тестирование

После внесения изменений:
  • Проверьте логи AMX (файлы logs/error_*.log или консольные сообщения).
  • Подключитесь к серверу как игрок и убедитесь, что данные появляются в таблице.
  • Используйте инструмент вроде phpMyAdmin или консоли MySQL для проверки содержимого таблицы cpi_players.
  • Итоговые шаги
    1. Убедитесь, что g_SqlTuple остается валидным после plugin_cfg.
    2. Экранируйте данные в SQL-запросах.
    3. Расширьте логирование ошибок, чтобы видеть, что происходит с запросами.
    4. Проверьте настройки MySQL (хост, пользователь, пароль, база данных) в cpi_sqlhost, cpi_sqluser, cpi_sqlpass, cpi_dbname.
полностью готовый код
 

Вложения

  • 2 KB Просмотры: 30
Сообщения
167
Реакции
32
плагин успешно соединяется с бд, создает таблицу все дела.
но, после подключения к серверу, данные не сохраняются в бд. // табличка пустая.
write which error you get while record/data is trying to save any new row into created table ?
 
Сообщения
66
Реакции
7
Помог
1 раз(а)
laucerZ, тоже показалось, но я значения не придал этому, проблему исправил так что да.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу