Zarejestruj Zapomniałeś hasła?
Rejestracja i logowanie
Dodany 17 sierpnia 2009, 15:04 Odsłon 6056
Edytory Ocena
 (9 głosów)
Kategoria Silnik Poziom (Dla średnio-zaawansowanych)
Postanowiłem wam pokazać w jaki sposób można zrobić rejestrację, a następnie logowanie do gry, przydatne w grach online. Sama logika aplikacji tworzona w mmfie nie jest trudna, trochę trudniejszy jest skrypt php, ale wytłumaczę wszystko;)

Najpierw zajmiemy się skryptem php i bazą danych.
Będzie wyglądała tak:
tabela Players napisał(a):

id - INT AUTO_INCREMENT NOT NULL
password - CHAR(40) NOT NULL
nick - VARCHAR(128) NOT NULL
level - INT NOT NULL

Jeśli masz dostęp do phpmyadmin'a wykonaj to polecenia MySQL
Cytat:
CREATE TABLE `players` ( `id` INT NOT NULL AUTO_INCREMENT , `nick` VARCHAR( 128 ) NOT NULL ,`password` CHAR(40) NOT NULL, `level` INT NOT NULL , PRIMARY KEY ( `id` ) ) ;

Jeśli chcesz np. pole "wynik" musisz jeszcze dodać po którymś przecinku "`wynik` INT NOT NULL,", a jeśli pole tekstowe opis "`opis` TEXT".

Jeśli jednak nie wgraj ten plik na serwer i uruchom(wcześniej oczywiście wpisz dane bazy;))
Cytat:
<?php
Define ('DB_HOST',''); //tutaj host
Define ('DB_PASSWORD',''); //tutaj haslo do bazy
Define ('DB_USER',''); //tutaj uzytkownik
Define ('DB_NAME',''); //tutaj nazwa bazy danych
$dbc=mysql_connect (DB_HOST,DB_USER,DB_PASSWORD);
mysql_select_db(DB_NAME, $dbc);
$q='CREATE TABLE `players` (`id` int NOT NULL AUTO_INCREMENT,`nick` varchar(128) NOT NULL,`password` char(40) NOT NULL,`level` INT NOT NULL)';
$r= mysql_query($q,$dbc);
if ($r){
echo 'Zainstalono pomyślnie!';
}else {
echo "Jakiś błąd ";
}
?>


Teraz czas na "serce" skryptu odpowiedzialne za rejestrowanie, logowanie i zapisywanie ustawień. Jeśli np. chcemy się zarejestrować z nickiem "Andy" i hasłem "hasło" musimy wysłać takie żądanie "http://www.strona.pl/index.php?act=reg&nick=andy&pass=haslo", jeśli natomiast zalogować "http://www.strona.pl/index.php?act=log&nick=andy&pass=haslo".

Cytat:
<?php
Define ('DB_HOST',''); //tutaj host
Define ('DB_PASSWORD',''); //tutaj haslo do bazy
Define ('DB_USER',''); //tutaj uzytkownik
Define ('DB_NAME',''); //tutaj nazwa bazy danych
$dbc=mysql_connect (DB_HOST,DB_USER,DB_PASSWORD);
mysql_select_db(DB_NAME, $dbc);
$co=$_GET['act'];
if ($co=='reg'){
$nick=addslashes(trim(mysql_real_escape_string($_GET['nick'])));
$pass=addslashes(trim(mysql_real_escape_string($_GET['pass'])));
$q="SELECT * FROM `players` WHERE nick='$nick'";
$r= mysql_query($q,$dbc);
$wiersze = mysql_num_rows($r);
if ($wiersze==0){
$q2="INSERT INTO `players` (`nick`, `password`, `level`) VALUES ('$nick', SHA1('$pass'),1)";
$r2= mysql_query($q2,$dbc);
if ($r2) {
echo 'ok';
}
}else {
echo 'blad';
}
}
if ($co=='log'){
$nick=addslashes(trim(mysql_real_escape_string($_GET['nick'])));
$pass=addslashes(trim(mysql_real_escape_string($_GET['pass'])));
$q="SELECT * FROM `players` WHERE nick='$nick' and password=SHA1('$pass')";
$r= mysql_query($q,$dbc);
if ($row = mysql_fetch_assoc( $r)) {
echo $row['level'];
}
echo '|||';
}
if ($co=='save'){
$nick=addslashes(trim(mysql_real_escape_string($_GET['nick'])));
$pass=addslashes(trim(mysql_real_escape_string($_GET['pass'])));
$lvl= addslashes(trim(mysql_real_escape_string($_GET['lvl'])));
$q="SELECT * FROM `players` WHERE nick='$nick' and password=SHA1('$pass')";
$r= mysql_query($q,$dbc);
while ($wynik = mysql_fetch_array($r, MYSQL_ASSOC))
{
$id=$wynik['id'];
$q2 = "UPDATE `players` SET `level` = '$lvl' WHERE `id`=$id";
$r2 = mysql_query($q2);
}

}


