Wysłany: 2016-12-29, 22:26
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Wyt?umaczy kto? na danej wersji pluginu MySQL jak zrobi? prost? rejestracj??
Co znajd? tutorial, to zawsze jest pod inn? wersj?. O co prosz??
1) Sprawdzenie, czy konto istnieje, je?li nie to rejestracja -> stworzenie trzech r??nych przyk?ad?w: varchar(string), int i float, czyli np. nick, pieni?dze i ?ycie.
2) Je?li konto istnieje, to pobierze te trzy r??ne przyk?ady.
3) Zapisywanie statystyk.
Wysłany: 2016-12-30, 11:26
Combacior
Wiek: 29 Na forum: 5795 dni Posty: 1516
Piwa : 2161
Najprostszy do ogarni?cia jest plugin StrickenKid'a, sam z niego korzystam. Najpierw sobie stw?rz tabel?, kt?ra b?dzie przechowywa? dane graczy, np. accountData.
Kod: CREATE TABLE IF NOT EXISTS `accountData`
(
`nick` varchar(24),
`cash` int,
`health` decimal(4,1)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Dlaczego u?y?em decimal zamiast float? W?a?ciwie przy takiej kolumnie jak ?ycie gracza nie powinno mie? to ?adnego wp?ywu, ale kiedy? czyta?em, ?e kolumna typu float lubi nieco przekr?ca? dane - oczywi?cie nie chodzi mi o jakie? warto?ci z nieba wzi?te, np. z warto?ci 47.5206797 mo?e wyj?? 47.5206795, wi?c je?li potrzebujesz bardzo dok?adnych danych, to zalecam u?ywanie decimal. Teraz zapytanie do pobrania danych gracza.
Kod: new s[100], n[24 + 1], cash, Float:health;
GetPlayerName(playerid, n, sizeof n);
format(s, sizeof s, "SELECT cash, health FROM accountData WHERE nick = '%s' LIMIT 1", n);
//nie bedziemy pobierac nicku, bo przeciez jest nam znany
//na koncu LIMIT 1, wystarczy nam tylko jeden rekord z danym nickiem gracza.
mysql_query(s);
mysql_store_result(); //funkcja potrzebna przy uzyciu kwerendy SELECT
if(mysql_num_rows() == 1) //pobieramy ilosc rekordow z bazy
{
//znalazlo jeden rekord, bo dalismy LIMIT 1 w zapytaniu, konto istnieje
mysql_fetch_row(s, " "); //funkcja rozdziela dane z rekordu do tablicy, czyli cash i health
sscanf(s, "if", cash, health); //przydzielenie pobranych wartosci do zmiennych
}
else
{
//konto nie istnieje, rejestracja
}
mysql_free_result(); //oprozniamy pamiec zapytania, bo go juz nie potrzebujemy
Rejestracj? zr?b sobie sam, skoro ju? wiesz kiedy konto jest zarejestrowane a kiedy nie. Zreszt? mo?esz pobra? m?j stary skrypt uG i zobaczy? jak tam to jest zrobione, bo te? korzysta?em z tego pluginu i nadal z niego korzystam.
Wysłany: 2017-01-02, 21:44
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Jak mam sporo danych do zapisania/wczytania, to jak to najpro?ciej zapisa? tym sscanfem, ?eby nie wywali?o b??du za zbyt d?ug? linijk??
Jak zapisa? przyk?adowe dane?
PS nie pobra?em Twojego skryptu, bo google go blokuje
Wysłany: 2017-01-02, 22:11
Combacior
Wiek: 29 Na forum: 5795 dni Posty: 1516
Piwa : 2161
Sscanf jest pomocny przy pobieraniu danych, za? przy zapisywaniu nie da si? go w ?aden spos?b wykorzysta?. Je?li linijka jest za d?uga, to format zapytania mo?esz sobie przenie?? do nast?pnej linijki za pomoc? backslash'a
Kod: format(s, sizeof s, "UPDATE tabela SET \
cos1 = %d \
cos2 = %d",
1,
2);
To mo?esz stosowa? zawsze, ale je?li format nie jest d?ugi, a d?ugie s? nazwy parametr?w, to wystarczy, ?e b?dziesz przenosi? do nowej linijki same parametry, a format zostawi? w jednej.
Kod: format(s, sizeof s, "UPDATE tabela SET cos1 = %d cos2 = %d",
1,
2);
Tak dzia?a nie tylko format, ale wszystkie funkcje.
Wysłany: 2017-01-03, 16:16
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Masz aktualn? paczk? tego pluginu? Linki na forum sampa pad?y.
Btw jak zapisa? przyk?adowe dane po wyj?ciu gracza z serwera?
Wysłany: 2017-01-03, 22:17
WWilk1
Wiek: 30 Na forum: 4699 dni Posty: 116
Nick w MP: eep.Wilk
Piwa : 147
https://www.sendspace.com/file/kmsw3h w paczce jest wersja pod windows i linux.
Kilka przyk?ad?w zapisu
Pawn format ( String , 128 , "UPDATE `players` SET `Nick` = '%s', `Score` = '%d', `Pos` = '%f', `Date` = '%04d-%02d-%02d' WHERE `Nick` = '%s' LIMIT 1" , Nick [ playerid ], Punkty , PosX , Year , Month , Day , Nick [ playerid ]);
mysql_query (String);
Polecam korzysta? z sprawdzenia po uID jest optymalniejszym sposobem ni? sprawdzenie po nicku
Pawn format ( String , 128 , "UPDATE `players` SET `Nick` = '%s', `Score` = '%d', `Pos` = '%f', `Date` = '%04d-%02d-%02d' WHERE `ID` = '%d' LIMIT 1" , Nick [ playerid ], Punkty , PosX , Year , Month , Day , uID [ playerid ]);
mysql_query (String);
format ( String , 94 , "UPDATE `players` SET `Vday` = `Vday` - 1 WHERE `ID` = '%d' LIMIT 1" , uID [ playerid ]);
mysql_query (String);
format ( String , 94 , "UPDATE `players` SET `Kills` = `Kills` + 1 WHERE `ID` = '%d' LIMIT 1" , uID [ playerid ]);
mysql_query (String);
format ( String , 102 , "UPDATE `players` SET `Bank` = `Bank` +%d WHERE `ID` = '%d' LIMIT 1" , BankCash , uID [ playerid ]);
mysql_query (String);
format ( String , 102 , "UPDATE `players` SET `Bank` = `Bank` -%d WHERE `ID` = '%d' LIMIT 1" , BankCash , uID [ playerid ]);
mysql_query (String);
Wysłany: 2017-01-04, 18:25
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Dlaczego przypisuj?c Email do inputtext, nie zapisuje si? on w bazie?
Jest jako puste pole.
Kod: pGracz[playerid][Email] = strval(inputtext);
Pawn new Query [ 500 ];
format ( Query , sizeof ( Query ), "INSERT INTO Gracze (`Nick`, `Haslo`, `Email`, `IP`, `Pieniadze`, `PunktyScore`, `Skin`, `PunktyKarne`, `Zlecen`, `Kanister`, `Kajdanki`, `Mute`, `MuteTime`, `Jail`, `JailTime`, `Blokada`, `CzasBlokady`, `AdminLVL`, `Police`, `PierwszaGra`, `X_Pos`, `Y_Pos`, `Z_Pos`, `A_Pos`) VALUES('%s', MD5('%s'), '%s', '%s', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)" , PlayerName ( playerid ), pGracz [ playerid ][ Haslo ], pGracz [ playerid ][ Email ], pGracz [ playerid ][ IP ]);
mysql_query ( Query );
Dodam tylko, ?e podobnie zapisuj? has?o i IP i one si? dobrze zaspisa?y, ale email nie.
2) Jak pobiera? dane z bazy do konta gracza?
Zrobi?em co? takiego, ale ta funkcja chyba za to nie odpowiada.
Pawn while( mysql_fetch_row ( mstring , "|" ))
{
mysql_fetch_row ( savingstring , "Haslo" ); pGracz [ playerid ][ Haslo ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Email" ); pGracz [ playerid ][ Email ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "IP" ); pGracz [ playerid ][ IP ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Pieniadze" ); pGracz [ playerid ][ Pieniadze ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "PunktyScore" ); pGracz [ playerid ][ PunktyScore ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Skin" ); pGracz [ playerid ][ Skin ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "PunktyKarne" ); pGracz [ playerid ][ PunktyKarne ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Zlecen" ); pGracz [ playerid ][ Zlecen ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Kanister" ); pGracz [ playerid ][ Kanister ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Kajdanki" ); pGracz [ playerid ][ Kajdanki ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Mute" ); pGracz [ playerid ][ Mute ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "MuteTime" ); pGracz [ playerid ][ MuteTime ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Jail" ); pGracz [ playerid ][ Jail ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "JailTime" ); pGracz [ playerid ][ JailTime ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Blokada" ); pGracz [ playerid ][ Blokada ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "CzasBlokady" ); pGracz [ playerid ][ CzasBlokady ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "AdminLVL" ); pGracz [ playerid ][ AdminLVL ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Police" ); pGracz [ playerid ][ Police ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "PierwszaGra" ); pGracz [ playerid ][ PierwszaGra ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "X_Pos" ); pGracz [ playerid ][ X_Pos ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Y_Pos" ); pGracz [ playerid ][ Y_Pos ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "Z_Pos" ); pGracz [ playerid ][ Z_Pos ] = strval ( savingstring );
mysql_fetch_row ( savingstring , "A_Pos" ); pGracz [ playerid ][ A_Pos ] = strval ( savingstring );
}
Wysłany: 2017-01-04, 18:54
Wafelowski
Wiek: 29 Na forum: 5347 dni Posty: 428
Piwa : 100
1. Strval - funkcja kt?ra zamienia string (tekst) na integer (liczba ca?kowita) https://wiki.sa-mp.com/wiki/Strval
Kod: format(pGracz[playerid][Email], 32, "%s", inputtext);
2. Co do drugiego to nie wiem po co ta p?tla while, wystarczy sprawdzi? poprzez warunek czy s? jakie? rekordy i wtedy rozdzielasz pola poprzez mysql_fetch_row() i przez sscanf'a przypisujesz pola do zmiennych.
Pawn
if( mysql_num_rows ())
{
if( mysql_fetch_row ( mstring , "|" ))
{
sscanf ( mstring , "s[32]s[32]s[16]" , pGracz [ playerid ][ Haslo ], pGracz [ playerid ][ Email ], pGracz [ playerid ][ IP ], ...);
}
}
Wysłany: 2017-01-04, 19:09
WWilk1
Wiek: 30 Na forum: 4699 dni Posty: 116
Nick w MP: eep.Wilk
Piwa : 147
Dodam jeszcze od siebie, ?e te 0 nie musisz wpisywa? w zapytaniu, wystarczy ?e w phpmyadmin w strukturze wybierzesz dane pole po czym edytuj nast?pnie "zdefiniuj nast?puj?co" i wpisujesz 0.
P??niej na ko?cu zapytania dodajesz tylko ?rednik np.
INSERT INTO `Players` (`Pass`, `Skin`) VALUES('%s', '%d');
Przyk?adowy odczyt:
Pawn new AntiSQLInjection [ 18 ];
mysql_real_escape_string ( inputtext , AntiSQLInjection );
format ( String , 128 , "SELECT `ID`, `Email`, `Money`, `xPos` FROM `players` WHERE `Nick` = '%s' AND `Pass` = '%s' LIMIT 1" , PlayerName ( playerid ), AntiSQLInjection );
mysql_query (String);
mysql_store_result ();
if(! mysql_num_rows ())
{
//Nie znaleziono konta lub b??dne has?o wpisa?
mysql_free_result ();
return 1 ;
}
mysql_fetch_row ( String , "|" );
sscanf ( String , "p<|>is[18]if" , pPlayer [ playerid ][ UID ], pPlayer [ playerid ][ Email ], pPlayer [ playerid ][ Money ], pPlayer [ playerid ][ X_Pos ]);
mysql_free_result ();
Zapisywanie tylu rzeczy w jednym momencie to z?o dla serwera(mo?e spowodowa? lag) nie poleca?bym Ci tego typu rzeczy stosowa?.
Wysłany: 2017-01-04, 19:13
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Czyli taki spos?b jak poda? Combacior, ok dzi?ki.
Kolejne pytania:
1) Czym mo?e by? spowodowany b??d w konsoli:
Kod: [MySQL] Error (0): Failed to exeute query. 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 'WHERE `Nick` = 'Nick' LIMIT 1' at line 1.
2) Jak sprawdzi?, czy has?o jest wpisane z?e, bo ten spos?b nie dzia?a:
Kod: if(!strcmp(inputtext, pGracz[playerid][Haslo]))
3) Dlaczego nie pobiera danych z bazy, np. pozycji by teleportowa? do niej gracza, skoro przydzielamy te warto?ci sscanfem?
4) Dlaczego pokazuje w Mode: Unknown , mimo, ?e gamemode dzia?a?
Wysłany: 2017-01-04, 19:17
WWilk1
Wiek: 30 Na forum: 4699 dni Posty: 116
Nick w MP: eep.Wilk
Piwa : 147
Pierwsze to gdzie? mog?e? zgubi? ` lub ' wyprintuj sobie zapytania, kt?re wykonujesz do bazy danych.
Drugie masz odpowied? powy?ej.
Trzecie poka? w jaki spos?b pobierasz.
Czwarte poka? logi.
Wysłany: 2017-01-04, 19:39
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
1) Czyli te zera usun?? i zapisa? w taki spos?b:
Pawn new Query [ 1000 ];
format ( Query , sizeof ( Query ), "INSERT INTO `Gracze` (`Nick`, `Haslo`, `Email`, `IP` `Pieniadze`, `PunktyScore`, `Skin`, `PunktyKarne`, `Zlecen`, `Kanister`, `Kajdanki`, `Mute`, `MuteTime`, `Jail`, `JailTime`, `Blokada`, `CzasBlokady`, `AdminLVL`, `Police`, `PierwszaGra`, `X_Pos`, `Y_Pos`, `Z_Pos`, `A_Pos`) VALUES('%s', MD5('%s'), '%s', '%s')" , PlayerName ( playerid ), pGracz [ playerid ][ Haslo ], pGracz [ playerid ][ Email ], pGracz [ playerid ][ IP ]);
mysql_query ( Query );
2) Error pokazuje si? dwa razy. W kodzie:
Pawn new Query [ 1000 ];
format ( Query , sizeof ( Query ), "INSERT INTO `Gracze` (`Nick`, `Haslo`, `Email`, `IP` `Pieniadze`, `PunktyScore`, `Skin`, `PunktyKarne`, `Zlecen`, `Kanister`, `Kajdanki`, `Mute`, `MuteTime`, `Jail`, `JailTime`, `Blokada`, `CzasBlokady`, `AdminLVL`, `Police`, `PierwszaGra`, `X_Pos`, `Y_Pos`, `Z_Pos`, `A_Pos`) VALUES('%s', MD5('%s'), '%s', '%s', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)" , PlayerName ( playerid ), pGracz [ playerid ][ Haslo ], pGracz [ playerid ][ Email ], pGracz [ playerid ][ IP ]);
mysql_query ( Query );
oraz
3) Jak pobra? te dane z bazy?
4) Unknown mode: logi
Wysłany: 2017-01-04, 19:43
Wafelowski
Wiek: 29 Na forum: 5347 dni Posty: 428
Piwa : 100
Brakuje jednego przecinka.
Kod: format(Query, sizeof(Query), "INSERT INTO `Gracze` (`Nick`, `Haslo`, `Email`, `IP`, `Pieniadze`, `PunktyScore`, `Skin`, `PunktyKarne`, `Zlecen`, `Kanister`, `Kajdanki`, `Mute`, `MuteTime`, `Jail`, `JailTime`, `Blokada`, `CzasBlokady`, `AdminLVL`, `Police`, `PierwszaGra`, `X_Pos`, `Y_Pos`, `Z_Pos`, `A_Pos`) VALUES('%s', MD5('%s'), '%s', '%s')", PlayerName(playerid), pGracz[playerid][Haslo], pGracz[playerid][Email], pGracz[playerid][IP]);
Tam po IP, a w drugim to przed WHERE
Kod:
new string[1000];
format(string, sizeof(string), "UPDATE `Gracze` SET `Nick` = '%s', `Haslo` = '%s', `Email` = '%s' WHERE `Nick` = '%s' LIMIT 1", PlayerName(playerid), pGracz[playerid][Haslo], pGracz[playerid][Email], PlayerName(playerid));
print("1");
mysql_query(string);
print("2");
Ja si? jaki? czas temu przesiad?em na plugin od BlueG, fajnie bo jest aktualizowany ca?y czas i lepiej rozbudowany. Polecam orm-y.
Jeszcze co do has?a, to polecam SHA256 tak na przysz?o??, co by si? uchroni?.
Wysłany: 2017-01-04, 19:56
MG303
Wiek: 30 Na forum: 6418 dni Posty: 654
Piwa : 2990
Tak tak, has?o b?dzie szyfrowane, lecz na pocz?tku wol? si? upewni? czy wszystko krok po kroku dzia?a.
OK, b??dy z mysql znikn??y. Lecz jak teraz pobra? dane z bazy na konto gracza? My?la?em, ?e ten sscanf przydzieli odpowiednie dane z rekord?w do tablic, ale niestety nie.
I nie mam poj?cia co z tym Unknown.
Wysłany: 2017-01-04, 20:16
Wafelowski
Wiek: 29 Na forum: 5347 dni Posty: 428
Piwa : 100
Jak masz sscanfa, to musisz jeszcze w nim okre?li? w jaki spos?b pola s? rozdzielone,
Pawn
if( mysql_num_rows ())
{
mysql_fetch_row ( mstring , "|" );
mysql_free_result ();
sscanf ( mstring , "p<|>s[32]s[32]s[16]" , pGracz [ playerid ][ Haslo ], pGracz [ playerid ][ Email ], pGracz [ playerid ][ IP ], ...);
}
A o co chodzi z unknown bo nic nie widz? w logach? Je?eli chodzi o Mode na SAMP-ie to chodzi o to ?e w gamemodzie nie poda?e? ?adnej nazwy i ustawia domy?ln?, aby to zmieni? wystarczy skorzysta? z funkcji (do OnGameModeInit)
Kod: SetGameModeText("Nazwa GM");
Tagi: rejestracja :: mysql
Anonymous
Na forum: 245 dni
Posty: 1
Anonymous Koniecznie zajrzyj na: