02/10/2016, 05:05 PM
(02/10/2016, 04:32 PM)Darkay escribió: mira tira este error en consola
Código PHP:L 10/02/2016 - 15:31:12: [MySQL] Invalid column: 3
L 10/02/2016 - 15:31:12: [AMXX] Displaying debug trace (plugin "surf_lvl.amxx")
L 10/02/2016 - 15:31:12: [AMXX] Run time error 10: native error (native "SQL_ReadResult")
L 10/02/2016 - 15:31:12: [AMXX] [0] surf_lvl.sma::DataHandler (line 287)
el code
Código PHP:#include < amxmodx >
#include < sqlx >
#define PLUGIN "Sistema de cuentas MySQL/SQLite"
#define VERSION "1.1.2"
#define AUTHOR "r0ma"
#define MYSQL
#if defined MYSQL
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DATEBASE "servercs"
#else
#define SQLITE_DATEBASE "cuentas"
#endif
new const szTable[ ] = "cuentas";
new const szPrefix[ ] = "[Cuentas]";
new Handle:g_hTuple;
new g_maxplayers;
new g_estado;
new g_id[ 33 ];
new g_Nivel[33];
new g_usuario[ 33 ][ 34 ];
new g_password[ 33 ][ 34 ];
new g_playername[ 33 ][ 33 ];
enum
{
REGISTRAR_CUENTA,
LOGUEAR_CUENTA,
CARGAR_DATOS,
GUARDAR_DATOS
};
/* consulta MYSQL:
CREATE TABLE cuentas
(
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
Usuario varchar(34) NOT NULL UNIQUE KEY,
Password varchar(34) NOT NULL,
Pj varchar(32) NOT NULL UNIQUE KEY,
)
*/
/* consulta SQLite:
CREATE TABLE "cuentas"
(
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"Usuario" VARCHAR NOT NULL UNIQUE,
"Password" VARCHAR NOT NULL,
"Pj" VARCHAR NOT NULL UNIQUE,
"Experiencia" INTEGER DEFAULT 0
)
*/
public plugin_init( ) {
register_plugin( PLUGIN, VERSION, AUTHOR );
register_clcmd( "say /nivel", "cmdnivel");
register_clcmd( "say /howard", "cmdhoward");
register_clcmd( "CREAR_USUARIO", "reg_usuario" );
register_clcmd( "CREAR_PASSWORD", "reg_password" );
register_clcmd( "LOGUEAR_USUARIO", "log_usuario" );
register_clcmd( "LOGUEAR_PASSWORD", "log_password" );
register_clcmd( "chooseteam", "clcmd_changeteam" );
register_clcmd( "jointeam", "clcmd_changeteam" );
register_message( get_user_msgid( "ShowMenu" ), "message_ShowMenu" );
register_message( get_user_msgid( "VGUIMenu" ), "message_VGUIMenu" );
register_event( "HLTV", "event_round_start", "a", "1=0", "2=0" );
g_maxplayers = get_maxplayers( );
MySQLx_Init( );
}
public cmdhoward(id)
{
client_print(id,print_chat,"Eres nivel %d", g_Nivel[ id ]);
}
public cmdnivel(id)
{
g_Nivel[id] = 100
client_print(id,print_chat,"Has recibido 100 niveles");
}
public message_VGUIMenu( iMsgid, iDest, id ) {
if( g_estado & (1<<id) || get_msg_arg_int( 1 ) != 2 )
return PLUGIN_CONTINUE;
show_login_menu( id );
return PLUGIN_HANDLED;
}
public message_ShowMenu( iMsgid, iDest, id ) {
if( g_estado & (1<<id) )
return PLUGIN_CONTINUE;
static sMenuCode[ 33 ];
get_msg_arg_string( 4, sMenuCode, charsmax( sMenuCode ) );
if( containi( sMenuCode, "Team_Select" ) != -1 ) {
show_login_menu( id );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public clcmd_changeteam( id ) {
if( ~g_estado & (1<<id) ) {
show_login_menu( id );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public show_login_menu( id ) {
new menu = menu_create( "\r[TNW] \wBienvenido a nuestro servidor!", "login_menu" );
menu_additem( menu, "\wCrear Cuenta" );
menu_additem( menu, "\wIngresar" );
menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu );
return PLUGIN_HANDLED;
}
public login_menu( id, menu, item ) {
switch( item ) {
case 0: client_cmd( id, "messagemode CREAR_USUARIO" );
case 1: client_cmd( id, "messagemode LOGUEAR_USUARIO" );
}
return PLUGIN_HANDLED;
}
public reg_usuario( id ) {
read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
remove_quotes( g_usuario[ id ] );
trim( g_usuario[ id ] );
md5( g_usuario[ id ], g_usuario[ id ] );
client_cmd( id, "messagemode CREAR_PASSWORD" );
return PLUGIN_HANDLED;
}
public reg_password( id ) {
read_args( g_password[ id ], charsmax( g_password[ ] ) );
remove_quotes( g_password[ id ] );
trim( g_password[ id ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = REGISTRAR_CUENTA;
get_user_name( id, g_playername[ id ], charsmax( g_playername[ ] ) );
formatex( szQuery, charsmax( szQuery ), "INSERT INTO %s (Usuario, Password, Pj) VALUES (^"%s^", ^"%s^", ^"%s^")", szTable, g_usuario[ id ], g_password[ id ], g_playername[ id ] );
SQL_ThreadQuery(g_hTuple, "DataHandler", szQuery, iData, 2);
return PLUGIN_HANDLED;
}
public log_usuario( id ) {
read_args( g_usuario[ id ], charsmax( g_usuario[ ] ) );
remove_quotes( g_usuario[ id ] );
trim( g_usuario[ id ] );
md5( g_usuario[ id ], g_usuario[ id ] );
client_cmd( id, "messagemode LOGUEAR_PASSWORD" );
return PLUGIN_HANDLED;
}
public log_password( id ) {
read_args( g_password[ id ], charsmax( g_password[ ] ) );
remove_quotes( g_password[ id ] );
trim( g_password[ id ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGUEAR_CUENTA;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^" AND Password=^"%s^"", szTable, g_usuario[ id ], g_password[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
formatex( szQuery, charsmax( szQuery ), "SELECT Nivel FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
public guardar_datos( id ) {
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = GUARDAR_DATOS;
formatex( szQuery, charsmax( szQuery ), "UPDATE %s SET Nivel='%d' WHERE id='%d'", szTable, g_Nivel[ id ], g_id[id] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}
public DataHandler( failstate, Handle:Query, error[ ], error2, data[ ], datasize, Float:time ) {
static id;
id = data[ 0 ];
if( !is_user_connected( id ) )
return;
switch( failstate ) {
case TQUERY_CONNECT_FAILED: {
log_to_file( "SQL_LOG_TQ.txt", "Error en la conexion al MySQL [%i]: %s", error2, error );
return;
}
case TQUERY_QUERY_FAILED:
log_to_file( "SQL_LOG_TQ.txt", "Error en la consulta al MySQL [%i]: %s", error2, error );
}
switch( data[ 1 ] ) {
case REGISTRAR_CUENTA: {
if( failstate < TQUERY_SUCCESS ) {
if( containi( error, "Usuario" ) != -1 )
client_print( id, print_chat, "%s El usuario ya existe.", szPrefix );
else if( containi( error, "Pj" ) != -1 )
client_print( id, print_chat, "%s El nombre de personaje esta en uso.", szPrefix );
else
client_print( id, print_chat, "%s Error al crear la cuenta. Intente nuevamente.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
else
{
client_print( id, print_chat, "%s Tu cuenta ha sido creada correctamente.", szPrefix );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = CARGAR_DATOS;
formatex( szQuery, charsmax( szQuery ), "SELECT id FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}
}
case LOGUEAR_CUENTA: {
if( SQL_NumResults( Query ) ) {
g_id[ id ] = SQL_ReadResult( Query, 0 );
SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );
// Cargamos datos
func_login_success( id );
}
else {
client_print( id, print_chat, "%s Usuario o Pasword incorrecta.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case CARGAR_DATOS: {
if( SQL_NumResults( Query ) ) {
g_id[ id ] = SQL_ReadResult( Query, 0 );
// Ponemos la exp en 0 para el nuevo usuario.
func_login_success( id );
}
else {
client_print( id, print_chat, "%s Error al cargar los datos, intente nuevamente.", szPrefix );
show_login_menu( id );
}
}
case GUARDAR_DATOS: {
if( failstate < TQUERY_SUCCESS )
console_print( id, "%s Error en el guardado de datos.", szPrefix );
else
console_print( id, "%s Datos guardados.", szPrefix );
}
}
}
public func_login_success( id ) {
engclient_cmd( id, "jointeam", "5" );
engclient_cmd( id, "joinclass", "5" );
g_estado |= (1<<id);
set_user_info( id, "name", g_playername[ id ] );
}
public event_round_start( ) {
for( new i = 1; i <= g_maxplayers; i++ ) {
if( g_estado & (1<<i) && is_user_connected( i ) )
guardar_datos( i );
}
}
public client_infochanged( id ) {
if( ~g_estado & (1<<id) )
return PLUGIN_CONTINUE;
static name[ 33 ];
get_user_info( id, "name", name, charsmax( name ) );
if( !equal( g_playername[ id ], name ) ) {
set_user_info( id, "name", g_playername[ id ] );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public client_disconnect( id ) {
if( g_estado & (1<<id) ) {
guardar_datos( id );
g_estado &= ~(1<<id);
}
g_usuario[ id ][ 0 ] = '^0';
g_password[ id ][ 0 ] = '^0';
}
#if defined MYSQL
public MySQLx_Init( )
{
g_hTuple = SQL_MakeDbTuple( MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATEBASE );
if( !g_hTuple )
{
log_to_file( "SQL_ERROR.txt", "No se pudo conectar con la base de datos." );
return pause( "a" );
}
return PLUGIN_CONTINUE;
}
#else
// Gracias ILUSION por fixear la conexión
public MySQLx_Init( )
{
new get_type[ 12 ];
SQL_SetAffinity( "sqlite" );
SQL_GetAffinity( get_type, sizeof get_type );
if( !equali( get_type, "sqlite" ) )
{
log_to_file( "SQLITE_ERROR.txt", "Error de conexion" );
return pause( "a" );
}
g_hTuple = SQL_MakeDbTuple( "", "", "", SQLITE_DATEBASE );
return PLUGIN_CONTINUE
}
#endif
public plugin_end( )
SQL_FreeHandle( g_hTuple );
Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando, pero nisiquiera te estas dando cuenta de que haces.
Primero tabula un poco, me revente un ojo intentando verlo bien
Segundo, es redundante lo que haces con las consultas
Código PHP:
public log_password( id )
{
read_args( g_password[ id ], charsmax( g_password[ ] ) );
remove_quotes( g_password[ id ] );
trim( g_password[ id ] );
md5( g_password[ id ], g_password[ id ] );
new szQuery[ 256 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = LOGUEAR_CUENTA;
formatex( szQuery, charsmax( szQuery ), "SELECT * FROM %s WHERE Usuario=^"%s^" AND Password=^"%s^"", szTable, g_usuario[ id ], g_password[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
formatex( szQuery, charsmax( szQuery ), "SELECT Nivel FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
return PLUGIN_HANDLED;
}
La segunda consulta que haces ahi, no tiene sentido alguno, ya que en la anterior estas obteniendo todos los datos. Ya que veo no captaste, usando SELECT * estas obteniendo todas las columnas posibles (LA COLUMNA ES id, nombre, password PARA QUE CAPTES), para no tener que enumerarlas todas en la misma consulta. Si explicitamente estas obteniendo los datos de la misma tabla, ¿por que no la sacas de ahi mismo? Para evitar ambiguedades, mejor postea la estructura de tu base de datos ya que en la que esta escrita en el plugin no esta explicita la columna Nivel, supongo esta puesta tambien.
Y para profundizar mas aun, esta clarisimo el error, ya que en la segunda consulta, solo estas pidiendo el dato Nivel, pero fijate (repito, FIJATE) en iData ya que tiene de valores LOGUEAR_CUENTA que aparece en la funcion del handler
Código PHP:
public DataHandler( failstate, Handle:Query, error[ ], error2, data[ ], datasize, Float:time )
{
static id;
id = data[ 0 ];
if( !is_user_connected( id ) )
return;
switch( failstate )
{
case TQUERY_CONNECT_FAILED:
{
log_to_file( "SQL_LOG_TQ.txt", "Error en la conexion al MySQL [%i]: %s", error2, error );
return;
}
case TQUERY_QUERY_FAILED:
log_to_file( "SQL_LOG_TQ.txt", "Error en la consulta al MySQL [%i]: %s", error2, error );
}
switch( data[ 1 ] )
{
case REGISTRAR_CUENTA:
{
if( failstate < TQUERY_SUCCESS )
{
if( containi( error, "Usuario" ) != -1 )
client_print( id, print_chat, "%s El usuario ya existe.", szPrefix );
else if( containi( error, "Pj" ) != -1 )
client_print( id, print_chat, "%s El nombre de personaje esta en uso.", szPrefix );
else
client_print( id, print_chat, "%s Error al crear la cuenta. Intente nuevamente.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
else
{
client_print( id, print_chat, "%s Tu cuenta ha sido creada correctamente.", szPrefix );
new szQuery[ 128 ], iData[ 2 ];
iData[ 0 ] = id;
iData[ 1 ] = CARGAR_DATOS;
formatex( szQuery, charsmax( szQuery ), "SELECT id FROM %s WHERE Usuario=^"%s^"", szTable, g_usuario[ id ] );
SQL_ThreadQuery( g_hTuple, "DataHandler", szQuery, iData, 2 );
}
}
case LOGUEAR_CUENTA:
{
if( SQL_NumResults( Query ) )
{
g_id[ id ] = SQL_ReadResult( Query, 0 );
SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );
// Cargamos datos
func_login_success( id );
}
else
{
client_print( id, print_chat, "%s Usuario o Pasword incorrecta.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
case CARGAR_DATOS:
{
if( SQL_NumResults( Query ) )
{
g_id[ id ] = SQL_ReadResult( Query, 0 );
// Ponemos la exp en 0 para el nuevo usuario.
func_login_success( id );
}
else
{
client_print( id, print_chat, "%s Error al cargar los datos, intente nuevamente.", szPrefix );
show_login_menu( id );
}
}
case GUARDAR_DATOS:
{
if( failstate < TQUERY_SUCCESS )
console_print( id, "%s Error en el guardado de datos.", szPrefix );
else
console_print( id, "%s Datos guardados.", szPrefix );
}
}
}
Te lo hare mas simple
Código PHP:
case LOGUEAR_CUENTA:
{
if( SQL_NumResults( Query ) )
{
g_id[ id ] = SQL_ReadResult( Query, 0 );
SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );
// Cargamos datos
func_login_success( id );
}
else
{
client_print( id, print_chat, "%s Usuario o Pasword incorrecta.", szPrefix );
client_cmd( id, "spk buttons/button10.wav" );
show_login_menu( id );
}
}
Mas simple todavia
Código PHP:
SQL_ReadResult( Query, 3, g_playername[ id ], charsmax( g_playername[ ] ) );
Mas aun
Cita:3
No hay ningun "RESULTADO NUMERO 3" ya que la consulta solo pidio 1 dato, y ese dato es Nivel. Es el resultado numero 0 para que lo entiendas de mejor forma. Y siendo aun asi, esto podría estar mucho mejor estructurado, llevando esto al caso de CARGAR_DATOS, o como sea que quieras hacerlo.
Strings en goldsrc (STRING, ALLOC_STRING, MAKE_STRING) - GoldSrc: gamedll, hlsdk, etc - Obteniendo nombres de texturas de mapas - FindEntityByString y derivados - Detectar Ataques de Knife - El Parametro fNoMonsters de los Traces - Funcion: AddToFullPack - Compresión de digitos - Native: register_event
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