Проблема с SQLite

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Здравствуйте, у меня произошла небольшая проблема, но всё же она будет плохой для остальных игроков на моём сервере.

Однажды я бросил сервер и решил снова проверить его работоспособность (Обновил его до последней версии и т.д). Всё вроде бы хорошо, да вот одна проблема:

У меня есть плагин на уровни, очки опыта и т.п., и в него встроена БД на драйвере SQLite для сохранения данных игроков, прежде чем я бросил сервер, все данные сохранялись в БД без ошибок, но когда я снова решил поиграть на сервере - мои данные оставались старыми и не обновлялись в БД. Плагин стал выводить ошибки в логах. (Хотя я вроде сам плагин не изменял, ну пару раз если только)

Там есть функция SaveClient, которая сохраняет/обновляет данные в БД и я её в коде использую почти в каждом случае для того, чтобы данные сохранялись часто.

Вот первая ошибка в логах:
PHP:
SQLT_OnClientDisconnect: unrecognized token: "'Здаров"

Вот вторая:
PHP:
SQLT_OnClientDisconnect: near " ": syntax error

Вот отрывки из плагина (весь плагин показать не могу, т.к. хочу оставить его в приватном статусе):

PHP:
SaveClient(iClient)
{
    if (IsClientLoaded[iClient])
    {
        decl String:sQuery[256], String:sName[MAX_NAME_LENGTH * 2 + 1];
        GetClientName(iClient, sQuery, sizeof(sQuery));
        SQL_EscapeString(hDB, sQuery, sName, sizeof(sName));
        Format(sQuery, sizeof(sQuery), "UPDATE `levels` SET `Players` = '%s', `PlayerRank` = '%s', `PlayerEXP` = '%i', `PlayerEXPUp` = '%i', `PlayerLevel` = '%i', `PlayerCash` = '%i', `PlayerCashLimit` = '%i', `PlayerSign` = '%s' WHERE `SteamID` = '%s'", sName, CurrentPlayerRank[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerSign[iClient], PlayerSteamID[iClient]);
        SQL_TQuery(hDB, SQLT_OnClientDisconnect, sQuery);
    }
}

public SQLT_OnClientDisconnect(Handle hOwner, Handle hQuery, const String:sError[], any:iUserId)
{
    if (!hQuery)
    {
        LogError("SQLT_OnClientDisconnect: %s", sError);
    }
}

Если надо добавить ещё отрывки - только скажите какие...

P.S. Я недавно (когда бросил сервер и не играл) сделал изменение в коде, а именно изменил Handle db на hDB, потому что в компиляторе выводилось предупреждение о том, что в inc уже присутствует слово db. Я подумал, что эта проблема могла произойти после смены названия переменной...

P.S Или возможно проблема появилась из-за того, что я поменял Handle:hOwner, Handle:hQuery на Handle hOwner, Handle hQuery... (хотя врятли)
 
Последнее редактирование:

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
@MAGNAT2645, сделай -
LogError( sQuery );

PHP:
Format(sQuery, sizeof(sQuery), "UPDATE `levels` SET `Players` = '%s', `PlayerRank` = '%s', `PlayerEXP` = '%i', `PlayerEXPUp` = '%i', `PlayerLevel` = '%i', `PlayerCash` = '%i', `PlayerCashLimit` = '%i', `PlayerSign` = '%s' WHERE `SteamID` = '%s'", sName, CurrentPlayerRank[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerSign[iClient], PlayerSteamID[iClient]);
//ТУТ
        SQL_TQuery(hDB, SQLT_OnClientDisconnect, sQuery);
--- Добавлено позже ---
Ну и посмотри что выдаст, точнее какой запрос отправляется, может просто где-то лишняя кавычка ' или `, ещё в конце запроса лучше поставить ; , точку с запятой.
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Я кажется понял в чём проблема: В одинарных ковычках ( ' ), они не позволяют выполнить запрос UPDATE SET до конца... Но вот только как это исправить?

P.S. Может использовать SQL_EscapeString(hDB, sQuery, PlayerSign[iClient], sizeof(PlayerSign[])); ?
--- Добавлено позже ---
@MAGNAT2645, сделай -
LogError( sQuery );

PHP:
Format(sQuery, sizeof(sQuery), "UPDATE `levels` SET `Players` = '%s', `PlayerRank` = '%s', `PlayerEXP` = '%i', `PlayerEXPUp` = '%i', `PlayerLevel` = '%i', `PlayerCash` = '%i', `PlayerCashLimit` = '%i', `PlayerSign` = '%s' WHERE `SteamID` = '%s'", sName, CurrentPlayerRank[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerSign[iClient], PlayerSteamID[iClient]);
//ТУТ
        SQL_TQuery(hDB, SQLT_OnClientDisconnect, sQuery);
--- Добавлено позже ---
Ну и посмотри что выдаст, точнее какой запрос отправляется, может просто где-то лишняя кавычка ' или `, ещё в конце запроса лучше поставить ; , точку с запятой.

Вот:
(У меня в нике только две одинарные ковычки, а он выдаёт 4)

UPDATE `levels` SET `Players` = 'Соки ''Толян'' Lab.', `PlayerRank` = 'Основатель', `PlayerEXP` = '251', `PlayerEXPUp` = '1319', `PlayerLevel` = '58', `PlayerCash` = '1971', `PlayerCashLimit` = '2000', `PlayerSign` = 'Здаров

И кстати, почему PlayerSign не до конца в логе выведен?
--- Добавлено позже ---
Иногда в логе пишет это:

L 05/22/2016 - 11:28:08: [myplugins\levels.smx] SQLT_OnClientDisconnect: near " ": syntax error

Но при попытке обновить мои или чужие данные в БД часто пишет это:

L 05/22/2016 - 11:29:57: [myplugins\levels.smx] SQLT_OnClientDisconnect: unrecognized token: "'Здаров"
--- Добавлено позже ---
Теперь выводит это в лог:

UPDATE `levels` SET `Players` = 'Соки ''Толян'' Lab.', `PlayerRank` = 'Основатель', `PlayerEXP` = '254', `PlayerEXPUp` = '1319', `PlayerLevel` = '58', `PlayerCash` = '1973', `PlayerCashLimit` = '2000', `PlayerSign` = '._.' WHERE

SQLT_OnClientDisconnect: near " ": syntax error
--- Добавлено позже ---
Я поменял пару данных в самой игре у себя на сервере и теперь в логах это:

UPDATE `levels` SET `Players` = 'Соки ''Толян'' Lab.', `PlayerRank` = '.', `PlayerEXP` = '0', `PlayerEXPUp` = '6', `PlayerLevel` = '0', `PlayerCash` = '0', `PlayerCashLimit` = '2000', `PlayerSign` = '.' WHERE `SteamID` = 'STEAM_0:1:6477664

SQLT_OnClientDisconnect: unrecognized token: "'STEAM_0:1:6477664"
--- Добавлено позже ---
Может мне увеличить длину строки sQuery[256] хотябы на sQuery[500] ?
--- Добавлено позже ---
ВСЁ! Я ПРОСТО УВЕЛИЧИЛ ДЛИНУ СТРОКИ И ТЕПЕРЬ ВСЁ СОХРАНЯЕТСЯ, НО СПАСИБО ЗА ПОМОЩЬ!
 
Последнее редактирование:

FurFur

Участник
Сообщения
153
Реакции
85
decl String:sQuery[256]
сделай 350-450.

У тебя в массиве просто не хватает ячеек.

Один только ник может занимать 100 символов если он написан на русском языке, а русские символы занимают сразу 2 ячейки..
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
И кстати, почему PlayerSign не до конца в логе выведен?
1) У тебя маленький размер decl String:sQuery[256] , увеличь хотя бы вдвое. У тебя вот этот текст
PHP:
UPDATE `levels` SET `Players` = 'Соки ''Толян'' Lab.', `PlayerRank` = 'Основатель', `PlayerEXP` = '251', `PlayerEXPUp` = '1319', `PlayerLevel` = '58', `PlayerCash` = '1971', `PlayerCashLimit` = '2000', `PlayerSign` = 'Здаров
Имеет размер - 224 символа, это без учёта русских символов и т.п. а чисто количество символов.
--- Добавлено позже ---
ВСЁ! Я ПРОСТО УВЕЛИЧИЛ ДЛИНУ СТРОКИ И ТЕПЕРЬ ВСЁ СОХРАНЯЕТСЯ, НО СПАСИБО ЗА ПОМОЩЬ!
Я долго писал ) :ac:
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
@MAGNAT2645, на будущее тебе и другим:
Если проблемы с запросом то перед SQL_TQuery сделать LogMessage или LogToFile и дать плагину выполнить запрос. По логам сразу будет видно где и в чем проблема;
 
Сверху Снизу