MySQL SELECT Not getting last row
#2

I am certain you execute more queries than needed to retrieve all the information. Another important thing to keep in mind is that using non-threaded queries and not removing the cache afterwards will cause memory leaks.

If more than 1 player use the same dialog, "members2" will be overwritten so the best way (at least for me) would be to save the cache in memory. In the dialog's response, if the player clicked on next page, set the cache and load the rest otherwise delete it.

Rows returned is the number of members so no need to keep calling GetMaxMembers over and over again. You can select rank along with "Name" in the query so you don't have to call GetPlayerRank and definitely using sscanf is much better than GetPlayerId.

Something last, variables are used to store temporary (as long as the player is online) their data so don't worry about using them. It is still better than keep calling queries to get the player's clan.

The above altogether (also assuming that a clan have have max. of 30 members) and modify it to your needs:
PHP код:
// global:
new CachegPlayer_ClanMembers[MAX_PLAYERS];
// OnPlayerConnect:
gPlayer_ClanMembers[playerid] = Cache0;
// wherever you execute the query
new Query[50];
mysql_format(g_SQLQuerysizeof Query"SELECT Name,Rank FROM Users WHERE Clan = %d"GetPlayerClan(playeridg_SQL)); // better a variable that stores player's clan
mysql_tquery(g_SQLQuery"OnClanMembersLoad""i"playerid);
// the specified callback 
forward OnClanMembersLoad(playerid);
public 
OnClanMembersLoad(playerid)
{
    new 
rows cache_get_row_count();
    if (!
rows) return ... // error that there are no members
    
else if (rows 15)
    {
        
gPlayer_ClanMembers[playerid] = cache_save();
        
rows 15;
        
// load the first 15 results and store the rest in memory
    
}
    new 
name[25], rank[25], s[48], targetid;
    
members[0] = EOS// reset
    
for (new i!= rowsi++)
    {
        
cache_get_row(i0name);
        
cache_get_row(i1rank);
        
sscanf(name"r"targetid);
        
format(ssizeof s"%s\t%s\t%s\n"nameranktargetid != INVALID_PLAYER_ID ? ("{00FF2F}Online") : ("{FF0000}Offline"));
        
strcat(memberss);
    }
}
ShowPlayerDialog(playerid13DIALOG_STYLE_TABLIST"Clan Members"membersrows 15 ? ("Next") : ("Close"), "Cancel");
// OnDialogResponse (dialogid 13):
if (!response)
{
    
cache_delete(gPlayer_ClanMembers[playerid]);
    
gPlayer_ClanMembers[playerid] = Cache0;
}
else
{
    if (
cache_is_valid(gPlayer_ClanMembers[playerid]))
    {
        
cache_set_active(gPlayer_ClanMembers[playerid]);
        new 
rows cache_get_row_count(), name[25], rank[25], s[48], targetid;
        
members[0] = EOS// reset
        
for (new 14!= rowsi++) // 15 first (rowid 0-14) have been loaded and we want the rest
        
{
            
cache_get_row(i0name);
            
cache_get_row(i1rank);
            
sscanf(name"r"targetid);
            
format(ssizeof s"%s\t%s\t%s\n"nameranktargetid != INVALID_PLAYER_ID ? ("{00FF2F}Online") : ("{FF0000}Offline"));
            
strcat(memberss);
        }
        
ShowPlayerDialog(playerid13DIALOG_STYLE_TABLIST"Clan Members"members"Close""Cancel");
        
cache_set_active(Cache0);
        
cache_delete(gPlayer_ClanMembers[playerid]);
        
gPlayer_ClanMembers[playerid] = Cache0;
    }

Reply


Messages In This Thread
MySQL SELECT Not getting last row - by Shinja - 31.07.2016, 16:30
Re: MySQL SELECT Not getting last row - by Konstantinos - 31.07.2016, 17:17
Re: MySQL SELECT Not getting last row - by Shinja - 31.07.2016, 19:57
Re: MySQL SELECT Not getting last row - by Konstantinos - 31.07.2016, 20:12
Re: MySQL SELECT Not getting last row - by Shinja - 31.07.2016, 20:20
Re: MySQL SELECT Not getting last row - by Konstantinos - 31.07.2016, 20:51

Forum Jump:


Users browsing this thread: 1 Guest(s)