[AYUDA] mysql_function_query
#1

Hola! Alguien me podria explicar sobre esta funcion? He mirado muchos ejemplos pero todavia no entiendo.

pawn Код:
mysql_function_query(connectionHandle, query[], bool:cache, callback[], format[], {Float,_}:... )
No se que es lo que hay que poner en cada casillero de adentro de la funcion , qe es conection handle? bool:cache? format? float? _}:...?
Reply
#2

Eso sirve para las threaded queries, que son consultas que a diferencia de versiones anteriores no interrumpen el proceso del servidor hasta que los datos esten listos y puedan ser procesados, este tipo de consultas al tener los datos listos llama una funcion definida en la cual vas a poder trabajar con los datos que pediste en la consulta (SELECT) o cuando la consulta se haya ejecutado con exito(UPDATE, INSERT INTO, DELETE, etc).
connectionHandle es una ID de conexion que te devuelve mysql_connect, generalmente queda en 1 ya que no se usa mas de 1 base de datos.
query iria la consulta, Ejemplo: SELECT * FROM Accounts WHERE ID=1
cache solo usalo en consultas SELECT, esta sirve para que los datos de las consultas sean puestos en la memoria y luego de al terminar la funcion se libera la memoria (mysql_store_result y mysql_free_result no son mas necesarios).
callback es la funcion public donde se va a llamar al tener los datos listos o la consulta se ejecute con exito.
format irian los tipos de variables que son los parametros, parecido al SetTimerEx y sscanf
float irian las variables que se pasan a la funcion, generalmente es la id del jugador, o sea playerid.
Ejemplo:
pawn Код:
public OnPlayerConnect(playerid)
{
new string[32], name[24];
GetPlayerName(playerid, name, 24);
mysql_format(1, string, 128, "SELECT ID FROM Accounts WHERE Username='%e'", name); //este es un format especial en el cual al poner %e haria lo mismo que la funcion mysql_real_escape_string, para evitar SQL Injections
mysql_function_query(1, string, true, "OnPlayerExistsOnDB", "i", playerid);
return 1;
}
//me da paja poner el forward
public OnPlayerExistsOnDB(playerid)
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, -1, "Esta cuenta existe usa /login contraseсa");
}
else
{
SendClientMessage(playerid, -1 "Esta cuenta no esta registrada, usa /register");
}
return 1;
}
Reply
#3

de hecho, darнa error de que agregastes un argumento de mбs en mysql_format

serнa asн:

pawn Код:
mysql_format(1, string, "SELECT ID FROM Accounts WHERE Username='%e'", name); //este es un format especial en el cual al poner %e haria lo mismo que la funcion mysql_real_escape_string, para evitar SQL Injections
pawn Код:
mysql_format( connectionHandle, output[], format[], {Float,_}:... )
Reply
#4

Quote:
Originally Posted by Adoniiz
Посмотреть сообщение
de hecho, darнa error de que agregastes un argumento de mбs en mysql_format

serнa asн:

pawn Код:
mysql_format(1, string, "SELECT ID FROM Accounts WHERE Username='%e'", name); //este es un format especial en el cual al poner %e haria lo mismo que la funcion mysql_real_escape_string, para evitar SQL Injections
pawn Код:
mysql_format( connectionHandle, output[], format[], {Float,_}:... )
En las versiones mбs recientes esa funciуn tiene mбs argumentos.

Reply
#5

ah, vaya no me habнa dado cuenta, muchas gracias por la correcciуn.
Reply
#6

Yo uso mysql_tquery de la r33, mysql_function_query es de la r7.
Reply
#7

Muchas gracias me quedo clarisimo! Solo una duda, ya que el cache estando true guarda los datos en la memoria, como guardo estos datos en una variable? Por ej "SELECT ID FROM Accounts WHERE Username='%e'", Como guardo el resultado del select (la id que le corresponde al nombre)en una variable?
Reply
#8

Tenes esta variable con enum:
pawn Код:
enum pData
{
ID,
Username[24],
Password[64],
Admin,
};
new pInfo[MAX_PLAYERS][pData];