Podczas rejestracji wykonujemy zapytanie "SELECT * FROM `players` WHERE nick='$nick", aby sprawdzić, czy przypadkiem taki użytkownik nie istnieje. Jeśli nie istnieje(zapytanie zwraca 0 rekordów) dodajemy gracza - nick podany przy rejestracji, hasło szyfrowane funkcją SHA1 i level 1 - na takim zaczynamy.

Podczas logowania szukamy gracza o takim nicku i haśle, jeśli się uda zwracamy jego poziom. Po co dodajemy te trzy znaki "|||"? Ciężko będzie znaleźć serwer absolutnie bez reklam, a nie znamy długości wyniku(na początku ma 1 znak, ale potem np. 2 znaki), dlatego String Parser'em oddzielimy wynik od reklamy.

Gdy zapisujemy sprawdzamy, czy rzeczywiście jesteśmy tym użytkownikiem za którego się podajemy("SELECT * FROM `players` WHERE nick='$nick' and password=SHA1('$pass')"). Jeśli tak jest po prostu aktualizujemy poziom.
---
To tyle, jeśli chodzi o filozofię skryptu php. Teraz już będzie prościej.
Wstawiamy na formularz rejestracji:
3xEdit Box
1xButton
1xLive receiver
Możecie też wstawić podpisy tych pól tekstowych. Do pierwszych dwóch będziemy wpisywać dane, a trzeci będzie je odbierać.




Rejestracja
1
• (Button) clicked
(Live receiver)Start download(GET) from "http://www.strona.pl/index.php?act=reg&nick="+Edittext$( "Edit 1" )+"&pass="+Edittext$( "Edit 2" )
2
• (Live receiver)Data received
(Edit 3)Set "text Received$( "Live receiver" )"
3
• Left$(Edittext$( "Edit Box" ), 4)="blad"
Informacja, o wystąpieniu błądu
4
• Left$(Edittext$( "Edit Box" ), 2)="ok"
Informacja, o powodzeniu


Rejestrację mamy właściwie z głowy, teraz logowanie.
tutaj musimy jeszcze wstawić String Parser.



Logowanie
1
• Start of frame
(String Parser)Add delimiter "|||"
2
• (Button) clicked
(Live receiver)Start download(GET) from "http://www.strona.pl/index.php?act=log&nick="+Edittext$( "Edit 1" )+"&pass="+Edittext$( "Edit 2" )
3
• (Live receiver)Data received
• left(Received$( "Live receiver" ),3)<>"|||"
(String Parser)Set source string to Received$( "Live receiver" )"
Set global value A to "Val( Left$(listFirst$( "String Parser" ), Len(listFirst$( "String Parser" ))-3) )"
Set global value A to "Val( Left$(listFirst$( "String Parser" ), Len(listFirst$( "String Parser" ))-3) )"
Set global String A to "Edittext$( "Edit" )"
Set global String B to "Edittext$( "Edit 2")"
4
• (Live receiver)Data received
• left(Received$( "Live receiver" ),3)="|||"
Informacja, o błędzie

W moim przypadku ustawiam wartość globalną A na level, globalny string A na nick, a string B na haslo.
Level otrzymujemy jako tekst i jeszcze z "rozdzielaczem"("|||"), dlatego najpierw wyciągamy pierwsze znaki, a potem zmieniamy na wartość liczbową

Teraz pokażę jeszcze, w jaki sposób zapisać(w moim przypadku)poziom.
Wstaw licznik, dwa buttony i Live receiver.


Zapis
1
• Start of frame
(counter)Set counter to Global Value A
2
• (Button)clicked
(counter)Set counter to random(300)
3
• (Button 2)clicked
(Live receiver)Start download(GET) from "http://www.strona.pl/index.php?act=save&nick="+Global string A+"&pass="+Global String B+"&lvl="+Str$(value("Counter"))


