Jump to content

Intrebare MySQL.


BRAGA03

Recommended Posts

Salut! Am si eu o intrebare. Am facut o baza de date mysql dupa un tutorial pentru ca eu nu prea ma prind cum sta treaba, nu inteleg engleza foarte bine si tutoriale in romana, nu sunt. Deci, intru pe server, scriu parola, i dau admim, alea, alea, ies, si daca intru din nou, e ca si cum nu as fi intrat niciodata. Intru pe localhost, e din cauza asta?  

Link to comment
Share on other sites

Sunt mai multe variante:

  1. Posibil ca conectarea serverului de samp cu serverul mysql sa nu fie facuta corect.
  2. Posibil ca functia sau query care-l folosesti sa nu functioneze corect si sa nu introduca datele in tabel.
  3. Posibil sa fie problema la scriptul care verifica daca este cont inregistrat pe acel nume.

Si cred ca mai sunt si altele, trebuie sa verifici toate aceste lucruri sua pune-le aici sa ne uitam peste coduri. 

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

4 minutes ago, BRAGA03 said:

O sa pun totul aici mai tarziu. Nu sunt acasa acum.

 

EDIT: Deci zici ca nu are nici o treaba ca ma loghez de pe localhost? Se salveaza datele si pe localhost?

daca ai serverul mysql instalat corect pe localhost trebuie sa functioneze.

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

Deci.

Aici este structura tabelului:

Structura de tabel pentru tabelul `accounts`
--

DROP TABLE IF EXISTS `accounts`;
CREATE TABLE IF NOT EXISTS `accounts` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(24) NOT NULL,
  `Password` varchar(129) NOT NULL,
  `IP` varchar(16) NOT NULL,
  `Skin` int(11) NOT NULL,
  `Admin` int(10) NOT NULL,
  `Helper` int(11) NOT NULL,
  `Premium` int(10) NOT NULL,
  `Money` int(10) NOT NULL,
  `BankMoney` int(11) NOT NULL,
  `Group` int(11) NOT NULL,
  `Rank` int(11) NOT NULL,
  `Leader` int(11) NOT NULL,
  `PosX` float NOT NULL,
  `PosY` float NOT NULL,
  `PosZ` float NOT NULL,
  `PosA` float NOT NULL,
  `Job` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Bun.

Acum sa va arat tot ce este legat de MySQL in gamemode.

 

#define    			MYSQL_HOST        					"localhost"
#define    			MYSQL_USER        					"-----"
#define   		 	MYSQL_DATABASE    					"-----"
#define    			MYSQL_PASSWORD    					"-----"
#define 			SPAWN_X 							1128.8790
#define 			SPAWN_Y 							-1489.7399
#define 			SPAWN_Z 							-1489.7399
#define 			SPAWN_A 							267.2968

SPAWN_X, SPAWN_Y, SPAWN_Z si SPAWN_A sunt pozitiile la care playerul este spawnat prima data.

Mai departe:

enum PlayerData
{
	ID,
	Name[MAX_PLAYER_NAME],
	Password[129],
	IP[16],
	Skin,
	Admin,
	Helper,
	Premium,
	Money,
	BankMoney,
	Group,
	Rank,
	Leader,
	Float:posX,
	Float:posY,
	Float:posZ,
	Float:posA,
	Job,
	Muted,
	MutedT,
	PhoneNumber,
	PhoneCredit,
	PhoneBook
};

Acesta este enum-ul meu. Nu am inca toate cele necesare in el, sunt inca la inceput.

		forward OnAccountLoad(playerid);
		forward OnAccountRegister(playerid);
		forward OnAccountCheck(playerid);

 

