[Tutorial] MySQL Registration System [Threaded Queries(R33+) + Whirlpool]
#61

Linux or windows is usefull for runing samp server with MySQL ?
Reply
#62

So everything compiled smoothly and i have the database setup and the server can connect to it with no problem. The only issue I'm facing at the moment is when i hop in game the login and registration dialog does not pop-up. Any ideas?

Console:

Database:
Reply
#63

Just asking is this the best tutorial to learn mysql (Threaded one) ? I don't know anything about mysql, and now i am gonna get from y_ini to mysql.
Reply
#64

How would you go about spawning the player, SetSpawnInfo and SpawnPlayer?
Reply
#65

Quote:
Originally Posted by AchievementMaster360
View Post
So everything compiled smoothly and i have the database setup and the server can connect to it with no problem. The only issue I'm facing at the moment is when i hop in game the login and registration dialog does not pop-up. Any ideas?

Console:

Database:
I'm the same as this, I've got everything running, server's got no errors or warnings, but no dialog box comes up when I enter the game. Any assistance?
Reply
#66

Quote:
Originally Posted by BR3TT
View Post
I'm the same as this, I've got everything running, server's got no errors or warnings, but no dialog box comes up when I enter the game. Any assistance?
Both of you aren't connected to the database correctly. Have you inserted the correct info in mysql_connect?
Reply
#67

Disregard I got this to work. Thanks for the help
Reply
#68

i have wrote the coding from seeing this tutor
MY codings are





//First, of course we need to include these files first
#include <a_samp> //Without this, we won't be able to use all samp functions/callbacks
#include <a_mysql> //Without this, we won't be able to use all mysql functions

//Let's define our mysql settings
#define host "localhost" //This will be your mysql host. Default for xampp is localhost
#define user "root" //This will be your mysql username. Default for xampp is root
#define db "server" //This is your database name. Remember we have created a database called server before.
#define pass "root" //This is your mysql password. In xampp, the password didn't set. So leave it empty.

//dialogs
#define dregister 6287 //dialog register id
#define dlogin 6288 // ^

//Global variables. We will use them later
static
mysql, //This variable will be used to manage our database
Name[MAX_PLAYERS][24], //We will use this variable to store player's name.
IP[MAX_PLAYERS][16] //We will use this variable to store player's ip.
;

native WP_Hash(buffer[], len, const str[]); //whirlpool, for hashing our password


//Now let's create an enumerator that holds player's information
enum PDATA //We name our enumerator as PDATA (which stands for PlayerDATA). You can name it however you want.
{
ID, //Will be used later to store player's ID from database so we can use it anywhere later
Password[129], //We will load player's password into this varible from database
Admin, //We will load player's admin level from database into this variable so we can use it anywhere later.
VIP, //We will load player's VIP level from database into this variable so we can use it anywhere later.
Money, //We will load player's money from database into this variable so we can use it anywhere later.
FloatosX, //We will load player's X position from database into this variable so we can use it anywhere later.
FloatosY, //We will load player's Y position from database into this variable so we can use it anywhere later.
FloatosZ //We will load player's Z from database into this variable so we can use it anywhere later.

}
new pInfo[MAX_PLAYERS][PDATA]; //Variable that stores enumerator above


public OnGameModeInit()
{
mysql_log(LOG_ERROR | LOG_WARNING | LOG_DEBUG); //Let's enable debugging so we can detect a problem(if there is)
mysql = mysql_connect(host, user, db, pass); //This function will connect your server to database. Remember we have defined our host, username, database and password. It's time to use it here.
if(mysql_errno(mysql) != 0) print("Could not connect to database!"); //This will tell if your connection to database is successful or not. If it's not, check your host, username, database and password. Make sure they all right.
return 1;
}


//Checking player's account if they are registered or not.
public OnPlayerConnect(playerid)
{
new query[128]; //We use this variable to format our query
GetPlayerName(playerid, Name[playerid], 24); //Getting player's name
GetPlayerIp(playerid, IP[playerid], 16); //Getting layer's IP
mysql_format(mysql, query, sizeof(query),"SELECT `Password`, `ID` FROM `players` WHERE `Username` = '%e' LIMIT 1", Name[playerid]);
// - We use mysql_format instead of format because we can use an %e specifier. %e specifier escapes a string so we can avoid sql injection which means we don't have to use mysql_real_escape_string
// - Formatting our query; SELECT `Password`, `ID` FROM `players` WHERE `Username`='%e' means we are selecting a Password and ID's column in the table that has player's name in Username column.
// - LIMIT 1; we only need 1 result to be shown
mysql_tquery(mysql, query, "OnAccountCheck", "i", playerid);
//lets execute the formatted query and when the execution is done, a callback OnAccountCheck will be called
//You can name the callback however you like

return 1;
}

