Jump to content

MySQL Fields opslaan


Recommended Posts

Geplaatst:

Hey,

Ik haal van min Mysql DB het volgende af:

new row[258];
new field[16][32];

mysql_fetch_row_format(row, "|");
explode(row, field, "|");
mysql_free_result();

format(UserStats[playerid][Password], 32, "%s", pw);
	format(UserStats[playerid][Admin], 2, "%d", field[3]);
	format(UserStats[playerid][Money], 10, "%d", field[4]);
	format(UserStats[playerid][score], 10, "%d", field[5]);
	format(UserStats[playerid][Deaths], 10, "%d", field[6]);
	format(UserStats[playerid][Kills], 10, "%d", field[7]);
	format(UserStats[playerid][ip], 16, "%s", field[8]);
	format(UserStats[playerid][bank], 10, "%d", field[9]);
	format(UserStats[playerid][Rank], 10, "%d", field[10]);
	format(UserStats[playerid][Hours], 10, "%d", field[11]);
	format(UserStats[playerid][Minutes], 10, "%d", field[12]);
	format(UserStats[playerid][Jailed], 1, "%d", field[13]);
	format(UserStats[playerid][Muted], 1, "%d", field[14]);
	format(UserStats[playerid][skin], 3, "%d", field[15]);

Alleen het probleem is dat format(UserStats[playerid][Admin] 00000 afgeeft, format(UserStats[playerid][Money] : 0000, format(UserStats[playerid][score] : 000 en zo tot IP dat helemaal niks meer print.

Ookal geen Money 0000, toch krijg ik 48 op mijn rekening, terwijl er 11984891 in de database staat. Mijn skin word ook 48. Terwijl er 29 in de database staat.

Iemand ? :bonk:

Geplaatst:

Het is simpelweg op te lossen door field[..] te vervangen door strval(field[...]) wanneer je een getal eruit wil halen. Overigens raad ik het gebruik van sscanf aan om gegevens uit de database te halen.

Geplaatst: (bewerkt)

Het is simpelweg op te lossen door field[..] te vervangen door strval(field[...]) wanneer je een getal eruit wil halen. Overigens raad ik het gebruik van sscanf aan om gegevens uit de database te halen.

Dat had ik ook eerst, maar dat deed helemaal niks. Ik kreeg gewoon een leeg bericht.

UserStats[playerid][Admin] = strval(field[3]);

Fout gelezen, ik ga dat even proberen ^_^

EDIT: Nogsteeds hetzelfde probleem..

Je bedoelde dit toch ?

format(UserStats[playerid][Admin], 2, "%d", strval(field[3]));

Bewerkt: door Shotyoudie
Geplaatst:

Zo. :bier:

enum pEnum
{
Name[MAX_PLAYER_NAME],
Password[32],
Admin,
Money,
Score,
Deaths,
Kills,
Ip,
Bank,
Rank,
Hours,
Minutes,
Jailed,
Muted,
Skin
};
new UserStats[MAX_PLAYERS][pEnum];

Geplaatst:

Kan iemand me aub helpen met me code? Ik snap er niks meer van ! bij 'printf("%s", line);' print hij gewoon een spatie. :cry:

UserStats[playerid][Name] word bij het connecten van de server ingesteld, daarom is dit de enige die werkt. De rest print allemaal een spatie :cry:

LoginPlayer(playerid, password[])
{
if(!AccountExists[playerid])
	return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Your not registered !");

if(PlayerLogged[playerid])
    	return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Your already logged on !");

	if(strlen(password) < 3 || strlen(password) >= 32)
    	return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Use a password between 3 and 32 characters !");

CheckMySQL();

new string[128], pw[145], sql_id, naam;
WP_Hash(pw, sizeof (pw), password);
format(string, sizeof(string), "SELECT * FROM `users` WHERE `Name` = '%s' AND Password = '%s'", UserStats[playerid][Name], pw);
mysql_query(string);
mysql_store_result();

if(!mysql_num_rows())
	return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Wrong Password !");

new line[1024];
mysql_fetch_row(line);
printf("%s", line); 
sscanf(line, "p<|>s[32]dddddsddddddd", UserStats[playerid][Password], UserStats[playerid][Admin], UserStats[playerid][Money], UserStats[playerid][score], UserStats[playerid][Deaths],UserStats[playerid][Kills],UserStats[playerid][ip],UserStats[playerid][bank],UserStats[playerid][Rank], UserStats[playerid][Hours], UserStats[playerid][Minutes], UserStats[playerid][Jailed],UserStats[playerid][Muted],UserStats[playerid][skin]);
GivePlayerMoney(playerid, UserStats[playerid][Money]);
SetPlayerSkin(playerid, UserStats[playerid][skin]);
PlayerLogged[playerid] = 1;
format(string, sizeof(string), "[ACCOUNT] Welcome back %s, your now logged in !", UserStats[playerid][Name]);
SendClientMessage(playerid, COLOR_YELLOW, string);
   mysql_free_result();
return 1;
}

Geplaatst: (bewerkt)

Die cijfers bij score, deaths, kills.. zijn delen van het password.

1306934771-340.png

(Ja, deze code is niet efficient.:bonk: Is maar even om te proberen :puh: )

       SendClientMessage(playerid, COLOR_MSG, "Naam");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Name]);
SendClientMessage(playerid, COLOR_MSG, "Pass");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Password]);
SendClientMessage(playerid, COLOR_MSG, "Admin");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Admin]);
SendClientMessage(playerid, COLOR_MSG, "Money");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Money]);
SendClientMessage(playerid, COLOR_MSG, "Score");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][score]);
SendClientMessage(playerid, COLOR_MSG, "Deaths");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Deaths]);
SendClientMessage(playerid, COLOR_MSG, "Kills");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Kills]);
SendClientMessage(playerid, COLOR_MSG, "Ip");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][ip]);

