[Ayuda] top players mysql R33
#1

Bueno, queria saber si me podian ayudar con un codigo, realmente nose mucho sobre mysql.
para empezar si busque ya en el foro, bueno por lo menos eso creo, encontre 3 temas sobre lo mismo, pero la version de mysql era otro a la que yo uso, la cual es la R33

lo que quiero eske en un dialogo aparescan los 10 top players, basados en la cantidad de kills ( score ), obviamente todo esto por mysql.

intente realizarlo pero no tube ningun exito, nisiquiera me habria el dialogo

Codigo:
Код:
COMMAND:topplayers(playerid,params[])
{
	new topstring[700];
	new query[720];
	new idx,PlayerName[24],Score;
	mysql_format(mysql, query, sizeof(query), "SELECT Kills, Name FROM "MYSQL_TABLA" ORDER BY Kills DESC LIMIT 10");
 	mysql_tquery(mysql, query, "", "");
 	while(cache_num_rows())
 	{
 	    idx++;
 	    cache_get_field_content(0, "Name",PlayerName);
		Score = cache_get_field_content_int(0, "Kills");
		format(topstring,sizeof(topstring),"#\tNombre\tScore\tExperiencia\n\%d\t%s\t%d",idx,PlayerName,Score);
 	}
	ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_TABLIST_HEADERS, "Top Players", topstring, "Salir", "");
	return 1;
}
yose que mi codigo es malicismo, pero bueno la cuestion eske intento aprender
PD: en el mysql, no parece ver algun error.
Reply
#2

Tengo una duda, tampoco se mucho de mysql, y es algo enredado, pero ese bucle que hiciste cuando termina?, dices que no te abre el dialogo, no estarбs creando un bucle infinito?, o no te estarб entrando al bucle?, reitero, no se mucho de mysql.

EDIT:
Haciendo pruebas a tu cуdigo me encontrй con esto:

Recuerda que si usas MySql es asi en el format: SELECT `Kills`, `Nombre` FROM `topscore` ORDER BY `Kills` DESC LIMIT 10

Pero segъn tu format lo necesitas asн:
Код:
"SELECT `Kills`, `Nombre`, `Experiencia` FROM `topscore` ORDER BY `Kills` DESC LIMIT 10"
Correciуn a tu code:
Код:
format(topstring,sizeof(topstring),"#\tNombre\tScore\tExperiencia\n\%d\t%s\t%d",idx,PlayerName,Score);
Haces el formato y ahora tienes que mostrarlo al fuera del loop :
Код:
ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_TABLIST_HEADERS, "Top Players", topstring, "Salir", "");
Код:
new topstring[700]; //En este caso si es necesario por que vamos a concatenar,  pero el problema es que esto nunca se concatena con el format.
new query[720]; //Cuando se guarda informaciуn del usuario (OnPlayerDisconnect)
No hagas cadenas tan grandes en el query es necesario pero para el format no:
Код:
new topstring[128], query[256];
Concatenando:

Код:
new topstring[128], outtopstring[700]= "#\tNombre\tScore\tExperiencia";
while(idx < cache_num_rows())
 {
    format(topstring, sizeof(topstring), "\n\%d\t%s\t%d\t%d",idx, PlayerName, Score, Exp);
    strcat(outtopstring, topstring);
}
ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_TABLIST_HEADERS, "Top Players", outtopstring, "Salir", "");
Код:
while(cache_num_rows())
Como dije antes, es infito o nunca entra al ciclo, їpor que? Si no haces bien la llamada del query a la base de datos no funcionara:
Код:
SELECT `Kills`, `Nombre`, `Experiencia` FROM `topscore` ORDER BY `Kills` DESC LIMIT 10 //Esto lo puedes testear en el mismo MySql
Uso correcto:
Код:
while(idx < cache_num_rows()) //Llevas un numero que gesitona la cantidad de usuarios que se debe de mostrar antes del final
PD: No te organizare el cуdigo, dejare que lo hagas tu, aquн tenes con lo que yo testeo el cуdigo:

їQue te recomiendo?
Hacer pruebas en un new.pwn donde ejecutes tu cуdigo en el main: Asн hice las pruebas:

Код:
main()
{
	new query[256], idx , PlayerName[MAX_PLAYER_NAME], Score, Exp;
	mysql_format(MYSQL, query, sizeof(query), "SELECT `Kills`, `Nombre`, `Experiencia` FROM `topscore` ORDER BY `Kills` DESC LIMIT 10");
 	mysql_query(MYSQL, query);
	printf("Num rows: %d", cache_num_rows());
 	while(idx < cache_num_rows())
 	{
 	    cache_get_field_content(idx, "Nombre", PlayerName);
		Score = cache_get_field_content_int(idx, "Kills");
		Exp = cache_get_field_content_int(idx, "Experiencia");
		idx++;
		printf("#\tNombre\tScore\tExperiencia\n\%d\t%s\t%d\t%d", idx, PlayerName, Score, Exp);
		printf("Estoy en en bucle numero: %d, Num rows: %d", idx, cache_num_rows());
 	}
	print("Salн del ciclo");
}
Reply
#3

La condiciуn del "while" esta mal. Teуricamente, como dice el amigo de arriba... es un bucle infinito.
Reply
#4

