не производится сохранение данных в 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
Билд
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
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
Версия 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
Список метамодулей
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
Список плагинов
[  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
Автор плагина
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);
}
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 Просмотры: 27
Сообщения
167
Реакции
32
плагин успешно соединяется с бд, создает таблицу все дела.
но, после подключения к серверу, данные не сохраняются в бд. // табличка пустая.
write which error you get while record/data is trying to save any new row into created table ?
 
Сообщения
66
Реакции
7
Помог
1 раз(а)
laucerZ, тоже показалось, но я значения не придал этому, проблему исправил так что да.
 

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

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