[TUT] Mysql, variables
#1
Hola, como les va ? Bueno, estuve un rato sin internet y me puse a hacer este "tutorial" we, de como cargar e insertar datos en una tabla. Tambien contiene un poco de informacion sobre variables, arrays, etc.

Lo hice mas que nada para que me corrijan en que cosas me confundi al explicar, y asi aprender mas :3

Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>

// Vamos a definir cuales son nuestros datos para conectarnos
new MYSQL_HOST[] = "localhost" // Host donde esta alojada la base de datos, en mi caso en localhost (Local = mipc)
new MYSQL_USER[] = "root" // Usuario de la base de datos
new MYSQL_PASS[] = "" // Contraseña (?)
new MYSQL_DB[] = "alliedmodders" // Esta va a ser la base de datos en donde se va a crear la tabla "mensajitos"
new MYSQL_TABLE[] = "mensajitos_mysql" // tabla en donde se van a guardar los datos

new gHud // Seria como el ID de la sincronizacion del hud. Si queremos mostrar 2 huds diferentes, con este identificador, solo se mostrara 1

new Handle:g_SqlTuple // mysql connection, el identificador de la conexion

/*Variable global booleana
Es decir, que esta variable va a tener los siguientes valores
g_type = 0 o g_type = 1
g_type = false o g_type = true

Esta variable global la vamos a usar para chequear si vamos a mandar un mensaje
via chat o hud

g_type = 0 | Mensajes en say
g_type = 1 | Mensajes en hud

ej:

    if(g_type)
        Verdadero = 1
    else
        Falso = 0

*/
new g_type

/*Esta variable global, va a setearle un efecto al hud*
Puede ser del 0 al 2 (si no me equivoco, no me acuerdo)
0 = normal
1 = Parpadeo / titileo
2 = Aparecen las letras de izquierda a derecha, letra por letra
*/
new g_effect

/*
String de 250 celdas que vamos a usar para guardar nuestro mensaje
*/
new g_msj[250]

/*Variable global con un array

g_hud_pos[x] = X equilave al numero de grupos del array

En nuestro caso, tenemos 2 grupos
new Float:g_hud_pos[2];

Ahora vamos a asignarle un numero de grupo a cada varariable
g_hud_pos[0] = posicion X del hud, en numero flotante/float (Ej 0.4) - (Para mover el hud, izquierda-derecha)
g_hud_pos[1] = Posicion Y del hud, en numero flotante/float (Ej 0.8) - (Para mover el hud, arriba-abajo)

Como vieron, empieza desde el 0 para adelante
Siempre es el numero de variables que queremos usar, +1

Como usar:
new g_array[5]

g_array[0]
g_array[1]
g_array[2]
g_array[3]
g_array[4]


Como no usar:
new g_array[5] // Yo aca por ejemplo, tengo 4 grupos, +1

g_array[0]
g_array[1]
g_array[2]
g_array[3]
g_array[4]
g_array[5] // Limite excedido
Error: Array index out of bounds (variable "g_array")
*/
new Float:g_hud_pos[2];

/*
Variable global flotante, la vamos a usar
para definir cuanto tiempo va a estar el hud en pantall
*/
new Float:g_hud_time

/*
Variable global flotante, la vamos a usar para definir
cada cuanto tiempo le va a salir el mensaje al jugador
*/
new Float:g_nextmsj;

/*
Lo explique un poco mas arriba

g_color[0] = red
g_color[1] = green
g_color[2] = blue

Para darle colorcito al hud :$

*/
new g_color[3]

