Функция возвращающая кол-во строк в бд mysql

Тема в разделе "Программирование / Скриптинг", создана пользователем denj, 11 июн 2015.

  1. denj

    denj

    Сообщения:
    30
    Симпатии:
    0
    Подскажите как сделать чтобы функция возвращала кол-во строк.

    PHP:
    GetDisconnectedPlayers() 
    {
        
    decl String:query[255];
        
    Format(querysizeof(query), "SELECT * FROM disconnected_players WHERE matchid = '%d'"g_MatchId);
        
    SQL_TQuery(g_SQLSQL_GetDisconnectedPlayersquery);
    }
     
  2. gibs

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

    Сообщения:
    540
    Симпатии:
    137
    SQL_GetRowCount ?
     
  3. denj

    denj

    Сообщения:
    30
    Симпатии:
    0
    Не пойму как использовать(
     
  4. gibs

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

    Сообщения:
    540
    Симпатии:
    137
    Ну если нам это надо применить к ответу от бд, то просто головой подумай где и как это применять)) В твоём варианте:
    PHP:
    public SQL_GetDisconnectedPlayers(Handle:ownerHandle:hndl, const String:error[], any:userid)
    {
        if(
    hndl == INVALID_HANDLE)
            
    LogError("Sql error: %s"error);
        else
        {
            new 
    iRowCount SQL_GetRowCount(hndl);
        }
    }
     
  5. denj

    denj

    Сообщения:
    30
    Симпатии:
    0
    Хочу юзать так
    PHP:
    PrintToServer("%d",  GetDisconnectedPlayers());
     
  6. gibs

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

    Сообщения:
    540
    Симпатии:
    137
    А через потоковый запрос не получится так сделать. По-твоему желанию должно быть примерно так:

    PHP:
    GetDisconnectedPlayers()  

        
    decl String:query[255]; 
        
    Format(querysizeof(query), "SELECT * FROM disconnected_players WHERE matchid = '%d'"g_MatchId); 
        new 
    Handle:hResult SQL_Query(g_SQLquery);
        if(
    hResult == INVALID_HANDLE)
            return -
    1;
        
        new 
    iRowCount SQL_GetRowCount(hResult);
        
        
    CloseHandle(hResult);
        
        return 
    iRowCount;
    }  
    Вернёт значение '-1' - значит ошибка бд.
    Но я бы не рекомендовал делать запросы к бд таким методом.
    Пробуй делать варианты, при которых бд не будет возвращать неизвестное количество строк.
    Код:
    SELECT [COLOR="Red"][B]count(*)[/B][/COLOR] FROM disconnected_players WHERE matchid = '%d'
     
    denj нравится это.
  7. denj

    denj

    Сообщения:
    30
    Симпатии:
    0
    а что плохого в таком методе?
     
  8. R1KO

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

    Сообщения:
    5.999
    Симпатии:
    2.992
    denj, кажется в том что плагин тормозится и ожидает ответа от сервера с бд.

    Что мешает сделать так:
    PHP:
    GetDisconnectedPlayers()  

        
    decl String:query[255]; 
        
    Format(querysizeof(query), "SELECT count(*) FROM disconnected_players WHERE matchid = '%d'"g_MatchId); 
        
    SQL_TQuery(g_SQLSQL_GetDisconnectedPlayersquery); 


    public 
    SQL_GetDisconnectedPlayers(Handle:ownerHandle:hndl, const String:error[], any:userid

        if(
    hndl == INVALID_HANDLE
            
    LogError("Sql error: %s"error); 
        else 
        { 
            
    PrintToServer("%d",  SQL_GetRowCount(hndl)); 
        } 

    Результат будет почти мгновенным, зато безопаснее и без лагов.
     
    Последнее редактирование: 12 июн 2015
    denj нравится это.
  9. gibs

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

    Сообщения:
    540
    Симпатии:
    137
    Ну начиная с самого запроса.
    Mysql поддерживает целую кучу функций и операторов, в том числе функцию count(). При использовании этой функции бд вернёт всего одно поле с одной цифрой, а не n полей, которые надо посчитать.

    Вторая причина - верно, при использовании функции SQL_Query() функция зависает в ожидании ответа от сервера бд, что может вызвать подвисание игрового сервера. Лучше использовать потоковый запрос через SQL_TQuery().
     
    denj нравится это.
  10. denj

    denj

    Сообщения:
    30
    Симпатии:
    0
    Еще я хотел делать так:

    PHP:
    if (!GetDisconnectedPlayers())
    {
    /*код*/
    }
    else
    {
    /*код*/
    }
    Как лучше всего это реализовать?