public OnAccountLoad(playerid)
{
    PlayerInfo[playerid][Admin] = cache_get_field_content_int(0, "Admin");
    PlayerInfo[playerid][Helper] = cache_get_field_content_int(0, "Helper");
	PlayerInfo[playerid][Premium] = cache_get_field_content_int(0, "Premium");
    PlayerInfo[playerid][Money] = cache_get_field_content_int(0, "Money");
    PlayerInfo[playerid][BankMoney] = cache_get_field_content_int(0, "BankMoney");
    PlayerInfo[playerid][Skin] = cache_get_field_content_int(0, "Skin");
	PlayerInfo[playerid][posX] = cache_get_field_content_float(0, "PosX");
    PlayerInfo[playerid][posY] = cache_get_field_content_float(0, "PosY");
    PlayerInfo[playerid][posZ] = cache_get_field_content_float(0, "PosZ");
    PlayerInfo[playerid][posA] = cache_get_field_content_float(0, "PosA");
    PlayerInfo[playerid][Job] = cache_get_field_content_int(0, "Job");
    PlayerInfo[playerid][Group] = cache_get_field_content_int(0, "Group");
    PlayerInfo[playerid][Rank] = cache_get_field_content_int(0, "Rank");
    PlayerInfo[playerid][Leader] = cache_get_field_content_int(0, "Leader");
	PlayerInfo[playerid][PhoneNumber] = cache_get_field_content_int(0, "Phone Number");

	TogglePlayerSpectating(playerid, false);
    GivePlayerMoney(playerid, PlayerInfo[playerid][Money]);
    SetSpawnInfo(playerid, 0, 23, PlayerInfo[playerid][posX], PlayerInfo[playerid][posY], PlayerInfo[playerid][posZ], PlayerInfo[playerid][posA], 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    gLogged[playerid] = 1;
    SendClientMessage(playerid, -1, "You have successfully logged in.");
    return true;
}
public OnAccountRegister(playerid)
{
    PlayerInfo[playerid][ID] = cache_insert_id();
    printf("[Registration] New account registered. Database ID: [%d]", PlayerInfo[playerid][ID]);
    TogglePlayerSpectating(playerid, false);
    SetSpawnInfo(playerid, 0, 23, SPAWN_X, SPAWN_Y, SPAWN_Z, SPAWN_A, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    gLogged[playerid] = 1;
    return true;
}
public OnAccountCheck(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields, mysql);
    if(rows)
    {
        cache_get_field_content(0, "Password", PlayerInfo[playerid][Password], mysql, 129);
        PlayerInfo[playerid][ID] = cache_get_field_content_int(0, "ID");
        ShowPlayerDialog(playerid, LoginDialog, DIALOG_STYLE_INPUT, "Login", "Welcome player!\nYour account has been found in our database. \nPlease fill in your password:", "Login", "Quit");
    }
    else
    {
        ShowPlayerDialog(playerid, RegisterDialog, DIALOG_STYLE_INPUT, "Register", "Welcome player!\nYour account has not been registered yet. \nPlease fill in your desired password:", "Register", "Quit");
    }
    return true;
}

 

Sub OnGamemodeInit() am urmatoarele:

	mysql_log(LOG_ALL);
	mysql = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
	if(mysql_errno() != 0)
	{
	    printf("[MySQL] The connection has failed.");
	}
	else
	{
	    printf("[MySQL] The connection was successful.");
	}

Si imi arata de fiecare data in consola: "[MySQL] The connection was successful.", deci se conecteaza.

Mai departe:

Sub OnPlayerConnect am:

	new query[128], playername[MAX_PLAYER_NAME];
	GetPlayerName(playerid, playername, sizeof(playername));
    mysql_format(mysql, query, sizeof(query), "SELECT `Password`, `ID` FROM `accounts` WHERE `Name` = '%e' LIMIT 1", playername);
    mysql_tquery(mysql, query, "OnAccountCheck", "i", playerid);

 

Apoi am asta, in mai multe locuri, ca sa pot salva datele mai des:

	new query[128], Float:pos[4];
    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
    GetPlayerFacingAngle(playerid, pos[3]);
    mysql_format(mysql, query, sizeof(query), "UPDATE `accounts` SET `Group` = %d,`Rank` = %d, `Leader` = %d `Job` = %d, `Skin` = %d, `Money` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosA` = %f, `BankMoney` = %d  WHERE `ID` = %d",
    PlayerInfo[playerid][Group], PlayerInfo[playerid][Rank], PlayerInfo[playerid][Leader], PlayerInfo[playerid][Job], GetPlayerMoney(playerid), pos[0], pos[1], pos[2], pos[3], PlayerInfo[playerid][ID], PlayerInfo[playerid][BankMoney]);
    mysql_tquery(mysql, query, "", "");

 

Si am ajuns la OnDialogResponse:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case LoginDialog:
        {
            if(!response) Kick(playerid);
            new hashpass[129], query[100], playername[MAX_PLAYER_NAME];
            GetPlayerName(playerid, playername, sizeof(playername));
            WP_Hash(hashpass, sizeof(hashpass), inputtext);
            if(!strcmp(hashpass, PlayerInfo[playerid][Password]))
            {
                mysql_format(mysql, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%e' LIMIT 1", playername);
                mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid);
               	gLogged[playerid] = 1;
            }
            else
            {
                SendClientMessage(playerid, -1, "You have specified an incorrect password!");
                ShowPlayerDialog(playerid, LoginDialog, DIALOG_STYLE_INPUT, "Login", "Welcome back player!\nYour account has been found in our database. \nPlease fill in your password:", "Login", "Quit");
            }
        }
        case RegisterDialog:
        {
            if(!response) return Kick(playerid);
            if(strlen(inputtext) < 5)
            {
                SendClientMessage(playerid, -1, "Your password must at least contain more than 4 characters.\nPlease introduct a new one:");
                return ShowPlayerDialog(playerid, RegisterDialog, DIALOG_STYLE_INPUT, "Register", "Welcome player!\nYour account has not been registered yet. \nPlease fill in your desired password:", "Register", "Quit");
            }
			else if(response)
			{
				new query[512], playername[MAX_PLAYER_NAME], playerip[16];
	            GetPlayerName(playerid, playername, sizeof(playername));
	            GetPlayerIp(playerid, playerip, sizeof(playerip));
	            WP_Hash(PlayerInfo[playerid][Password], 129, inputtext);
	            mysql_format(mysql, query, sizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `PosX`, `PosY`, `PosZ`, `PosA`) VALUES ('%e', '%e', '%e', 0, 0, 0, %f, %f, %f, %f)", playername, PlayerInfo[playerid][Password], playerip, SPAWN_X, SPAWN_Y, SPAWN_Z, SPAWN_A);
	            mysql_tquery(mysql, query, "OnAccountRegister", "i", playerid);
            	gLogged[playerid] = 1;
			}
		}

 

Asta e tot. Am unsistem de login/register foarte simplu, vreau sa adaug mai multe lucruri dupa ce o sa invat mai bine mysql, momentan am doar esentialul. Dar pana nu rezolv problema asta nu ma pot apuca de nimic. Asa ca, va rog foarte mult sa ma ajutati. 

 

EDIT: Am uitat sa va spun ceva. Vedeti ca am variabila aia cu gLogged[playerid] la OnAccountRegister. Pai eu am aproape la fiecare comanda if(gLogged[playerid] == 0) return SendClientMessage(...). Comenzile merg, deci in colcuzie, alea se executa.

 

Edited by BRAGA03
Link to comment
Share on other sites

Structura tabelului unde o ai plasata ?

DROP TABLE IF EXISTS `accounts`; // aceasta sintaxa iti sterge tabelul daca exista, deci nu-i vad rostul aici. Aceasta structura ar trebui plasata in callback-ul OnGameModeInit

Unde ai:  #define                MYSQL_DATABASE si toate cele trebuie trecute datale intrre ghilimele.

#define MYSQL_DATABASE "numele bazei"

#define MYSQL_USER "root" sau daca ai un user creat pui numele acela

#define MYSQL_PASSWORD "parola" daca nu ai o parola setata lasidoar ghilimelele.

#define MYSQL_HOST "localhost"

Astea ar fi cateva lucruri pe care le-am vazut asa in mare, rezovale si vezi daca se schimba situatia.

Si dupa cum ai facut pentru inregistrea, conectarea jucatorului pe server functii trebuie facut si pentru salvarea datelor in baza pentru jucator tot o functie care sa faca asta. E mult mai practic si eficient.

Mai e inca o chestie de care te poti folosi mysql.log in gasesti in folderul unde ai fisierele server-ului.

Edited by Jamal Alin

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

Este

DROP TABLE IF EXISTS `accounts`;
 

Apoi

CREATE TABLE IF NOT EXISTS `accounts` 

 

Deci asta nu are legatura.

Apoi cu functia pentru salvarea datelor. Ai dreptate, ar fi mai simplu ada cum ai zis tu, dar ar trebui sa functioneze si asa.

Alea la #define sunt intre ghilimele.

Singurul lucru pe care nu l-am inteles, este faza cu punerea structurii tabelului in OnGamemodeInit. Eu am deshis fisierul .sql cu notepad si am luat de acolo structura tabelului.

 

EDIT: Nu merg alea cu OnAccountLoad si OnAccountRegister. Aveam puse alea cu "gLogged[playerid] = 1;" si la OnDialogResponse. Am scos de acolo, si am lasat doar la OnAccountLoad si OnAccountRegister, si cand incerc sa scriu o comanda, imi da avertizare ca si cum nu as fi logat. Ma puteti ajuta?? Ce sa mai fac? Am incercat tot ce am stiut, va rog sa ma ajutati.

Edited by BRAGA03
Link to comment
Share on other sites

MySQL log:

http://pastebin.com/PaYe9746   nu l-am pus pe tot.

Si tabelul:

http://imgur.com/oAyao1C

Am vazut si eu eroarea acum in mysql_log, dar nu stiu ce trebuie sa fac ca sa rezolv.

EDIT: O eroare am rezolvat-o :D Trebuia query-ul mai mare. Acum MySQL_log arata asa:

http://pastebin.com/EyL82c9s

Aveam multe lucruri gresite, pe care nu le sesizasem. Acum doar un lucru nu pot rezolva, o eroare, si nu stiu la ce se refera. Acum nu imi apare exact asa, pentru ca am corectat tot pe acolo, dar in ptincipiu asta e:

[22:07:05] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`Job` = 0, `Skin` = 718506, `Money` = 1151214883, `PosX` = -1599.851, `PosY` = 1' at line 1

 

Ce e asta? Cum pot rezolva?

P.S: sunt iar pe drum, azi am avut o zi mai complicata, de aceea nu am putut mai sus sa postez eroarea exact cum imi apare acum, dar daca imi puteti spune la ce se refera, adica de ce apare, o sa o rezolv singur. Nu vreau "mura-in-gura". 

Edited by BRAGA03
Link to comment
Share on other sites

Omule pune datele mysql acolo intre ghilimele dupam cum ti-am spus. Cat despre structura tabelului credeam ca esteluad in gamemode codul, poti creaun tabel in baza de date direct din gamemode. Iar eroare respectiva este eroare de sintaxa (eroare de formulare), cred ca trebuie e elimini acele ` `. Problema ta este ca nu se face conectare la baza de date pentru ca nu ai datele necesari conectari scrie corect, cauta un tutorial ca sa vezi cum se face. Eu ti-am zis mai sus dar se pare ca n-ai inteles.

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

Scuze ca revin, dar imi mai apare o eroare in mysql_log si nu stiu cum sa o rezolv. La celelalte am gasit rezolvarea pe google, si asa am crezut ca o sa se intample si la asta, de aceea am zis ca am rezolvat, dar nu pot sa o rezolv.

(error #1364) Field 'Skin' doesn't have a default value

Cum pot sa o rezolv? 

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.