//OnAccountCheck is a custom callback which means it has to be forwarded.
forward OnAccountCheck(playerid);

//Now once the query has been processed;
public OnAccountCheck(playerid)
{
new rows, fields; //a variable that will be used to retrieve rows and fields in the database.
cache_get_data(rows, fields, mysql);//let's get the rows and fields from the database.
if(rows) //if there is row
{//then
cache_get_field_content(0, "PASS", pInfo[playerid][Password], mysql, 129);
//we will load player's password into pInfo[playerid][Password] to be used in logging in
pInfo[playerid][ID] = cache_get_field_content_int(0, "ID"); //now let's load player's ID into pInfo[playerid][ID] so we can use it later
printf("%s", pInfo[playerid][Password]); //OPTIONAL: Just for debugging. If it didn't show your password, then there must be something wrong while getting player's password
ShowPlayerDialog(playerid, dlogin, DIALOG_STYLE_INPUT, "Login", "In order to play, you need to login", "Login", "Quit"); //And since we found a result from the database, which means, there is an account; we will show a login dialog
}
else //if we didn't find any rows from the database, that means, no accounts were found
{
ShowPlayerDialog(playerid, dregister, DIALOG_STYLE_INPUT, "Register", "In order to play, you need to register.", "Register", "Quit");
//So we show them a dialog register
}
return 1;
}



//Now let's response to the login and register dialog
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case dlogin: //login dialog
{
if(!response) Kick(playerid); //if they clicked Quit, we will kick them
new hpass[129]; //for password hashing
new query[100]; // for formatting our query.
WP_Hash(hpass, 129, inputtext); //hashing inputtext
if(!strcmp(hpass, pInfo[playerid][Password])) //remember we have loaded player's password into this variable, pInfo[playerid][Password] earlier. Now let's use it to compare the hashed password with password that we load
{ //if the hashed password matches with the loaded password from database
mysql_format(mysql, query, sizeof(query), "SELECT * FROM `players` WHERE `Username` = '%e' LIMIT 1", Name[playerid]);
//let's format our query
//We select all rows in the table that has your name and limit the result to 1
mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid);
//lets execute the formatted query and when the execution is done, a callback OnAccountLoad will be called
//You can name the callback however you like
}
else //if the hashed password didn't match with the loaded password(pInfo[playerid][Password])
{
//we tell them that they have inserted a wrong password
ShowPlayerDialog(playerid, dlogin, DIALOG_STYLE_INPUT, "Login", "In order to play, you need to login\nWrong password!", "Login", "Quit");
}
}
case dregister: //register dialog
{
if(!response) return Kick(playerid); //if they clicked Quit, we will kick them
if(strlen(inputtext) < 6) return ShowPlayerDialog(playerid, dregister, DIALOG_STYLE_INPUT, "Register", "In order to play, you need to register.\nYour password must be at least 6 characters long!", "Register", "Quit");
//strlen checks a lenght of a string. so if player types their password that is lower than 6, we tell them; Your password must be at least 6 characters long!
new query[300];
WP_Hash(pInfo[playerid][Password], 129, inputtext); //hashing inputtext
mysql_format(mysql, query, sizeof(query), "INSERT INTO `players` (`Username`, `Password`, `IP`, `Admin`, `VIP`, `Money`, `PosX` ,`PosY`, `PosZ`) VALUES ('%e', '%s', '%s', 0, 0, 0, 0.0, 0.0, 0.0)", Name[playerid], pInfo[playerid][Password], IP[playerid]);
//Now let's create a new row and insert player's information in it
mysql_tquery(mysql, query, "OnAccountRegister", "i", playerid);
//let's execute the query
}
}
return 1;
}


