Shotyoudie Geplaatst: 29 mei 2011 Rapport Geplaatst: 29 mei 2011 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 ? Reageren
Megadreams Geplaatst: 29 mei 2011 Rapport Geplaatst: 29 mei 2011 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. Reageren
Incognation Geplaatst: 29 mei 2011 Rapport Geplaatst: 29 mei 2011 Een format bij getallen is ook niet nodig. Reageren
Shotyoudie Geplaatst: 29 mei 2011 Auteur Rapport Geplaatst: 29 mei 2011 (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: 29 mei 2011 door Shotyoudie Reageren
Big Boss Geplaatst: 29 mei 2011 Rapport Geplaatst: 29 mei 2011 Hoe ziet je enum er uit? Ik raad trouwens ook aan om sscanf te gebruiken. Veel simpeler. Reageren
Shotyoudie Geplaatst: 30 mei 2011 Auteur Rapport Geplaatst: 30 mei 2011 Zo. 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]; Reageren
Shotyoudie Geplaatst: 1 juni 2011 Auteur Rapport Geplaatst: 1 juni 2011 Kan iemand me aub helpen met me code? Ik snap er niks meer van ! bij 'printf("%s", line);' print hij gewoon een spatie. UserStats[playerid][Name] word bij het connecten van de server ingesteld, daarom is dit de enige die werkt. De rest print allemaal een spatie 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; } Reageren
Incognation Geplaatst: 1 juni 2011 Rapport Geplaatst: 1 juni 2011 mysql_fetch_row(line); maak daar mysql_fetch_row_format(line, "|"); van Reageren
Shotyoudie Geplaatst: 1 juni 2011 Auteur Rapport Geplaatst: 1 juni 2011 (bewerkt) Die cijfers bij score, deaths, kills.. zijn delen van het password. (Ja, deze code is niet efficient. Is maar even om te proberen ) 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 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: 1 juni 2011 door Shotyoudie Reageren
Incognation Geplaatst: 1 juni 2011 Rapport Geplaatst: 1 juni 2011 In de sscanf-lijn heb je s[32] zitten, ik zou daar s[129] van maken, want whirlpool bestaat uit 129 tekens. Reageren
Big Boss Geplaatst: 1 juni 2011 Rapport Geplaatst: 1 juni 2011 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]); Reageren
Shotyoudie Geplaatst: 1 juni 2011 Auteur Rapport Geplaatst: 1 juni 2011 (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 Dit is met format gedaan. Andere dingen heb ik niet geprint. Bewerkt: 1 juni 2011 door Shotyoudie Reageren
Incognation Geplaatst: 1 juni 2011 Rapport Geplaatst: 1 juni 2011 Probeer: sscanf(line, "p<|>e<ds[24]s[129]ddddds[16]ddddddd>", UserStats[playerid]); Reageren
Shotyoudie Geplaatst: 2 juni 2011 Auteur Rapport Geplaatst: 2 juni 2011 Ik heb het opgelost met strval(field[0]);.. Met sscanf bleef alles gewoon 0. Reageren
Megadreams Geplaatst: 2 juni 2011 Rapport Geplaatst: 2 juni 2011 (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: 2 juni 2011 door Megadreams Reageren
Recommended Posts
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.