//consulta: SELECT * FROM Accounts WHERE Username='Pepe' AND Password='123', me da paja poner todo mysql_function_query
//La fila tendria los siguientes datos id:8, username:Pepe, password:123 y admin:4

new OnPlayerLogin(playerid)
{
new rows,fields;
cache_get_data(rows,fields);
if(!rows) return SendClientMessage(playerid, -1, "Usuario o contraseсa incorrectos"),1;
new var[16];
cache_get_row(0, 0, var); //fila 0 campo 0, o sea ID se guarda en var, una string.
pInfo[playerid][ID] = strval(var); //transforma string a int, si es float en vez de strval usa floatstr
cache_get_row(0, 1, pInfo[playerid][Username]);//fila 0 campo 1, seria el campo que le sigue
cache_get_row(0, 2, pInfo[playerid][Password]); //se guardan directamente en sus variables ya que son strings
cache_get_row(0, 3, var); //fila 0 campo 0, o sea ID se guarda en var, una string.
pInfo[playerid][Admin] = strval(var);
SendClientMessage(playerid, -1, "Login exitoso");
return 1;
}
Reply
#9

Perfecto! Ya me funciono el SELECT, solo me queda el INSERT por funcionar . El codigo no me tira errores pero no anda.
pawn Код:
function InsertDB(playerid){
  new rows,fields,guita;
  new query[128];
  cache_get_data(rows,fields);
  if(!rows) return SendClientMessage(playerid, COLOR_WHITE, "Mal");
  new var[16];
  cache_get_row(0, 0, var);
  guita = strval(var);
  new dinero = guita + 5;
  format(query, sizeof(query), "INSERT INTO depositos (Dinero) VALUES (%d) ",dinero);
  mysql_function_query(1, query, false, "", "i");
 return 1;
}
CMD:ponerdinero(playerid,params[]){
  new query[180];
  format(query, sizeof(query), "SELECT Dinero FROM depositos ");
  mysql_function_query(1, query, true, "InsertDB", "i", playerid);
 return 1;
}
Deberia sumarle 5 a la field Dinero pero no lo hace :S, seguro puse algo mal en los parametros de la funcion mysql_function_query

EDIT: Checkie con la base de datos, y lo que hace es crear una nueva linea con un nuevo valor de Dinero, pero yo lo que quiero es que modifique la existente, y no quiero una linea nueva (el error probablemente este en el query)

EDIT2: (lol) solucionado, tenia que poner WHERE 1

Muchisimas gracias! MugiwaraNoLuffy ya te habia dado rep en este post, no puedo denuevo :S
Reply
#10

Quote:
Originally Posted by ValenRatti
Посмотреть сообщение
Checkie con la base de datos, y lo que hace es crear una nueva linea con un nuevo valor de Dinero, pero yo lo que quiero es que modifique la existente, y no quiero una linea nueva
Eso lo puedes hacer utilizando UPDATE, mбs informaciуn.

pawn Код:
public InsertDB(playerid)
{
    new rows,fields,guita;
    new query[128];
    cache_get_data(rows,fields);
    if(!rows) return SendClientMessage(playerid, COLOR_WHITE, "Mal");
    new var[16];
    cache_get_row(0, 0, var);
    guita = strval(var);
    new dinero = guita + 5;
    format(query, sizeof(query), "UPDATE depositos SET Dinero=%d LIMIT 1",dinero);
    mysql_function_query(1, query, false, "", "");
    return 1;
}

CMD:ponerdinero(playerid,params[])
{
    new query[180];
    format(query, sizeof(query), "SELECT Dinero FROM depositos LIMIT 1");
    mysql_function_query(1, query, true, "InsertDB", "i", playerid);
    return 1;
}

//Mбs optimizado...

CMD:ponerdinero(playerid,params[])
{
    mysql_function_query(1, "UPDATE depositos SET Dinero=Dinero+5 LIMIT 1", false, "", "");
    return 1;
}
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)