Проблема с SQLite

Тема в разделе "Программирование / Скриптинг", создана пользователем MAGNAT2645, 22 май 2016.

  1. MAGNAT2645

    MAGNAT2645

    Сообщения:
    33
    Симпатии:
    0
    Здравствуйте, у меня произошла небольшая проблема, но всё же она будет плохой для остальных игроков на моём сервере.

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

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

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

    Вот первая ошибка в логах:
    PHP:
    SQLT_OnClientDisconnectunrecognized token"'Здаров"
    Вот вторая:
    PHP:
    SQLT_OnClientDisconnectnear " "syntax error
    Вот отрывки из плагина (весь плагин показать не могу, т.к. хочу оставить его в приватном статусе):

    PHP:
    SaveClient(iClient)
    {
        if (
    IsClientLoaded[iClient])
        {
            
    decl String:sQuery[256], String:sName[MAX_NAME_LENGTH 1];
            
    GetClientName(iClientsQuerysizeof(sQuery));
            
    SQL_EscapeString(hDBsQuerysNamesizeof(sName));
            
    Format(sQuerysizeof(sQuery), "UPDATE `levels` SET `Players` = '%s', `PlayerRank` = '%s', `PlayerEXP` = '%i', `PlayerEXPUp` = '%i', `PlayerLevel` = '%i', `PlayerCash` = '%i', `PlayerCashLimit` = '%i', `PlayerSign` = '%s' WHERE `SteamID` = '%s'"sNameCurrentPlayerRank[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerSign[iClient], PlayerSteamID[iClient]);
            
    SQL_TQuery(hDBSQLT_OnClientDisconnectsQuery);
        }
    }

    public 
    SQLT_OnClientDisconnect(Handle hOwnerHandle 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... (хотя врятли)
     
    Последнее редактирование: 22 май 2016
  2. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    @MAGNAT2645, сделай -
    LogError( sQuery );

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

    MAGNAT2645

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

    P.S. Может использовать SQL_EscapeString(hDB, sQuery, PlayerSign[iClient], sizeof(PlayerSign[])); ?
    --- Добавлено позже ---
    Вот:
    (У меня в нике только две одинарные ковычки, а он выдаёт 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] ?
    --- Добавлено позже ---
    ВСЁ! Я ПРОСТО УВЕЛИЧИЛ ДЛИНУ СТРОКИ И ТЕПЕРЬ ВСЁ СОХРАНЯЕТСЯ, НО СПАСИБО ЗА ПОМОЩЬ!
     
    Последнее редактирование: 22 май 2016
  4. Крабос

    Крабос

    Сообщения:
    45
    Симпатии:
    21
    decl String:sQuery[256]
    сделай 350-450.

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

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

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    1) У тебя маленький размер decl String:sQuery[256] , увеличь хотя бы вдвое. У тебя вот этот текст
    PHP:
    UPDATE `levelsSET `Players` = 'Соки ''Толян'' Lab.', `PlayerRank` = 'Основатель', `PlayerEXP` = '251', `PlayerEXPUp` = '1319', `PlayerLevel` = '58', `PlayerCash` = '1971', `PlayerCashLimit` = '2000', `PlayerSign` = 'Здаров
    Имеет размер - 224 символа, это без учёта русских символов и т.п. а чисто количество символов.
    --- Добавлено позже ---
    Я долго писал ) :ac:
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.989
    Симпатии:
    2.987
    @MAGNAT2645, на будущее тебе и другим:
    Если проблемы с запросом то перед SQL_TQuery сделать LogMessage или LogToFile и дать плагину выполнить запрос. По логам сразу будет видно где и в чем проблема;