forward OnAccountLoad(playerid);
forward OnAccountRegister(playerid);
//let's load player's information
public OnAccountLoad(playerid)
{
pInfo[playerid][Admin] = cache_get_field_content_int(0, "Admin"); //we're getting a field 4 from row 0. And since it's an integer, we use cache_get_row_int
pInfo[playerid][VIP] = cache_get_field_content_int(0, "VIP"); //Above
pInfo[playerid][Money] = cache_get_field_content_int(0, "Money");//Above
pInfo[playerid][posX] = cache_get_field_content_float(0, "PosX");//Above. Since player's position is a float, we use cache_get_field_content_float
pInfo[playerid][posY] = cache_get_field_content_float(0, "PosY");//Above
pInfo[playerid][posZ] = cache_get_field_content_float(0, "PosZ");//Above

GivePlayerMoney(playerid, pInfo[playerid][Money]);//Let's set their money
//For player's position, set it once they spawn(OnPlayerSpawn)
SendClientMessage(playerid, -1, "Successfully logged in"); //tell them that they have successfully logged in
return 1;
}

public OnAccountRegister(playerid)
{
pInfo[playerid][ID] = cache_insert_id(); //loads the ID of the player in the variable once they registered.
printf("New account registered. ID: %d", pInfo[playerid][ID]); //just for debugging.
return 1;
}



public OnPlayerDisconnect(playerid, reason)
{
new query[128], Floatos[3]; //query[128] is for formatting our query and Floatos[3] is for getting and saving player's position
GetPlayerPos(playerid, pos[0], pos[1], pos[2]); //let's get player's position when they leave your server
mysql_format(mysql, query, sizeof(query), "UPDATE `players` SET `Admin`=%d, `VIP`=%d, `Money`=%d, `posX`=%f, `posY`=%f, `posZ`=%f WHERE `ID`=%d",\
pInfo[playerid][Admin], pInfo[playerid][VIP], pInfo[playerid][Money], pos[0], pos[1], pos[2], pInfo[playerid][ID]);
//We update the table(`players`) by getting player's admin level, vip level, money, and positions and save them in the database
mysql_tquery(mysql, query, "", "");
//let's execute the query.
return 1;
}



public OnPlayerSpawn(playerid)
{
SetPlayerPos(playerid, pInfo[playerid][posX], pInfo[playerid][posZ], pInfo[playerid][posZ]);
//Set player's position to the last saved position.
return 1;
}


can u tell me whats the error i made
Reply
#69

for the love of fucking god, put them in [ php ] tags or [ code ] tags.
Reply
#70

when i edited this coding it crashes ........
Reply
#71

It say:

PHP Code:
[18:28:39]   Loaded.
[
18:28:39]  Loading pluginnativechecker
[18:28:39]   Loaded.
[
18:28:39]  Loading pluginWhirlpool
[18:28:39]  
[
18:28:39]  ==================
[
18:28:39]  
[
18:28:39]   Whirlpool loaded
[18:28:39]  
[
18:28:39]  ==================
[
18:28:39]  
[
18:28:39]   Loaded.
[
18:28:39]  Loading pluginmysql
[18:28:39]  >> plugin.mysqlR39-3 successfully loaded.
[
18:28:39]   Loaded.
[
18:28:39]  Loaded 6 plugins.
[
18:28:39
[
18:28:39Filterscripts
[18:28:39] ---------------
[
18:28:39]   Loaded 0 filterscripts.
[
18:28:39]    Error: Function not registered'mysql_log'
[18:28:39]    Error: Function not registered'mysql_connect'
[18:28:39]    Error: Function not registered'mysql_errno'
[18:28:39]    Error: Function not registered'mysql_format'
[18:28:39]    Error: Function not registered'mysql_tquery'
[18:28:39]    Error: Function not registered'cache_get_data'
[18:28:39]    Error: Function not registered'cache_get_field_content'
[18:28:39]    Error: Function not registered'cache_get_field_content_int'
[18:28:39]    Error: Function not registered'WP_Hash'
[18:28:39]    Error: Function not registered'cache_get_field_content_float'
[18:28:39]    Error: Function not registered'cache_insert_id'
[18:28:39Serverconnessione al database effettuata con successo.
[
18:28:39Gamemode avviata
Why? I have plugin istalled and i put "mysql" in server.cfg too and I have include.
Reply
#72

@DarkLouis: Add nativechecker plugin last to get rid of the errors.
Reply
#73

Thank you Konstantinos
Reply
#74

FIXED
Reply
#75

A little problem, change:

cache_get_field_content(0, "PASS", PlayerInfo[playerid][Password], mysql, 129);

with:

cache_get_field_content(0, "Password", PlayerInfo[playerid][Password], mysql, 129);
Reply
#76

Is this up to date or what is used these days?
Reply
#77

Nice Tutorial I Learn This Script

Thanks Every One
Reply
#78

Thanks for this tutorial, it helped me a lot.
Reply
#79

doesn't show the dialogs
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)