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

denj

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

PHP:
GetDisconnectedPlayers() 
{
    decl String:query[255];
    Format(query, sizeof(query), "SELECT * FROM disconnected_players WHERE matchid = '%d'", g_MatchId);
    SQL_TQuery(g_SQL, SQL_GetDisconnectedPlayers, query);
}
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Не пойму как использовать(

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

denj

Участник
Сообщения
23
Реакции
0
Хочу юзать так
PHP:
PrintToServer("%d",  GetDisconnectedPlayers());
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Хочу юзать так
PHP:
PrintToServer("%d",  GetDisconnectedPlayers());

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

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
denj, кажется в том что плагин тормозится и ожидает ответа от сервера с бд.

Что мешает сделать так:
PHP:
GetDisconnectedPlayers()  
{ 
    decl String:query[255]; 
    Format(query, sizeof(query), "SELECT count(*) FROM disconnected_players WHERE matchid = '%d'", g_MatchId); 
    SQL_TQuery(g_SQL, SQL_GetDisconnectedPlayers, query); 
} 

public SQL_GetDisconnectedPlayers(Handle:owner, Handle:hndl, const String:error[], any:userid) 
{ 
    if(hndl == INVALID_HANDLE) 
        LogError("Sql error: %s", error); 
    else 
    { 
        PrintToServer("%d",  SQL_GetRowCount(hndl)); 
    } 
}

Результат будет почти мгновенным, зато безопаснее и без лагов.
 
Последнее редактирование:
  • Мне нравится
Реакции: denj

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
а что плохого в таком методе?

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

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

denj

Участник
Сообщения
23
Реакции
0
Еще я хотел делать так:

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