Не работают запросы к БД

truekreo

Участник
Сообщения
18
Реакции
9
Это в databases.cfg

C-подобный:
"Mysql"
    {
        "driver"            "default"
        "host"                "host"
        "database"            "db"
        "user"                "user"
        "pass"                "pw"
        //"timeout"            "0"
        "port"            "3306"
    }

Значения правильные, всё проверил несколько раз, БД поддерживает внешние подключения тоже это проверил.

Это в самом sp

PHP:
#include <sourcemod>

new Handle:DB = INVALID_HANDLE;

public OnPluginStart()
{
    new String:Error[70];
    DB = SQL_Connect("Mysql", true, Error, sizeof(Error));
    if (DB == INVALID_HANDLE)
    {
        PrintToServer("Cannot connect");
        CloseHandle(DB);
    } else {
        PrintToServer("Connection successful");
    }
    RegConsoleCmd("test", test1);
}

public Action:test1(client, args)
{
    new String:query[255];
    Format(query, 255, "INSERT INTO players SET steamid = '1', active = '1'");
    PrintToChatAll("test");
    return Plugin_Continue;
}

Новая строчка не вставляется, в чем может быть причина?
 
  • Мне нравится
Реакции: kyaN

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
Потому что была сформирована лишь строка, а сам запрос не был отправлен. Используйте функцию SQL_TQuery.

Вот когда-то кому-то писал пример работы с SQL, может и вам пригодится. Как записать переменную в бд и как её оттуда считать. Единственное что, писал для локальной SQLite, но я думаю вы сможете переделать.
PHP:
new Handle:    g_hSQL;                            // глобальная переменная для базы данных
new String:    g_sAuth[MAXPLAYERS+1][32];        // глобальная переменная SteamID игроков
new            g_iMyVar[MAXPLAYERS+1];            // глобальная переменная с какой-то информацией,
                                            // которую нужно сохранять

// когда плагин запустился
public OnPluginStart()
{
    // подключаемся к базе данных
    decl String:sError[256];
    g_hSQL = SQLite_UseDatabase("mydb", sError, sizeof(sError));
    if ( !g_hSQL )
    {
        LogError("SQLite_UseDatabase error: %s", sError);
        SetFailState("SQLite_UseDatabase error: %s", sError);
    }

    // создаем таблицу в бд
    SQL_LockDatabase(g_hSQL);
    SQL_FastQuery(g_hSQL, "CREATE TABLE IF NOT EXISTS `table_name` (`auth` TEXT(32), `myvar` INT);");
    SQL_UnlockDatabase(g_hSQL);
}

// когда игрок зашел на сервер
public OnClientPutInServer(iClient)
{
    // формируем SELECT запрос для получения информации о игроке из базы данных
    decl String:sQuery[256];
    GetClientAuthString(iClient, g_sAuth[iClient], sizeof(g_sAuth[]));
    Format(sQuery, sizeof(sQuery), "SELECT * FROM `table_name` WHERE `auth` = '%s' LIMIT 1;", g_sAuth[iClient]);
    // выполняем запрос
    SQL_TQuery(g_hSQL, SQLT_OnSelectClient, sQuery, GetClientUserId(iClient));
}

// ф-я обратного вызова при SELECT запросе
public SQLT_OnSelectClient(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
    // если что-то не так, то выводим ошибку в логи
    if ( !hQuery )
    {
        LogError("SQLT_OnSelectClient error: %s", sError);
        return;
    }

    // получаем игрока из UserId, который мы передали в SQL_TQuery()
    new iClient = GetClientOfUserId(iUserId);
    if ( !iClient )
    {
        return;
    }

    // если есть информация в бд
    if ( SQL_FetchRow(hQuery) )
    {
        // то извлекаем её. Нумерация идет с нуля, у нас первое поле это `auth`, `myvar` уже второе поле, поэтому 1
        g_iMyVar[iClient] = SQL_FetchInt(hQuery, 1);
    }
    // иначе
    else
    {
        // устанавливаем нашей переменной значение по умолчанию вручную (пусть это будет ноль)
        g_iMyVar[iClient] = 0;
  
        // формируем INSERT запрос, чтобы создать для игрока в базе строку
        decl String:sQuery[256];
        Format(sQuery, sizeof(sQuery), "INSERT INTO `table_name` (`auth, `myvar`) VALUES ('%s', 0);", g_sAuth[iClient]);
        // выполняем запрос
        SQL_TQuery(g_hSQL, SQLT_OnInsertClient, sQuery);
    }
}

public SQLT_OnInsertClient(Handle:hOwner, Handle:hQuery, const String:sError[], any:null)
{
    // если что-то не так, то выводим ошибку в логи
    if ( !hQuery )
    {
        LogError("SQLT_OnInsertClient error: %s", sError);
        return;
    }
}

// при выходе игрока с сервера
public OnClientDisconnect(iClient)
{
    // формируем UPDATE запрос
    decl String:sQuery[256];
    Format(sQuery, sizeof(sQuery), "UPDATE `table_name` SET `myvar` = %d WHERE `auth` = '%s';", g_iMyVar[iClient], g_sAuth[iClient]);
    // выполняем запрос
    SQL_TQuery(g_hSQL, SQLT_OnUpdateClient, sQuery, GetClientUserId(iClient));
}

public SQLT_OnUpdateClient(Handle:hOwner, Handle:hQuery, const String:sError[], any:null)
{
    // если что-то не так, то выводим ошибку в логи
    if ( !hQuery )
    {
        LogError("SQLT_OnUpdateClient error: %s", sError);
        return;
    }
}


P.S. Избегайте использования функций SQL_Connect, SQL_Query. Используйте их аналоги, которые выполняют свои действия в отдельном потоке - SQL_TConnect, SQL_TQuery, поскольку не потоковые запросы заставляют сервер и игру ждать ответа, в результате чего начинаются подлагивания\зависания вплоть до падения сервера.
 
Последнее редактирование:
Сверху Снизу