SA-MP Forums Archive
[Ayuda] top players mysql R33 - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+---- Thread: [Ayuda] top players mysql R33 (/showthread.php?tid=583385)



[Ayuda] top players mysql R33 - mcreed - 28.07.2015

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.


Respuesta: [Ayuda] top players mysql R33 - TheMatius - 28.07.2015

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");
}



Respuesta: [Ayuda] top players mysql R33 - DesingMyCry - 28.07.2015

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


Respuesta: [Ayuda] top players mysql R33 - ForTrezZ - 28.07.2015

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


Respuesta: [Ayuda] top players mysql R33 - DesingMyCry - 28.07.2015

La condiciуn esta mal, dije hace rato.


Respuesta: [Ayuda] top players mysql R33 - TheMatius - 28.07.2015

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


Respuesta: [Ayuda] top players mysql R33 - DesingMyCry - 28.07.2015

Exacto. No habнa visto tu respuesta.


Respuesta: [Ayuda] top players mysql R33 - mcreed - 28.07.2015

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;
}



Respuesta: [Ayuda] top players mysql R33 - TheMatius - 28.07.2015

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



Respuesta: [Ayuda] top players mysql R33 - mcreed - 28.07.2015

ya anda, gracias !!!