PHP код:
COMMAND:topplayers(playerid,params[])
{
    new 
topstring[700];
    new 
query[720];
    new 
idx,PlayerName[24],Score;
    
mysql_format(mysqlquerysizeof(query), "SELECT * FROM "MYSQL_TABLA" WHERE kills ORDER BY kills DESC LIMIT 10");
     
mysql_tquery(mysqlquery"""");
     while(
cache_num_rows())
     {
         
idx++;
         
cache_get_field_content(0"Name",PlayerName);
        
Score cache_get_field_content_int(0"Kills");
        
format(topstring,sizeof(topstring),"#\tNombre\tScore\tExperiencia\n\%d\t%s\t%d",idx,PlayerName,Score);
     }
    
ShowPlayerDialog(playerid1234DIALOG_STYLE_TABLIST_HEADERS"Top Players"topstring"Salir""");
    return 
1;

te facilite un poco mas la consulta, despues el codigo te ayudaria pero tengo el problema que no se usar ese mysql ! yo uso otro que tiene menos funciones y es bastante completo :S

---------------- EDIT ----------------
PHP код:
COMMAND:topplayers(playerid,params[])
{
    new 
topstring[700] = "#\tNombre\tScore\tExperiencia";
    new 
query[720];
    new 
idx,PlayerName[24],Score;
    
mysql_format(mysqlquerysizeof(query), "SELECT * FROM "MYSQL_TABLA" WHERE kills ORDER BY kills DESC LIMIT 10");
     
mysql_tquery(mysqlquery"""");
     while(
cache_num_rows())
     {
         
idx++;
         
cache_get_field_content(idx"Name",PlayerName);
        
Score cache_get_field_content_int(idx"Kills");
        
strcat(topstring"\n\%d\t%s\t%d",idx,PlayerName,Score);
     }
    
ShowPlayerDialog(playerid1234DIALOG_STYLE_TABLIST_HEADERS"Top Players"topstring"Salir""");
    return 
1;

Basandome en lo que entendi, creo que este codigo va a funcionar
Reply
#5

La condiciуn esta mal, dije hace rato.
Reply
#6

Ya lo hice yo, arriba y me funcionу, estб testeado y con la condiciуn correcta...
Reply
#7

Exacto. No habнa visto tu respuesta.
Reply
#8

Quote:
Originally Posted by TheMatius
Посмотреть сообщение
Ya lo hice yo, arriba y me funcionу, estб testeado y con la condiciуn correcta...
el main me funciono perfectamente, pero tengo el problema que cuando lo paso a dialog , solo muestra al jugador con mas score, no muestra los 10 primeros, tambien de que se tarda una eternidad en abrir, aproximadamente 3 segundos.

Код:
COMMAND:topplayers(playerid,params[])
{
	new query[256], idx , PlayerName[MAX_PLAYER_NAME], Score, Exp, tstring[290];
	mysql_format(mysql, query, sizeof(query), "SELECT `Kills`, `Name`, `Experiencia` FROM `accounts6` ORDER BY `Kills` DESC LIMIT 10");
 	mysql_query(mysql, query);
 	while(idx < cache_num_rows())
 	{
 	    cache_get_field_content(idx, "Name", PlayerName);
		Score = cache_get_field_content_int(idx, "Kills");
		Exp = cache_get_field_content_int(idx, "Experiencia");
		idx++;
		format(tstring,sizeof(tstring),"#\tNombre\tScore\tExperiencia\n\%d\t%s\t%d\t%d", idx, PlayerName, Score, Exp);
 	}
 	ShowPlayerDialog(playerid, 	TopPlayersDialog, DIALOG_STYLE_TABLIST_HEADERS, "Top Players", tstring, "Salir", "");
	return 1;
}
Reply
#9

Quote:

COMMAND:topplayers(playerid,params[])
{
new query[256], idx , PlayerName[MAX_PLAYER_NAME], Score, Exp, tstring[290];
mysql_format(mysql, query, sizeof(query), "SELECT `Kills`, `Name`, `Experiencia` FROM `accounts6` ORDER BY `Kills` DESC LIMIT 10");
mysql_query(mysql, query);
while(idx < cache_num_rows())
{
cache_get_field_content(idx, "Name", PlayerName);
Score = cache_get_field_content_int(idx, "Kills");
Exp = cache_get_field_content_int(idx, "Experiencia");
idx++;
format(tstring,sizeof(tstring),"#\tNombre\tScore\t Experiencia\n\%d\t%s\t%d\t%d", idx, PlayerName, Score, Exp);
}
ShowPlayerDialog(playerid, TopPlayersDialog, DIALOG_STYLE_TABLIST_HEADERS, "Top Players", tstring, "Salir", "");
return 1;
}

Claro bro!, si estas haciendo un format pero no estas concatenando(strcat) mira el cуdigo:
PHP код:
new query[256], idxPlayerName[MAX_PLAYER_NAME], ScoreExptstring[128], outstring[500];//No se cuantos caracteres son 10 top players
    
mysql_format(mysqlquerysizeof(query), "SELECT `Kills`, `Name`, `Experiencia` FROM `accounts6` ORDER BY `Kills` DESC LIMIT 10");
     
mysql_query(mysqlquery);
     while(
idx cache_num_rows())
     {
         
cache_get_field_content(idx"Name"PlayerName);
        
Score cache_get_field_content_int(idx"Kills");
        
Exp cache_get_field_content_int(idx"Experiencia");
        
idx++;
        
format(tstring,sizeof(tstring),"\n\%d\t%s\t%d\t%d"idxPlayerNameScoreExp);
        
strcat(outstringtstring);
     }
     
ShowPlayerDialog(playerid,     TopPlayersDialogDIALOG_STYLE_TABLIST_HEADERS"Top Players"outstring"Salir""");
    return 
1
Reply
#10

ya anda, gracias !!!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)