Solo puedo guardar una cuenta en la base de datos
#1

Buenas, estaba probando el sistema de registro que hice con SQLite, pero solo puedo guardar una cuenta, me registro con la primer cuenta y todo va correcto, pero a la segunda cuenta ya no guarda nada, no sй por quй, podrнan darme una mano por favor? Desde ya muchas gracias.
PHP код:
CMD:registrar(playeridparams[])
{
    if(
CheckAccountExist(playerid)) return SendClientMessage(playeridCOLOR_ROJO"Esta cuenta se encuentra registrada, por favor usa /login [contraseсa] para ingresar.");
    new 
pass[24];
    if(
sscanf(params,"s[24]",pass)) return UsoCorrecto(playerid"/registrar [contraseсa]");
    
/*if(strval(pass) < 3 || strval(pass) > 24) return Error(playerid, "La contraseсa debe ser mayor a 4 y menor de 24.");*/
    
    
new sas[128], DBResult:result;
    
format(sassizeof(sas), "INSERT INTO `datos` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT,`Nombre`,`Password`,`Admin`,`Score`,`Matados`,`Muertes`, `Baneado`) VALUES ('%q', '%q', 0, 0, 0, 0, 0)",NombreJugador(playerid),pass);
    
db_query(usuarios,sas);
    
db_free_result(result);
    
    new 
asd[64];
    
format(asdsizeof(asd), "{848484}%s ha ingresado al servidor.",NombreJugador(playerid));
    
SendClientMessageToAll(-1asd);
    
    return 
1;

Reply
#2

Lo mбs probable es que la consulta no es enviada completamente. їPor quй?

Tu variable sas solo almacena 128 caracteres, y en la cadena de la consulta hay 162. Y eso sin contar que en runtime se le aсade el nombre del jugador y la contraseсa.

Te recomiendo que lo modifiques, para que te funcione bien y para optimizar, ya que si utilizaste 128 de seguro que lo hiciste para optimizar, pero se te fue de la mano xD.

En la consulta tienes 162 caracteres, asн que sumale el maximo de la variable pass(24) y el del nombre(tambiйn 24). Esto te darнa 270.

PHP код:
new sas[270]; 
Y al final creaste otra variable de 64 celdas sуlo para un mensaje, siendo que puedes utilizar el mismo que creaste anteriormente(sas). Esto lo podes hacer ya que el contenido de la variable(sas) ya la utilizaste con anterioridad, lo cual no te traerнa problemas. Osea, si quieres en verdad optimizar deberнas de quitar la variable asd y directamente formatear la variable sas.

[Consejo]:


PHP код:
CMD:registrar(playeridparams[]) 

    if(
CheckAccountExist(playerid)) return SendClientMessage(playeridCOLOR_ROJO"Esta cuenta se encuentra registrada, por favor usa /login [contraseсa] para ingresar."); 
    new 
pass[24]; 
    if(
sscanf(params,"s[24]",pass)) return UsoCorrecto(playerid"/registrar [contraseсa]"); 
    if(
strlen(pass) < || strlen(pass) > 23) return Error(playerid"La contraseсa debe ser mayor a 4 y menor de 24."); // <-- strval convierte un texto en nъmero, y lo que tъ quieres es contar los caracteres. Para eso estб la funciуn strlen
     
    
new sas[270], DBResult:result
    
format(sassizeof(sas), "INSERT INTO `datos` (`ID` INTEGER PRIMARY KEY AUTOINCREMENT,`Nombre`,`Password`,`Admin`,`Score`,`Matados`,`Muertes`, `Baneado`) VALUES ('%q', '%q', 0, 0, 0, 0, 0)",NombreJugador(playerid),pass); 
    
result db_query(usuarios,sas); 
    
db_free_result(result); 
      
    
format(sassizeof(sas), "{848484}%s ha ingresado al servidor.",NombreJugador(playerid)); 
    
SendClientMessageToAll(-1sas); 
     
    return 
1

Reply
#3

Quote:
Originally Posted by Dreyfuz
Посмотреть сообщение
Lo mбs probable es que la consulta no es enviada completamente. їPor quй?

Tu variable sas solo almacena 128 caracteres, y en la cadena de la consulta hay 162. Y eso sin contar que en runtime se le aсade el nombre del jugador y la contraseсa.

Te recomiendo que lo modifiques, para que te funcione bien y para optimizar, ya que si utilizaste 128 de seguro que lo hiciste para optimizar, pero se te fue de la mano xD.

En la consulta tienes 162 caracteres, asн que sumale el maximo de la variable pass(24) y el del nombre(tambiйn 24). Esto te darнa 270.

PHP код:
new sas[270]; 
Y al final creaste otra variable de 64 celdas sуlo para un mensaje, siendo que puedes utilizar el mismo que creaste anteriormente(sas). Esto lo podes hacer ya que el contenido de la variable(sas) ya la utilizaste con anterioridad, lo cual no te traerнa problemas. Osea, si quieres en verdad optimizar deberнas de quitar la variable asd y directamente formatear la variable sas.

[Consejo]
Gracias por tu consejo y por intentar ayudarme, pero sigue sin guardar datos, estuve viendo y no sй si tendrб algo que ver la forma en la que creй la base:
PHP код:
db_free_result(db_query(usuarios"CREATE TABLE IF NOT EXISTS `datos` \
                                            (`ID` INTEGER PRIMARY KEY AUTOINCREMENT, \
                                            `Nombre` VARCHAR(24) NOT NULL, \
                                            `Password` VARCHAR(24) NOT NULL, \
                                            `Admin` INTEGER NOT NULL, \
                                            `Score` INTEGER NOT NULL, \
                                            `Matados` INTEGER NOT NULL, \
                                            `Muertes` INTEGER NOT NULL, \
                                            `Baneado` INTEGER NOT NULL)"
)); 
Reply
#4

INSERT INTO `datos` (`ID`,`Nombre`,`Password`,`Admin`,`Score`,`Matados `,`Muertes`, `Baneado`) VALUES (null,'%q', '%q', 0, 0, 0, 0, 0)

la PK al ser autoincrement solo pon NULL
Reply
#5

Quote:
Originally Posted by GaBO!
Посмотреть сообщение
INSERT INTO `datos` (`ID`,`Nombre`,`Password`,`Admin`,`Score`,`Matados `,`Muertes`, `Baneado`) VALUES (null,'%q', '%q', 0, 0, 0, 0, 0)

la PK al ser autoincrement solo pon NULL
Sigue sin funcionar :C
Reply
#6

Verifica que 'usuarios' sea la direccion de tu db(scriptfiles/tudb.db).

PHP код:
CMD:registrar(playeridparams[]) 

    if(
CheckAccountExist(playerid))return Error(playerid"Esta cuenta se encuentra registrada, por favor usa /login [contraseсa] para ingresar."); 
    new 
clave[24], tmp[36 24], consulta[98 48], DBResult:resultado;
    if(
sscanf(params,"s[24]",clave))return UsoCorrecto(playerid"/registrar [contraseсa]"); 
    if(
strlen(clave) < || strlen(clave) > 24)return Error(playerid"La contraseсa debe ser mayor a 4 y menor de 24.");
    
format(consulta,sizeof(consulta),"INSERT INTO datos(Nombre,Password,Admin,Score,Matados,Muertes,Baneado) VALUES('%s','%s',0,0,0,0,0)",NombreJugador(playerid),clave); 
    
resultado db_query(usuarios,consulta); 
    
db_free_result(resultado);
    
format(tmp,sizeof(tmp),"{848484}%s ha ingresado al servidor.",NombreJugador(playerid)); 
    
SendClientMessageToAll(-1,tmp);
    return 
1

Reply
#7

Quote:
Originally Posted by Parka
Посмотреть сообщение
Verifica que 'usuarios' sea la direccion de tu db(scriptfiles/tudb.db).

PHP код:
CMD:registrar(playeridparams[]) 

    if(
CheckAccountExist(playerid))return Error(playerid"Esta cuenta se encuentra registrada, por favor usa /login [contraseсa] para ingresar."); 
    new 
clave[24], tmp[36 24], consulta[98 48], DBResult:resultado;
    if(
sscanf(params,"s[24]",clave))return UsoCorrecto(playerid"/registrar [contraseсa]"); 
    if(
strlen(clave) < || strlen(clave) > 24)return Error(playerid"La contraseсa debe ser mayor a 4 y menor de 24.");
    
format(consulta,sizeof(consulta),"INSERT INTO datos(Nombre,Password,Admin,Score,Matados,Muertes,Baneado) VALUES('%s','%s',0,0,0,0,0)",NombreJugador(playerid),clave); 
    
resultado db_query(usuarios,consulta); 
    
db_free_result(resultado);
    
format(tmp,sizeof(tmp),"{848484}%s ha ingresado al servidor.",NombreJugador(playerid)); 
    
SendClientMessageToAll(-1,tmp);
    return 
1

Si yo borro la base de datos y abro el servidor, se vuelve a crear y tal, pero solo me deja registrar la primer cuenta, luego ya no guarda los datos.
Reply
#8

їEn el log no te aparece ningъn mensaje que pueda ayudarnos a detectar el error?

El tamaсo del buffer de la consutla ya sabemos que es muy pequeсo, y al realizar el insert no tienes que poner el campo ID, con el autoincrement no es necesario.

pawn Код:
format(sas, sizeof(sas), "INSERT INTO `datos` (`Nombre`,`Password`,`Admin`,`Score`,`Matados`,`Muertes`, `Baneado`) VALUES ('%q', '%q', 0, 0, 0, 0, 0)",NombreJugador(playerid),pass);
Reply
#9

Quote:
Originally Posted by OllieSimons
Посмотреть сообщение
їEn el log no te aparece ningъn mensaje que pueda ayudarnos a detectar el error?

El tamaсo del buffer de la consutla ya sabemos que es muy pequeсo, y al realizar el insert no tienes que poner el campo ID, con el autoincrement no es necesario.

pawn Код:
format(sas, sizeof(sas), "INSERT INTO `datos` (`Nombre`,`Password`,`Admin`,`Score`,`Matados`,`Muertes`, `Baneado`) VALUES ('%q', '%q', 0, 0, 0, 0, 0)",NombreJugador(playerid),pass);
Hice esto, pero no sй si estб bien hecho:
PHP код:
new sas[270], DBResult:result;
    
format(sassizeof(sas), "INSERT INTO `datos` (`Nombre`,`Password`,`Admin`,`Score`,`Matados`,`Muertes`, `Baneado`) VALUES ('%q', '%q', 0, 0, 0, 0, 0)",NombreJugador(playerid),pass);
    
result db_query(usuarios,sas);
    
db_free_result(result);
    if(
db_num_rows(result) >= 1)
    {
        print(
"Una nueva cuenta ha sido creada.");
    }
    else
    {
        print(
"Algo ha ocurrido y la cuenta no a sido creada.");
    } 
Y en la consola me sale que la cuenta no fue creada.
Reply
#10

їTienes AutoIncrement activado?

Porque al insertar una cuenta queda ya con esa ID, y al darle "INSERT" se crea en la misma ID y eso no es posible.
Reply


Forum Jump:


Users browsing this thread: 6 Guest(s)