new 
buffer[550// String de 550 celdas, lo vamos a usar para cargar nuestro mensaje, y mostrarlo en el hud/chat

/*
No se como explicarlo muy bien
Seria el identificador del set_task

set_task(g_nextmsj, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")

set_task(Segundos para llamar a la funcion, "funcion_a_llamar", id-player+IDENTIFICADOR-DEL-TASK, const parameter[]="", len = 0, "flag")

*/
const TASK_SHOWHUD 9325// El numero no es siempre el mismo
#define ID_SHOWHUD ( taskid - TASK_SHOWHUD )

public plugin_init() {
    
    
register_plugin"Mensajes SQL""2.0""SpaM" // Ea (? Registramos el plugin e.e
    
     /*
     Registramos este evento para que, al empezar la ronda, haga una conexion con la base de datos,
     y cargar los datos que hay insertados en la tabla, para actualizar los datos del hud.
     */
    
register_event("HLTV""event_round_start""a""1=0""2=0")

     
/*El CreateHudSyncObj() se usa para crear el hud/sincronizarlo, y luego mostrarlo con ShowSyncHudMsg
     Ejemplo
     ShowSyncHudMsg(id, gHud, "Dewe is gay")
     
     */
    
gHud CreateHudSyncObj()
    
    
MYSQL_Init() // Conectamos a la base de datos
}

public 
event_round_start()
{
    
MYSQL_Init() // Empieza la ronda, cargamos/actualizamos datos. Si la base de datos esta creada, pero no la tabla, la misma se crea sola.
}

public 
MYSQL_Init()
{
    new 
g_Error[512], g_query[843], g_motd[1524], lenlen // Celdas - longitudes
    
    /* Conectamos a la base de datos
    
    SQL_MakeDbTuple("IP", "Usuario", "Contraseña", "Base de datos" )
    */
    
g_SqlTuple SQL_MakeDbTuple(MYSQL_HOSTMYSQL_USERMYSQL_PASSMYSQL_DB )
    
    
// Chequeamos si estamos conectados a la base de datos
    
if (!g_SqlTuple// En este caso, si g_SqlTuple, devuelve false (falso)
    
{
        
// Mandamos un logs para avisar de que fracaso la conexion
        
log_to_file("MYSQL_ERROR.txt""No se pudo conectar con la base de datos.")
        
        
// Pausamos el plugin
        
return pause("a");
    }
    
    new 
ErrorCodeHandle:SqlConnection SQL_Connect(g_SqlTupleErrorCodeg_Errorcharsmax(g_Error)) // Estamos conectados a la base de datos
    
    /*
    Si no existe la tabla, se la creamos, y le definimos los datos
    */
    
    /*
    Vamos a usar INT para guardar/cargar numeros
    INT:
    Un entero de 4 bytes; el rango con signo es de
    2147483648 a 2147483647
    El rango sin signo es de
    0 a 4294967295
    
    Vamos a usar VARCHAR para guardar/cargar 
    letras/numeros:
    VARCHAR:
    Cadena de longitud variable (0-65, 535), la longitud
    maxima esta asociada al tamaño maximo de un registro
    
    Vamos a usar FLOAT para guardar numeros flotantes (floats)
    FLOAT:
    Un número de coma flotante pequeño, los valores posibles
    son de -3.402823466E+38 a -1.175494351E-38
    y de 1.175494351E-38 a 3.402823466R+28
    
    */
    
    
len += formatex(g_motd[len], charsmax(g_motd) - len"CREATE TABLE IF NOT EXISTS `%s`("MYSQL_TABLE)
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Type` int(1) NOT NULL DEFAULT '1', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Msj` varchar(150) NOT NULL, ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Pos X` float NOT NULL DEFAULT '0.4', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Pos Y` float NOT NULL DEFAULT '0.8', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Tit` int(1) NOT NULL DEFAULT '1', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Time` float NOT NULL DEFAULT '15.0', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Red` int(3) NOT NULL DEFAULT '0', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Green` int(3) NOT NULL DEFAULT '240', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Blue` int(3) NOT NULL DEFAULT '100', ")
    
len += formatex(g_motd[len], charsmax(g_motd) - len"`Nextspam` float NOT NULL DEFAULT '15.0')")
    
    
/*
    Vamos a ejecutar la query/consulta para crear las tablas
    */
    
SQL_ThreadQuery(g_SqlTuple"QueryCreateTable"g_motd)
    
    
// Si estamos conectados a la base de datos
    
if (SqlConnection != Empty_Handle)
    {
        
/*Preparamos la consulta, y seleccionamos los datos a cargar
        SELECT * FROM, se usa para seleccionar TODOS los datos que esten guardados en la tabla seleccionada
        */
        
        
new Handle:query SQL_PrepareQuery(SqlConnection"SELECT * FROM `%s`"MYSQL_TABLE)
        
         
/* Ejecutamos la consulta 
         Y cargamos datos
         */
        
SQL_Execute(query)
        
        if (
SQL_NumResults(query))
        {
            
/*
            Una vez la consulta/query ejecutada y en proceso
            Seleccionamos los datos (Casi siempre empieza desde el 0 en adelante)
            y le asignamos el valor obtenido de la columna, a la variable
            */
            
            
g_type SQL_ReadResult(query0// Leemos y cargamos la columna n0 (Type), y le seteamos el valor a g_type
            
SQL_ReadResult(query1buffercharsmax(buffer)) // Leemos y cargamos la columna n1 (Msj), y le seteamos el valor/string a buffer (aca guardaremos nuestro mensaje)
            
             /*Cuando creamos el array, pusimos para que sea un array flotante.
             En este caso, para leer los valores (flotantes) de las columnas "Pos X" y "Pos Y"
             tenemos que poner que el array es flotante, y hacerlo de esta forma
             */
            
SQL_ReadResult(query2Float:g_hud_pos[0])// Leemos y cargamos la columna n2 (Pos X), y le seteamos el valor a g_hud_pos[0]
            
SQL_ReadResult(query3Float:g_hud_pos[1])// Leemos y cargamos la columna n3 (Pos Y), y le seteamos el valor a g_hud_pos[1]
            
            
g_effect SQL_ReadResult(query4// Leemos y cargamos la columna n4 (Tit), y le seteamos el valor a g_effect
            
SQL_ReadResult(query5Float:g_hud_time// Leemos y cargamos la columna n5 (Time), y le seteamos el valor flotante a g_hud_time
            
g_color[0] = SQL_ReadResult(query6// Leemos y cargamos la columna n6 (Red), y le seteamos el valor a g_color[0]
            
g_color[1] = SQL_ReadResult(query7// Leemos y cargamos la columna n7 (Green), y le seteamos el valor a g_color[1]
            
g_color[2] = SQL_ReadResult(query8// Leemos y cargamos la columna n8 (Blue), y le seteamos el valor a g_color[2]
            
SQL_ReadResult(query9Float:g_nextmsj// Leemos y cargamos la columna n9 (Nextspam), y le seteamos el valor a g_nextmsj
            
            
copy(g_msjcharsmax(g_msj[]), buffer// El mensaje cargado en buffer, va a ser copiado en g_msj (?
        
}
        else
        {
            
// Si no hay datos en la tabla, se los insertamos
            
formatex(g_query,charsmax(g_query), "INSERT INTO `%s` (`Type`, `Msj`, `Pos X`, `Pos Y`, `Tit`, `Time`, `Red`, `Green`, `Blue`, `Nextspam`) VALUES ('1', 'Open fire gordon, open fire!', '0.4', '0.8', '1', '2.5', '200', '100', '100', '15.0')"MYSQL_TABLE)
            
SQL_ThreadQuery(g_SqlTuple"IgnoreHandle"g_query// Cerramos/liberamos la consulta
        
}
        
        
SQL_FreeHandle(query// Cerramos/liberamos la consulta
    
}    
    
SQL_FreeHandle(SqlConnection// Cerramos la conexion    

    
return PLUGIN_CONTINUE;
}

// Chequeamos la consulta
public QueryCreateTable(FailStateHandle:QueryError[], ErrorcodeData[], DataSize)
{
    
/*Si la query/consulta esta mal
    Mandamos un log
    */
    
switch (FailState) {
        case 
TQUERY_CONNECT_FAILEDlog_to_file("SQL_LOG_TQ.txt""Failed to connect to database [%i]: %s"ErrorcodeError)
        case 
TQUERY_QUERY_FAILEDlog_to_file("SQL_LOG_TQ.txt""Error on query for creating table [%i]: %s"ErrorcodeError)
    }
    
    return 
PLUGIN_HANDLED;
}

public 
IgnoreHandle(FailStateHandle:QueryError[], ErrcodeData[], DataSize)
{
    
SQL_FreeHandle(Query// Cerramos/liberamos la consulta
    
    
return PLUGIN_HANDLED;
}

/*client_putinserver se llama cuando el jugador esta entrando al servidor
Antes de que termine el cartelito  de "cargando"
*/
public client_putinserver(id)
{    
    
/* Ya lo explique mas arriba (? Al 
    Al jugador que se esta conectado, le seteamos el task, que es lo que va a llamar a la funcion
    "ShowHUD", dependiendo de cuanto tiempo este definida la variable g_nextmsk
    
    g_nextmsk, tambien es lo que va a definir cada cuanto tiempo le va a salir el mensaje al jugador
    */
    
set_task(g_nextmsj"ShowHUD"id+TASK_SHOWHUD__"b")
}

public 
client_disconnect(id)
{
    
// Cuando el jugador se desconecta, le removemos el task
    
remove_task(id+TASK_SHOWHUD)
}

public 
ShowHUD(taskid// taskid = identificador del task
{
    static 
id
    id 
ID_SHOWHUD// identificador del usuario
    
    
if(!g_type// False = 0
    
{
        
// Mensaje solo en el say
        
client_print(idprint_chat"%s"buffer)
    }
    else 
// True = 1
    
{    
        
// Le seteamos las propiedades que cargamos, al hud que vamos a mostrar
        
set_hudmessage(g_color[0], g_color[1], g_color[2], g_hud_pos[0], g_hud_pos[1], g_effect5.0g_hud_time1.01.0, -1)
        
//set_hudmessage(red=200, green=100, blue=0, Float:x=-1.0, Float:y=0.35, effects=0, Float:fxtime=6.0, Float:holdtime=12.0, Float:fadeintime=0.1, Float:fadeouttime=0.2,channel=4);
        
        
ShowSyncHudMsg(idgHud"%s"buffer// Le mostramos el hud con el mensaje al jugador
    
}
}

// Ni ganas de explicar este stock (?
stock color_chat(const id, const input[], any:...)
{
    new 
count 1players[32]
    static 
msg[191]
    
vformat(msg190input3)
    
    
replace_all(msg190"!g""^4"); // Green Color
    
replace_all(msg190"!y""^1"); // Default Color
    
replace_all(msg190"!team""^3"); // Team Color
    
replace_all(msg190"!team2""^0"); // Team2 Color
    
    
if (idplayers[0] = id; else get_players(playerscount"ch")
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i])
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
            }
        }
    }


Que hace este plugin ademas de ser un tutorial Lengua?

Lo que hace es, guardar en la base de datos, los datos de un hud a mostrar.
El mensaje se le va a mandar cada X tiempo a cada jugador
Podes conectar todos los servidores a la misma base de datos, y mandar el mismo mensaje a todos los servidores.
Responder
#2
Parece interesante.. en un rato lo leo entero good job!
Facebook para preguntas/pedidos: Fb.com/scripterfrosst
Responder
#3
- Me parece raro que cada vez que empieze la ronda llames de nuevo a MYSQL_Init(), deberias llamarlo solo una vez en plugin_init y hacer otro public explicando lo que tenes en MYSQL_Init() de SELECT e INSERT.
- Tambien te falto cerrrar la conexion SQL_FreeHandle(SqlConnection) al final de MYSQL_Init(). Te conviene tambien poner que tipo de db estas usando, en este caso es MYSQL por lo que SQL_SetAffinity("mysql").
- SQL_FreeHandle(query) // Cerramos/liberamos la conexion
->
SQL_FreeHandle(query) // Cerramos/liberamos la consulta

Por mi parte, en la opinion personal:
- siempre manda SQL_QueryAndIgnore para crear tablas.
- yo tuve problemas usando FLOAT por lo que uso DOUBLE.

Buena guia
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#4
(01/08/2014, 02:35 PM)Kane escribió: - Me parece raro que cada vez que empieze la ronda llames de nuevo a MYSQL_Init(), deberias llamarlo solo una vez en plugin_init y hacer otro public explicando lo que tenes en MYSQL_Init() de SELECT e INSERT.
- Tambien te falto cerrrar la conexion SQL_FreeHandle(SqlConnection) al final de MYSQL_Init(). Te conviene tambien poner que tipo de db estas usando, en este caso es MYSQL por lo que SQL_SetAffinity("mysql").
- SQL_FreeHandle(query) // Cerramos/liberamos la conexion
->
SQL_FreeHandle(query) // Cerramos/liberamos la consulta

Por mi parte, en la opinion personal:
- siempre manda SQL_QueryAndIgnore para crear tablas.
- yo tuve problemas usando FLOAT por lo que uso DOUBLE.

Buena guia

Llamo al MYSQL_Init() cuando empieza la ronda, para que al editar los datos del hud mientras el servidor este online, al empezar la ronda se actualize, y asi no tener que esperar a que cambie de mapa Lengua
Responder
#5
Código PHP:
// Termina la ronda, cargamos/actualizamos datos. Si la base de datos esta creada, pero no la tabla, la misma se crea sola. 

->

Código PHP:
// Empieza la ronda, cargamos/actualizamos datos. Si la base de datos esta creada, pero no la tabla, la misma se crea sola. 

Cuando cambias un variable, automáticamente se actualizara en el hud ya que es llamado cada "%f segundo%s", g_nextmsj, g_nextmsj > 1.0 ? "s" : ""

set_task(g_nextmsj, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")

Buen tutorial.

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#6
(01/08/2014, 02:39 PM)Ipolito escribió:
(01/08/2014, 02:35 PM)Kane escribió: - Me parece raro que cada vez que empieze la ronda llames de nuevo a MYSQL_Init(), deberias llamarlo solo una vez en plugin_init y hacer otro public explicando lo que tenes en MYSQL_Init() de SELECT e INSERT.
- Tambien te falto cerrrar la conexion SQL_FreeHandle(SqlConnection) al final de MYSQL_Init(). Te conviene tambien poner que tipo de db estas usando, en este caso es MYSQL por lo que SQL_SetAffinity("mysql").
- SQL_FreeHandle(query) // Cerramos/liberamos la conexion
->
SQL_FreeHandle(query) // Cerramos/liberamos la consulta

Por mi parte, en la opinion personal:
- siempre manda SQL_QueryAndIgnore para crear tablas.
- yo tuve problemas usando FLOAT por lo que uso DOUBLE.

Buena guia

Llamo al MYSQL_Init() cuando empieza la ronda, para que al editar los datos del hud mientras el servidor este online, al empezar la ronda se actualize, y asi no tener que esperar a que cambie de mapa Lengua
Pero para qué ?. Eso no entiendo. Siempre usé la función en plugin_init();
Y cuando cambia de mapa se usa plugin_end(); supongo. Y se actualiza cuando se guardan datos en la db.

Si me equivoco dime, es lo que pienso yo
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#7
(02/08/2014, 12:14 AM)CSAxel escribió:
(01/08/2014, 02:39 PM)Ipolito escribió:
(01/08/2014, 02:35 PM)Kane escribió: - Me parece raro que cada vez que empieze la ronda llames de nuevo a MYSQL_Init(), deberias llamarlo solo una vez en plugin_init y hacer otro public explicando lo que tenes en MYSQL_Init() de SELECT e INSERT.
- Tambien te falto cerrrar la conexion SQL_FreeHandle(SqlConnection) al final de MYSQL_Init(). Te conviene tambien poner que tipo de db estas usando, en este caso es MYSQL por lo que SQL_SetAffinity("mysql").
- SQL_FreeHandle(query) // Cerramos/liberamos la conexion
->
SQL_FreeHandle(query) // Cerramos/liberamos la consulta

Por mi parte, en la opinion personal:
- siempre manda SQL_QueryAndIgnore para crear tablas.
- yo tuve problemas usando FLOAT por lo que uso DOUBLE.

Buena guia

Llamo al MYSQL_Init() cuando empieza la ronda, para que al editar los datos del hud mientras el servidor este online, al empezar la ronda se actualize, y asi no tener que esperar a que cambie de mapa Lengua
Pero para qué ?. Eso no entiendo. Siempre usé la función en plugin_init();
Y cuando cambia de mapa se usa plugin_end(); supongo. Y se actualiza cuando se guardan datos en la db.

Si me equivoco dime, es lo que pienso yo

Si la base de datos esta en la misma pc que el servidor, lo veo medio al pedo cerrar la conexion en plugin_end.

Em, llamo al MYSQL_Init() cuando empieza la ronda, para cuando alguien modifique los datos del hud, se actualizen al empezar la ronda. Por ejemplo, proble sacando el evento de cuando empieza la ronda, y cuando edito un hud desde la db, tengo que esperar a que cambie de mapa para que se actualize >.<

Ya que plugin_init se llama una vez, verdad ? xD
Responder
#8
Si se llama una sola vez. Pero lo veo medio al pedo. Podrías hacer un task en plugin_init con el flag b y que se llame cada tantos segundos, cosa de que no se sobrecargue (Unos 900 segundos). Pero siempre basta con llamarlo en plugin_init();
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Responder
#9
(02/08/2014, 10:09 PM)CSAxel escribió: Si se llama una sola vez. Pero lo veo medio al pedo. Podrías hacer un task en plugin_init con el flag b y que se llame cada tantos segundos, cosa de que no se sobrecargue (Unos 900 segundos). Pero siempre basta con llamarlo en plugin_init();

Buena idea, en cuanto pueda actualizo
Responder
#10
Muy bueno Proud
Responder
#11
Gracias por compartirlo
NUEVO ZOMBIE PLAGUE + LVLS!! UNETE A LA COMUNIDAD
[Imagen: b_350_20_ffad41_e98100_000000_591f11.png]


Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)