I w ten sposób zakończyliśmy ten kurs. Jednak ma pewne wady:
-jeśli ktoś źle zakończy grę wynik zostanie utracony. Można by go zawsze aktualizować, gdy jest taka potrzeba(czytaj: zdobyliśmy kolejny poziom) lub co jakiś czas...
-jeśli ktoś będzie wiedział jaki adres trzeba wykonać może otworzyć w przeglądarce "http://strona.pl/index.php?act=save&nick=Andy&pass=haslo&lvl=99999" i już wielki poziom. Ale i tak działa;)

---
Dla leniwych - przykład
Ostatnio edytowane 20 sierpnia 2009, 13:06 przez Andy
Komentarze
normal @ 23 lipca 2010, 00:34
mam taki problem otóż gdy chce sie zalogować to nieważne czy podam dobre czy złe dane to i tak przenosi mnie do następnej klatki..
Zax37 @ 15 grudnia 2009, 09:31
Już wszystko działa, fajny przykład ; ]
Zax37 @ 11 grudnia 2009, 12:29
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in... help? XD
Tymon @ 20 sierpnia 2009, 13:06
1. Jak kto woli, to daje od razu dodatkowy filtr, a modyfikacja zapytania jest szybsza bo można adresować do dowolnego argumentu więc nawet jak będzie potrzeba umieścić kilka zmiennych $a w stringu to nie będę męczył się w łączenie stringu tylko napiszę
Cytat:
echo sprintf( "%1$d, %1$d, %1$d", $a );
zamiast
Cytat:
$a = intval($a); echo "$a, $a, $a";
czy
Cytat:
$a = intval($a); echo $a . ', ' . $a . ', ' . $a;
Po za tym zawsze mogę sobie zmienić nazwę zmiennej w bardzo szybki i przyjemny sposób. 2. [quote][c]$a = (int) $a; $a = round( $a ); $a = intval( $a ); list( $a ) = sscanf( $a, '%d' ); preg_match( '/[1-9][0-9]*/', $a, $m ); $a = $m[0]; ...[/c][/quote]Nie chce mi się więcej wymyślać. xD 3. Tak, szuka i jest to tak samo szybkie jak single quote. Mi to tutaj akurat obojętne, ale sam przyznam, że głównie używam single zamiast double. Po za tym tutaj w stringu nie ma znaków modyfikacji.
Ostatnio edytowane 20 sierpnia 2009, 13:14 przez Tymon
Cremmy @ 20 sierpnia 2009, 12:48
1. Czy sprintf() jest lepszy niz zwykle laczenie stringow ('blah'.$zmienna)? 2. Czy intval() jest lepszy niz round()? Zreszta, zgaduje, ze tak bedzie ;o 3. Czy zamiast "INSERT INTO players ( nick, password, level ) VALUES ( '%s', '%s', 1 );" nie byloby lepiej zrobic 'INSERT INTO players ( nick, password, level ) VALUES ( "%s", "%s", 1 );'? Podobno przy " " php doszukuje sie znakow specjalnych i zmiennych, ale nie wiem, jak to dziala przy sptintfie. Hyh, zebralo sie kilku php'owcow i niewtajemniczeni wysiadaja? ;d
Tymon @ 20 sierpnia 2009, 12:05
http://gmclan.org/up152_0_Rejestracja_i_logowanie.html 1. Nie ma sensu przechowywać uchwytu do połączenia skoro działamy na jednej bazie. 2. Kontrola błędów. 3. Słyszeliście o switch/case?:) 4. Sranie ( przepraszam ) kilkoma funkcjami w zmienną nie zabezpieczy jej. 5. Hashowany string nie musi być filtrowany. 6. I tak wybierze tylko jednego użytkownika, po co while? 7. Wystarczy potraktować jako liczba całkowita. To te błędy które były dla mnie wystarczająco rażące by na nie zwrócić uwagę, btw. niepotrzebny już ten separator, wynik zwracany jest w formacie ok:{poziom}.
Ostatnio edytowane 20 sierpnia 2009, 12:18 przez Tymon
szymat @ 20 sierpnia 2009, 11:59
Andy napisał(a):
Lepsze określenie: "dla szczególnie uzdolnionych"
Właśnie;)
Andy @ 20 sierpnia 2009, 11:18
Lepsze określenie: "dla szczególnie uzdolnionych":P
szymat @ 19 sierpnia 2009, 23:13
dng napisał(a):
Tyle zrozumiałem z waszej gadki.
Bo wiesz, to jest PHP i MySQL, to dla tych kujoniastych:D
dng @ 19 sierpnia 2009, 22:41
O, przy okazji znalazłem błąd w komciach ^^
dng @ 19 sierpnia 2009, 22:40
Cremmy i szymat napisał(a):
Blarghblarghblarghblarghblarghblarghblarghblarghblarghblarghblarghblarghblarghblarg
Tyle zrozumiałem z waszej gadki.
Ostatnio edytowane 20 sierpnia 2009, 15:41 przez Fanotherpg
szymat @ 18 sierpnia 2009, 19:11
Strip_tags a potem: html_real_tags
Cremmy @ 18 sierpnia 2009, 18:43
Tyle, ze striptags przewaznie psuje tekst po dodaniu "<" (znak mniejszosci zwany tez &lt;). A co z addslashes w polaczeniu z htmlspecialchars?
szymat @ 18 sierpnia 2009, 18:32
strip_tags i mysql_real_escape_string razem są mocniejsze niż addslashes;)
Cremmy @ 18 sierpnia 2009, 18:24
Co do tego: "$nick = strip_tags( mysql_real_escape_string ( $_GET['nick'] ) );" Nie wystarczy "$nick = addslashes ( $_GET['nick'] );"? Html chyba bazie grozny nie jest a addslashes CHYBA pozbedzie sie nieproszonych 'znakow specjalnych'? Pytam, bo specem nie jestem, a tak przewaznie robilem ;o
szymat @ 18 sierpnia 2009, 17:04
Andy, przy id bardzo dobrze widziane jest {}Indeksowe:) + ostatnia tabela: status; ENUM; '0','1', '1' - Bo jak usuniesz użytkownika to zmieniasz lastid(); wiec przy każdym wybraniu z bazy WHERE status = '1' AND (...), jest to ogromnie przydatne. No i tak wyglądające zapytanie INSERT błagam! Nie phpmyadminem zamiast: $q2="INSERT INTO `players` (`nick`, `password`, `level`) VALUES ('$nick', SHA1('$pass'),1)"; to: $q2 = [color=orange]"INSERT INTO players SET nick = ".$nick.", password = ".SHA1($pass).", level = 1"[/color] Nieco ładniej a przy okazji gdy dodasz jakieś pole to nie trzeba będzie wszędzie szukać i zmieniać. Widzę, że większość zapytań robione poprzez phpmyadmina:) A do tego "$nick=addslashes(trim(mysql_real_escape_string($_GET['nick'])));" o kurcze! A nie lepiej: "$nick = strip_tags( mysql_real_escape_string ( $_GET['nick'] ) );" - Tak Ci się nie shakerują do bazy:) W sumie to tyle zastrzeżeń, a jeżeli ktoś mi chce wmówić, że źle robię, to niech się zastanowi, robię w tym 7 lat :*
Ostatnio edytowane 18 sierpnia 2009, 17:06 przez szymat
Andy @ 17 sierpnia 2009, 15:59
Fakt, zapomniałem o tych "bajerach". I skrypt będzie działał na serwerach z reklamami, ponieważ gdy znamy długość odbieranego tekstu(np. gdy jest błąd podczas zakładania konta sprawdzamy, czy pierwsze 4 znaki = "blad"), natomiast gdy nie znamy długości(level) używam String Parser'a;)
Cremmy @ 17 sierpnia 2009, 15:56
A gdzie addslashes() i inne tego typu bajery przy hasle/nicku? :< W ten sposob to ci baze zhackuja ;o Swoja droga, taki skrypt nie bedzie dzialal na darmowych serwerach typu cba gdzie do strony dolaczane sa najrozniejsze reklamy, chociaz mozna zalozyc,ze jak ktos robi gre sieciowa, to serwer wlasny i/lub dobry ma. Do wysylanych danych mozna dolaczyc md5/sha wszystkich danych oraz jakiegos hasla, bedzie mniejsza szansa, ze ktos bedzie probowal oszukiwac. Ale poza tym... Dobry przyklad dla poczatkujacych ;d
Ostatnio edytowane 17 sierpnia 2009, 15:56 przez Cremmy
Andy @ 17 sierpnia 2009, 15:30
Przykład - http://andygames.koon.pl/upload/1302829655rejestracja.zip
Zdunek @ 17 sierpnia 2009, 15:21
Bardzo fajne... Przy najbliższej okazji sprawdzę poprawność działania...:)
Dodaj komentarz
Kolor:   Rozmiar:

Dodał Andy
Profil PW
Twoja ocena
Inne tego autora
b/d
^ Do góry
© 2009 - 2012 Fabryka Gier. Publikowanie materiałów tylko za zgodą autorów.
Realizacja: Maciej Lamberski *-: