Jump to content
  • 0

Problem? Login ( SQL )


DrakusorU

Question

Salut, acum ceva timp, m-am apucat s? fac un script RPG de la 0 folosind SQL. Pân? aici totul a fost bine, dar de aici, totul s-a dat peste cap ?i prin încerc?riile mele nereu?ite de a g?si o cale s? rezolv acest? problem?, m-am hot?rât s? cer ajutorul.

Problema este urm?toarea : Când m? conectez pe server, îmi apare dialogul pentru a m? înregistra, m? înregistrez, apare dialogul pentru login, pân? aici totul bine. Dar când s? bag parola ca s? m? loghez, "surprise", îmi spune c? parola introdus? nu este corect?. De?i parola era una destul de simpl?, ( 123456 ), bun, o bag din nou, ?i în loc s? m? spawneze cum era normal, îmi apare dialog-ul pentru login din nou. ?i a?a o i-au de la cap?t de fiecare dat?, bag parola, zice c? este gre?it?, o bag din nou, îmi d? dialog-ul pentru login... În?elege?i voi.

Scriptul ar fi urm?torul :

Aici am mici dubii... Nu ?tiu dac? este corect.

Database = db_open("Users.db");
db_query(Database, "CREATE TABLE IF NOT EXISTS `Users` (`Name`, `Password`, `SpawnLocation`, `AccountInfo`, `AdminLevel`, `Level`, `Money`, `Sex`, `Age`)");
return 1;
Comenzile pentru înregistrare ?i login.
new query[256], DBResult: Result, name[MAX_PLAYER_NAME];
    
