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

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

  1. truekreo

    truekreo

    Сообщения:
    18
    Симпатии:
    8
    Это в databases.cfg

    Код:
    "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"trueErrorsizeof(Error));
        if (
    DB == INVALID_HANDLE)
        {
            
    PrintToServer("Cannot connect");
            
    CloseHandle(DB);
        } else {
            
    PrintToServer("Connection successful");
        }
        
    RegConsoleCmd("test"test1);
    }

    public 
    Action:test1(clientargs)
    {
        new 
    String:query[255];
        
    Format(query255"INSERT INTO players SET steamid = '1', active = '1'");
        
    PrintToChatAll("test");
        return 
    Plugin_Continue;
    }
    Новая строчка не вставляется, в чем может быть причина?
     
    kyaN нравится это.
  2. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Потому что была сформирована лишь строка, а сам запрос не был отправлен. Используйте функцию 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"sErrorsizeof(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(iClientg_sAuth[iClient], sizeof(g_sAuth[]));
        
    Format(sQuerysizeof(sQuery), "SELECT * FROM `table_name` WHERE `auth` = '%s' LIMIT 1;"g_sAuth[iClient]);
        
    // выполняем запрос
        
    SQL_TQuery(g_hSQLSQLT_OnSelectClientsQueryGetClientUserId(iClient));
    }

    // ф-я обратного вызова при SELECT запросе
    public SQLT_OnSelectClient(Handle:hOwnerHandle: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(hQuery1);
        }
        
    // иначе
        
    else
        {
            
    // устанавливаем нашей переменной значение по умолчанию вручную (пусть это будет ноль)
            
    g_iMyVar[iClient] = 0;
      
            
    // формируем INSERT запрос, чтобы создать для игрока в базе строку
            
    decl String:sQuery[256];
            
    Format(sQuerysizeof(sQuery), "INSERT INTO `table_name` (`auth, `myvar`) VALUES ('%s', 0);"g_sAuth[iClient]);
            
    // выполняем запрос
            
    SQL_TQuery(g_hSQLSQLT_OnInsertClientsQuery);
        }
    }

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

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

    public 
    SQLT_OnUpdateClient(Handle:hOwnerHandle: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, поскольку не потоковые запросы заставляют сервер и игру ждать ответа, в результате чего начинаются подлагивания\зависания вплоть до падения сервера.
     
    Последнее редактирование: 7 мар 2016
  3. truekreo

    truekreo

    Сообщения:
    18
    Симпатии:
    8
    Спасибо, попробую разобраться.
     
    kyaN нравится это.
  4. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
  5. truekreo

    truekreo

    Сообщения:
    18
    Симпатии:
    8
    kyaN нравится это.