EDIT: Hij print ook gewoon weer een spatie.

EDIT2: Deze functie werkt wel, hij print de lijn. Maar als ik de lijst van hierboven doe krijg ik gewoon alles onder elkaar eg:

Naam

Shotyoudie

Pass

Admin

Money

Met niks erbij :ch:

AutoLogin(playerid)
{
	new Query[200], Pname[24], escpname[24]; //Creates the Query string and the Pname
   	GetPlayerName(playerid, Pname, 24); //Gets the players name
   	mysql_real_escape_string(Pname, escpname); //escapes the string so you cant MySQL inject
   	format(Query, sizeof(Query), "SELECT * FROM `users` WHERE `Name` = '%s'", escpname); //Selects the line where the playername is the player
   	mysql_query(Query); //Querys the string
   	mysql_store_result(); //Stores the result
   	if(mysql_num_rows() != 0) //If the user is found
   	{
       new PIP[56]; //Creates the IP string
       GetPlayerIp(playerid, PIP, 56); //Gets the players IP
       format(Query, sizeof(Query), "SELECT * FROM `users` WHERE `Name` = '%s' AND `Ip` = '%s'", escpname, PIP); //Checks if the players IP is the same, if so it will auto login 
       mysql_query(Query); //Queries the result
       mysql_store_result(); //Stores the result
       if(mysql_num_rows() != 0) // If the players IP is the same in the DB
       {
           	SendClientMessage(playerid, COLOR_YELLOW, "Auto Logged in!");
           	new line[1024]; // The length of 1 'row' total.
			mysql_fetch_row(line);
			printf("%s", line); // will print for example "1|Andre|testpassword|0|1260723433"
			sscanf(line, "p<|>s[32]dddddsddddddd", UserStats[playerid][Password], UserStats[playerid][Admin], UserStats[playerid][Money], UserStats[playerid][score], UserStats[playerid][Deaths],UserStats[playerid][Kills],UserStats[playerid][ip],UserStats[playerid][bank],UserStats[playerid][Rank], UserStats[playerid][Hours], UserStats[playerid][Minutes], UserStats[playerid][Jailed],UserStats[playerid][Muted],UserStats[playerid][skin]);
		 	GivePlayerMoney(playerid, UserStats[playerid][Money]);
		 	SetPlayerSkin(playerid, UserStats[playerid][skin]);
		 	PlayerLogged[playerid] = 1;
       }
       if(!mysql_num_rows())
       {
           SendClientMessage(playerid, COLOR_YELLOW, "[ACCOUNT] This account is registered, please login"); //User is registered but IP does not match
       }
       }
   	mysql_free_result(); //Frees the result 
}

Bewerkt: door Shotyoudie
Geplaatst:

In de sscanf-lijn heb je s[32] zitten, ik zou daar s[129] van maken, want whirlpool bestaat uit 129 tekens.

Geplaatst:

       SendClientMessage(playerid, COLOR_MSG, "Naam");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Name]);
SendClientMessage(playerid, COLOR_MSG, "Pass");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Password]);
SendClientMessage(playerid, COLOR_MSG, "Admin");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Admin]);
SendClientMessage(playerid, COLOR_MSG, "Money");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Money]);
SendClientMessage(playerid, COLOR_MSG, "Score");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][score]);
SendClientMessage(playerid, COLOR_MSG, "Deaths");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Deaths]);
SendClientMessage(playerid, COLOR_MSG, "Kills");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][Kills]);
SendClientMessage(playerid, COLOR_MSG, "Ip");
SendClientMessage(playerid, COLOR_MSG, UserStats[playerid][ip]);

Dit zal sowieso NIET werken. SendClientMessage verwacht een string (tekst), geen integer (getal).

In de sscanf-lijn heb je s[32] zitten, ik zou daar s[129] van maken, want whirlpool bestaat uit 129 tekens.

Had ik zelfs nog over het hoofd gezien. Goed opgemerkt.

En dan dit nog: Je kan je sscanf regel inkorten (werkt enkel met deze enum):

enum pEnum
{
       Name[MAX_PLAYER_NAME],
       Password[129], // whirlpool hash
       Admin,
       Money,
       Score,
       Deaths,
       Kills,
       Ip[16], // ip is ook een string, vergis je niet
       Bank,
       Rank,
       Hours,
       Minutes,
       Jailed,
       Muted,
       Skin
};


sscanf(line, "e<p<|>s[24]s[129]ddddds[16]ddddddd>", UserStats[playerid]);

Geplaatst: (bewerkt)

Het werkt nog steeds niet !

Ik heb er Id bijgezet omdat in mijn mysql table een id bij zit die ik voor de website gebruik, en dus niet ingame nodig heb. Maar anders leest hij hem fout.

Bij Enum erbij gedaan:

Id[3]

In functie:

sscanf(line, "e<p<|>ds[24]s[129]ddddds[16]ddddddd>", UserStats[playerid]);

Hij print met dit nu:

Adminlevel: 0 (Klopt Niet)

Pass: 0 (Klopt niet)

IP: (niks)

Score: 0 (Kan kloppen maar er zijn meer getallen die 0 zijn)

Money: 0 (Klopt niet)

Skin: (Niks)

En ik had niet nagedacht dat ClientMessage alleen strings zou verwachten :bonk: Dit is met format gedaan.

Andere dingen heb ik niet geprint.

Bewerkt: door Shotyoudie
Geplaatst: (bewerkt)

EDIT: Oeps zag ik over het hoofd. Note wel dat sscanf een exacte volgorde verwacht en ook al heb je bepaalde zaken ertussen niet nodig dan alsnog moeten ze in de sscanf staan verwerkt. Je kan ze dan wel doen overslagen door het tussen { } te zetten in e<>.

Bewerkt: door Megadreams

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...