GetPlayerName(playerid, name, sizeof(name));
    
    if(dialogid == Login)
    {
        if(response)
        {
            format(query, sizeof(query), "SELECT * FROM `Users` WHERE `Name` = '%s' AND `Password` = '%s'", DB_Escape(name), DB_Escape(inputtext));
            Result = db_query(Database, query);
            if(db_num_rows(Result))
            {
                new Field[20] ;

                db_get_field_assoc(Result, "Level", Field, 30 );
		       	pData[playerid][Level] = strval(Field);

		       	db_get_field_assoc(Result, "Money", Field, 30 );
		       	pData[playerid][Money] = strval(Field);

                SetPlayerScore(playerid, pData[playerid][Level]);

				ResetPlayerMoney(playerid);
				GivePlayerMoney(playerid, pData[playerid][Money]);

				pData[playerid][Logged] = true;
				SpawnPlayer(playerid);
            }
            else
            {
                format(query, sizeof(query), "The password entered is wrong, please try again, but now typing the correctly password.\n\n\n\n");
                ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Login", query, "Login", "Exit");
            }
            db_free_result(Result);
        }
        else return Kick(playerid);
    }
    if(dialogid == Register)
    {
        if(response)
        {
            if(strlen(inputtext) > 15 || strlen(inputtext) < 5)
            {
                format(query, sizeof(query), ""#White"Your password length must be from 5 - 15 characters !.\n\n\n\n");
                ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Register", query, "Register", "Exit");
            }
            else
            {
                format(query, sizeof(query), "INSERT INTO `Users` (`Name`, `Password`, `SpawnLocation`, `AccountInfo`, `AdminLevel`, `Level`, `Money`, `Sex`, `Age`) VALUES ('%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", DB_Escape(name), DB_Escape(inputtext), pData[playerid][SpawnLocation], pData[playerid][AccountInfo],  pData[playerid][Admin], GetPlayerScore(playerid), GetPlayerMoney(playerid), pData[playerid][Sex], pData[playerid][Age]);
                db_query(Database, query);
				format(query, sizeof(query), "{FFFFFF}You have registered successfully, {F2B90E}%s{FFFFFF}. Your password is : {F2B90E}%s {FFFFFF}.\n\n\nNow, to login type the password here.", name, DB_Escape(inputtext));
				ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", query, "Login", "Exit");			

				db_free_result(db_query(Database, query));	
            }
        }
        else return Kick(playerid);
    }

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

Nu mai folosit INSERT INTO `Users` ( `name`, `col2`, `col3`, `etc ) VALUES...

Foloseste direct INSERT INTO `Users` VALUES...

Deci la tine asta ar veni cam asa:

format(query, sizeof(query), "INSERT INTO `Users` VALUES ('%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", DB_Escape(name), DB_Escape(inputtext), pData[playerid][SpawnLocation], pData[playerid][AccountInfo],  pData[playerid][Admin], GetPlayerScore(playerid), GetPlayerMoney(playerid), pData[playerid][Sex], pData[playerid][Age]);
Asa este mai bine! + cand scrii intr-o data base foloseste si db_free_result
db_free_result( db_query( Database, Query ) );

Incearca sa schimbi cu ce ti-am dat si sa vezi daca merge.

Fara reclama in semnatura!

Link to comment
Share on other sites

Încerc acum, revin cu edit.

Edit : Nu merge nici a?a, dup? ce m? înregistrez, îmi apare dialog-ul pentru login, scriu parola, îmi spune c? este gre?it?, scriu parola din nou, ?i ori îmi apare dialog-ul pentru login din nou, ori dispare de tot.

http://www.mediafire.com/?qhukviky28uk25f - Poftim, l-am uplodat aici, poate reu?e?ti s?-l faci, dac? m? crezi c? am început s?-l fac acum o lun?, ?i n-am reu?it deloc s? fac asta... Ce-i drept, dup? 2 s?pt?mâni l-am dat naibi ?i l-am l?sat acolo, iar acum o s?pt?mân? m-am apucat din nou de el.

Link to comment
Share on other sites

Functia DB_Escape sincer mi se pare o prostie.

Incearca asa:

if ( dialogid == Login )
    {
        if ( response )
        {
            format( query, sizeof( query ), "SELECT * FROM `Users` WHERE `Name` = '%s' AND `Password` = '%s'", PlayerName( playerid ), strlen( inputtext ) );
        	Result = db_query( Database, query );
        	if ( db_num_rows( Result ) )
        	{
                new Field[ 20 ];

                db_get_field_assoc( Result, "Level", Field, 30 ); pData[playerid][Level] = strval(Field); SetPlayerScore(playerid, pData[playerid][Level]);
		       	db_get_field_assoc( Result, "Money", Field, 30 ); pData[playerid][Money] = strval(Field); SetPlayerMoney(playerid, pData[playerid][Money]);

				pData[ playerid ][ Logged ] = true;
				SpawnPlayer( playerid );
			}
			else
			{
			    format(string, sizeof(string), "The password entered is wrong, please try again, but now typing the correctly password.\n\n\n\n");
            	ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Login", string, "Login", "Exit");
			}
			db_free_result(Result);
        }
        else return Kick(playerid);
    }
Si functia PlayerName:
stock PlayerName( i )
{
    new n[ 24 ];
    GetPlayerName( i, n, 24 );
    return n;
}

Fara reclama in semnatura!

Link to comment
Share on other sites

Cand inserezi intr-o database trebuie sa inserezi tot ce are e creata!

Database a ta este creata din 9 coloane

Iar tu cand inserezi in ea inserezi in 10 coloane:

"INSERT INTO `Users` VALUES ('%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')"

Unul ii in + acolo

LOL !. De aici era... Nu-i d?dusem deloc aten?ie acestui lucru =))). Eu credeam c? e bine f?cut acolo. Po?i închide topic-ul, mersi.

EDIT : Am rezolvat chestia asta, dar acum nu reu?esc s? fac s? actualizeze informa?iile din baza de date. Pur ?i simplu nu se actualizeaz?. Am f?cut în urm?torul fel :

forward AccountUpdate(playerid);
forward InitRestartFunction();
forward RestartFunction();
public InitRestartFunction()
{
	//new string[128];
	for(new i = 0; i < MAX_PLAYERS; i++) {
		if(IsPlayerConnected(i)) {
			AccountUpdate(i);
			pData[i][Logged] = false; } }
	SetTimer("RestartFunction", 5000, 0);
	return 1;
}

public RestartFunction() { GameModeExit(); }

public OnGameModeExit()
{
        db_close(Database);
	return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
	if(pData[playerid][Logged] == true)
	{
		AccountUpdate(playerid);
		pData[playerid][Logged] = false;	
	}	
	return 1;
}
public AccountUpdate(playerid)
{
	new query[256], name[MAX_PLAYER_NAME];

	GetPlayerName(playerid, name, sizeof(name));
  
	format(query, sizeof(query), "UPDATE `Users` SET `SpawnLocation` = '%d', `Registred` = '%d', `AdminLevel` = '%d', `Level` = '%d', `Money` = '%d', `Sex` = '%d', `Age` = '%d' WHERE `Name` = '%s'", pData[playerid][SpawnLocation], pData[playerid][Registred], pData[playerid][Admin], pData[playerid][Level], pData[playerid][Money], pData[playerid][Sex], pData[playerid][Age], DB_Escape(name));

	db_query(Database, query);
	db_free_result(db_query(Database, query));
}

Link to comment
Share on other sites

De ce folosesti:

db_query(Database, query);
db_free_result(db_query(Database, query));
cand formatezi un string?  :undecided: Foloseste doar:
db_free_result(db_query(Database, query));
Am modificat azi de dimineat?, f?cusem în altfel cu speran?a c? o s? mearg?, dar tot nimic.
public InitRestartFunction()
{
	//new string[128];
	for(new i = 0; i < MAX_PLAYERS; i++) {
		if(IsPlayerConnected(i)) {
			AccountUpdate(i);
			pData[i][Logged] = false; } }
	SetTimer("RestartFunction", 5000, 0);
	return 1;
}

public RestartFunction() { GameModeExit(); }

public OnGameModeExit()
{
        db_close(Database);
	return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
	if(pData[playerid][Logged]) { AccountUpdate(playerid); }

	pData[playerid][Logged] = false;	
	return 1;
}
public AccountUpdate(playerid)
{
	new query[700], name[MAX_PLAYER_NAME];

	GetPlayerName(playerid, name, sizeof(name));

	if(AccountExists(playerid))
	{

		format(query, sizeof(query), "UPDATE `Users` SET \
									 `SpawnLocation` = '%d', \
									 `Registred` = '%d', \
									 `AdminLevel` = '%d', \
									 `Level` = '%d', \
									 `Money` = '%d', \
									 `Sex` = '%d', \
									 `Age` = '%d' WHERE ( `Name` = '%s' )", 
									    pData[playerid][SpawnLocation], 
										pData[playerid][Registred], 
										pData[playerid][Admin], 
										pData[playerid][Level], 
										pData[playerid][Money], 
										pData[playerid][Sex], 
										pData[playerid][Age], 
										DB_Escape(name));

		db_query(Database, query);
	}
	else
	{
		SendClientMessage(playerid, ~1, "{FFFFFF}This account doesn't exist...");
	}	
}
A?a am acum în script, ?i tot nu se actulizeaz? baza de date, am încercat testând adminul, îmi d?deam admin ?i dup? d?deam restart la server sau ie?eam dup? server ?i nimic. Când m? conectam din nou nu mai aveam adminul. ?i comanda :
CMD:sadmin( playerid, params[] ) {
	if(IsPlayerConnected(playerid)) {
		if(pData[playerid][Admin] >= 0) {
		    if(IsPlayerConnected(playerid)) {
				pData[playerid][Admin] = 7;
				SendClientMessage(playerid, ~1, ""#Red"* "#White"Hi, welcome back."); } } }
	return 1;
}

EDIT : Rezolvat, nu era de aici, la dialog-ul pentru login nu era un field complet.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.