Jump to content
Michael2318

[PHP/MySQL] Rejestracja & Logowanie na sesjach

Recommended Posts

Michael2318

Cześć! ;)

Dzisiaj pokażę Wam jak można zrobić logowanie (+ rejestrację) na sesjach. Jest to podstawa przy tworzeniu jakichkolwiek CMSów itp.
Dane naszych użytkowników przetrzymywać będziemy oczywiście w bazie.

No więc, najpierw tworzymy naszą tabelę, gdzie będziemy przechowywać dane o użytkownikach:

CREATE TABLE `users` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`username` varchar(25) NOT NULL,
`password` varchar(32) NOT NULL,
`email` varchar(255) NOT NULL, 
PRIMARY KEY (`id`));

Jak widać w bazie będziemy mieć:
id każdego z naszych użytkowników - ID nadawane jest automatycznie, w związku z czym nie ma możliwości, aby jakieś ID było przypisane do kilku userów ;)
username - czyli nick naszego usera (max. 25 znaków),
password - zakodowane w md5 hasło usera,
email - czyli mail usera ;)

Najpierw w naszym pliku (u mnie index.php) umieszczamy dane umożliwiające skryptowi połączyć się z naszą bazą. Otwieramy również naszą sesję, umożliwiającą logowanie się:

if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'register' && $_SESSION['nazwa'] == NULL && !isset($_POST['submit']) ) 
{ 
   $body = '<form action="index.php?action=register" method="post"><table><tr><td>Login: <input type="post" name="login" maxlength="25"></td></tr><tr><td>Adres E-Mail: <input type="post" name="email" maxlength="255"></td></tr><tr><td>Haslo: <input type="password" name="password_first" maxlength="35"></td></tr><tr><td>Powtorz haslo: <input type="password" name="password_second" maxlength="35"></td></tr><tr><td><input type="submit" name="submit" value="Zarejestruj mnie!"></td></tr></table></form>'; 
   echo $body; 
   exit; 
}

W kolejnym kroku już trochę więcej roboty - musimy przefiltrować dane wprowadzone przez użytkownika i sprawdzić czy dane są w ogóle poprawne.
W pierwszym warunku sprawdzamy czy pole z loginem, mailem, hasłem nie są puste, czy nick nie jest taki sam jak hasło, czy nick jest dłuższy nic 4 znaki, czy hasło jest dłuższe niż 6 znaków, czy adres email jest wpisany poprawnie oraz czy nazwa użytkownika nie zawiera żadnych znaków poza A-Z / a-z / 0-9 / _ / [SPACJA]:

else if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'register' && $_SESSION['nazwa'] == NULL && isset($_POST['submit']) )
{
   $login = htmlspecialchars($_POST['login']);
   $email = htmlspecialchars($_POST['email']);
   $password_first = md5($_POST['password_first']);
   $password_second = md5($_POST['password_second']);
   if ( !empty($login) && !empty($email) && md5($_POST['login']) !== $password_first && !empty($_POST['password_first']) && !empty($_POST['password_second']) && $password_first == $password_second && filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($login) > 4 && strlen($_POST['password_first']) > 6 && preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) )
   {

Później sprawdzamy czy wprowadzone hasło oraz nick są wolne - czy ktoś przypadkiem nie zarejestrował się już z takimi danymi. Jeśli dane są wolne to rejestrujemy usera, jeśli znów dane są już w użyciu - wypluwamy błąd:

       $sql = "SELECT * FROM `users` WHERE (email = '".$email."' OR username = '".$login."')"; 
       $result = mysql_query($sql) 
           or die("Nie udalo sie pobrac danych"); 
       $num = mysql_num_rows($result); 
       if ( $num == 0 ) 
       { 
           $sql = "INSERT INTO `users` (`username`, `password`, `email`) VALUES ('".$login."', '".$password_first."', '".$email."')"; 
           $result = mysql_query($sql) 
               or die("Nie udalo sie dodac usera"); 
           echo 'Zostales zarejestrowany! Teraz mozesz sie zalogowac <a href="index.php">TUTAJ</a>'; 
           exit; 
       } 
       else 

       { 
           echo "Wpisany login lub email jest juz w uzyciu! Podaj inny lub jesli posiadasz juz tutaj konto - zaloguj sie!"; 
           exit; 
       } 
   }

No i sprawa prosta - jeśli któryś z powyższych warunków się nie spełnił - informujemy o tym usera, czyli: Jeśli któreś z pól jest puste - błąd, jeśli nick jest taki sam jak hasło - błąd, jeśli wprowadzone dwa hasła nie zgadzają się ze sobą - błąd, jeśli email jest niepoprawny - błąd, jeśli nick lub hasło są za krótkie - błąd, jeśli nick zawiera znaki, które są zakazane (inne niż wyżej wymieniłem) - błąd.

 else if ( empty($login) || empty($email) || empty($_POST['password_first']) || empty($_POST['password_second']) ) 
   { 
       echo "Uzupelnij wszystkie pola!"; 
       exit; 
   } 
   else if ( strlen($login) < 4 || strlen($_POST['password_first']) < 6 ) 
   { 
       echo "Nick lub haslo jest za krotkie. Haslo musi zawierac min. 6 znakow, natomiast nick 4 znaki"; 
       exit; 
   } 
   else if ( md5($_POST['login']) == $password_first ) 
   { 
       echo "Haslo nie moze byc takie samo jak login!"; 
       exit; 
   } 
   else if ( $password_first !== $password_second ) 
   { 
       echo "Wpisane hasla nie zgadzaja sie!"; 
       exit; 
   } 
   else if ( !filter_var($email, FILTER_VALIDATE_EMAIL) ) 
   { 
       echo "Wpisany email jest niepoprawny!"; 
       exit; 
   } 
   else if ( !preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) 
   { 
       echo "Znaki w loginie sa niedozwolone! Mozesz uzywac tylko malych i duzych liter (bez polskich znakow!), spacji, cyfr."; 
       exit; 
   } 
}

Dorzućmy jeszcze warunek dla usera, który jest już zalogowany a mimo to próbuje się zarejestrować - jeśli tak będzie, wyrzucimy mu błąd iż jest już zalogowany, a multikonta niemile są widziane:

else if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'register' && $_SESSION['nazwa'] !== NULL && (!isset($_POST['submit']) || isset($_POST['submit'])) ) 
{ 
   echo "Masz juz konto - jestes zalogowany ;]"; 
   exit; 
}

Czas na panel logowania dla gości. Najpierw standardowo tworzymy dwa pola - nick i hasło:

if ( $_SESSION['nazwa'] == NULL && !(isset($_POST['submit'])) ) 
{ 
   $body = 'Witaj gosc! Zaloguj sie ;)<br><form action="index.php" method="post"><table><tr><td>Login: <input type="post" name="login" maxlength="25"></td></tr><tr><td>Haslo: <input type="password" name="password" maxlength="35"></td></tr><tr><td><input type="submit" name="submit" value="Zaloguj"></td></tr></table></form><br>Lub <a href="index.php?action=register">ZAREJESTRUJ SIE!</a>'; 
   echo $body; 
   exit; 
}

Potem znowu musimy przefiltrować wprowadzone dane - jedziemy. Jeśli któreś z pól jest puste, lub nick zawiera niedozwolone znaki - wyrzucamy błąd. Jeśli tak nie jest to sprawdzamy czy podane dane są poprawne - czy istnieje user z podanaym hasłem oraz nickiem. Jeśli tak to logujemy usera, na jego konto:

else if ( $_SESSION['nazwa'] == NULL && isset($_POST['submit']) ) 
{ 
   $login = htmlspecialchars($_POST['login']); 
   $password = md5($_POST['password']); 
   if ( !empty($login) && !empty($_POST['password']) && preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) 
   { 
       $sql = "SELECT * FROM `users` WHERE username = '".$login."' AND password = '".$password."'"; 
       $result = mysql_query($sql) 
           or die("Nie udalo sie pobrac danych"); 
       $num = mysql_num_rows($result); 
       if ( $num > 0 ) 
       { 
           $row = mysql_fetch_assoc($result); 
           $_SESSION['nazwa'] = $row['id']; 
       } 
       else 

       { 
           echo "Wpisane dane sa niepoprawne"; 
           exit; 
       } 
   }

No i jak wyżej - jeśli któryś z warunków się nie spełnił - inforujemy usera o tym. Czyli jeśli pola są puste lub nick zawiera niewłaściwe znaki - błąd.

   else if ( empty($login) || empty($_POST['password']) ) 
   { 
       echo "Uzupelnij wszystkie pola!"; 
       exit; 
   } 
   else if ( !preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) 
   { 
       echo "Znaki w loginie sa niedozwolone! Mozesz uzywac tylko malych i duzych liter (bez polskich znakow!), spacji, cyfr."; 
       exit; 
   } 
}

Potem dorzucamy jeszcze link, umożliwiający userowi wylogowanie się. Oczywiście dodajemy też header location, tak aby jeśli user się wyloguje a potem cofnie stronę - aby sesja nie mogła powrócić:

if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'wyloguj' ) 
{ 
   header('Location: index.php'); 

   session_destroy(); 
}

Dorzuciłem też bajer, który jest stosowany w phpBB2 by przemo - zmienna $userdata['pole'] czyli po prostu możemy zwrócić dowolne info z bazy userowi, o nim samym, przykładowo jeśli użyjemy $userdata['username'] zwróci userowi obecnie zalogowanemu jego nick:

if ( $_SESSION['nazwa'] !== NULL ) 
{ 
   $sql = "SELECT * FROM `users` WHERE id = ".$_SESSION['nazwa'].""; 
   $result = mysql_query($sql) 
       or die("Nie udalo sie pobrac danych"); 
   $userdata = mysql_fetch_assoc($result); 

   $body = 'Witaj, <b>' . $userdata['username'] . '</b>! Jestes zalogowany! :)<br><a href="index.php?action=wyloguj">WYLOGUJ SIE!</a>'; 
   echo $body; 
   exit; 
} 
?>

To tyle ;) Teraz możecie śmiało działać dalej. Można do tego łatwo dorzucić chociażby panel admina. Wystarczy w bazie dodać pole user_level i jeśli pole jest równie 1 to user jest adminem ;) Kombinujcie, powodzenia ;)

post-573-1430860062,0907_thumb.png
post-573-1430860062,0763_thumb.png
Gotowy kod zamieszczam w załączniku!

 index.rar

UWAGA! Poradnik oraz cały kod jest pisany przeze mnie. Zabraniam rozpowszechniania go gdziekolwiek indziej bez mojej zgody!

Edited by SeNioR
Konwersja popsuła post. Poprawiono.
  • Like 1

Share this post


Link to post
Share on other sites
Daniel

Świetny poradnik na prawdę dobra robota! Piwko +

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Niemożliwe ;) Ja wpisuję login: "tttt" hasło "tetetete" i otrzymuję:

Wpisane dane sa niepoprawne

Share this post


Link to post
Share on other sites
Młody Simba

Przetestowałem i wszystko śmiga :) Dobra robota :)

Share this post


Link to post
Share on other sites
d0x

Jeszcze jak byś mógłdozucić poradnik jak zrobić ten panel admina to już było by super.

Ale i tak jest dobrze ;)

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Przecież panel admina to pikuś...

Dodajesz do bazy pole:

ALTER TABLE `users` ADD `user_level` tinyint(1) not null default '0';
Tworzysz odnośnik:
if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Witaj w panelu admina";

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}
I gotowe. Możesz jeszcze dorzućić sobie po zalogowaniu odnosnik do panelu (widoczny dla admina):
$panel_link = $userdata['user_level'] == 1 ? '
PANEL ADMINISTRATORA : '';[/code]




I zmieniasz to:



[code] $body = 'Witaj, ' . $userdata['username'] . '! Jestes zalogowany! :)WYLOGUJ SIE!';
na:

	$body = 'Witaj, ' . $userdata['username'] . '! Jestes zalogowany! WYLOGUJ SIE!' . $panel_link . '';[/code]

I masz PA z odnośnikiem do niego po zalogowaniu. Tylko teraz musisz sobie opcje jakieś tam dorzucić.

Share this post


Link to post
Share on other sites
d0x

A ten odnosnik:

if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Witaj w panelu admina";

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}

To gdzie ? ja zielony w PHP :P

Share this post


Link to post
Share on other sites
PaJonk

Michael2318, a jak stworzyć tą tabele w PMA?, tak dokładniej, dzięki.

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Przed ?>

[ Dodano: 2012-02-14, 21:28 ]

Michael2318, a jak stworzyć tą tabele w PMA?, tak dokładniej, dzięki.

Nie rozumiem do czego nawiązujesz. Konkretniej?

Share this post


Link to post
Share on other sites
PaJonk

Michael2318, jak i gdzie utworzyć tabele o której jest mowa na początku Twojego poradnika i co zrobić z tym kodem gdzie go wkleić:

CREATE TABLE `users` ( 

  `id` mediumint( NOT NULL AUTO_INCREMENT, 

  `username` varchar(25) NOT NULL, 

  `password` varchar(32) NOT NULL, 

  `email` varchar(255) NOT NULL, 

  PRIMARY KEY (`id`));[/code]

Pozdrawiam ;)

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Musisz utworzyć sobie bazę danych, a następnie wykonać to zapytanie. Utworzy ono tabelę w Twojej bazie danych.

Share this post


Link to post
Share on other sites
PaJonk

Michael2318, hah idiota ze mnie byłem pewny że tak się to robi i tak robiłem tylko w tej bazie miałem już taką tabele, ale teraz śmiga dzięki za potwierdzenie mi tego że tak się to robi :), daje piwko.

[ Dodano: 2012-02-14, 22:10 ]

A teraz co to za błąd?:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p169714/public_html/test/index.php:2) in /home/p169714/public_html/test/index.php on line 10

Share this post


Link to post
Share on other sites
d0x

gdzie to wklejc ?

$panel_link = $userdata['user_level'] == 1 ? '
PANEL ADMINISTRATORA : '';[/code]

bo jak wklejam to potem pokazuje się błąd na stronie. Możesz dać fragment z wklejonym tym ? :D

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Prawidłowo, że pokazuje błąd, bo ja zrobiłem błąd:

$panel_link = $userdata['user_level'] == 1 ? '
PANEL ADMINISTRATORA' : '';[/code]




Dodajesz to przed:



[code]$body = 'Witaj, ' . $userdata['username'] . '! Jestes zalogowany! :)WYLOGUJ SIE!';

Share this post


Link to post
Share on other sites
Pikuś

Bardzo dobra robota wszytko działa dzięki wielkie.

Share this post


Link to post
Share on other sites
d0x

Już działa tylko mam pytanie. Można zrobić tak że panel admina był na oddzielnym pliku ?

Share this post


Link to post
Share on other sites
Daniel
Można zrobić tak że panel admina był na oddzielnym pliku ?

Oczywiście, że można. Musisz tylko stworzyć nowy plik, a w nim panel. ;>

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Ten kod, który wkleiłeś w obecny plik:

if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Witaj w panelu admina";

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}

zmien na:
if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    require_once('panel.php');

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}

Stwórz plik panel.php i umieść sobie tam co chcesz mieć w panelu, np.:
<?php


echo "Witaj w panelu admina";


?>

A Ty beosky, jak nie masz co napisać - nie pisz.

Share this post


Link to post
Share on other sites
d0x

jest ok. ale do pliku panel ma dostep każdy każdy może wejść.

Share this post


Link to post
Share on other sites
Michael2318
Posted Original Poster

Usuń z głównego pliku ten kod:

if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    require_once('panel.php');

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}

A plik panel.php zapisz tak:

<?php

if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] == 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Witaj w panelu admina";

}

else if ( isset($_GET['action']) && $_SESSION['nazwa'] !== NULL && $userdata['user_level'] !== 1 && htmlspecialchars($_GET['action']) == 'panel_admina' )

{

    echo "Nie posiadasz praw admina!";

}

?>

Share this post


Link to post
Share on other sites
bootek

noo. Swketny poradnik. Na pewno duzo pomoze poczatkujacym :)

Share this post


Link to post
Share on other sites
SeNioR

Bardzo fajny poradnik, świetnie opisany :) + dla ciebie.

Share this post


Link to post
Share on other sites
ShineWeb

Poradnik świetny, oczywiście mi się przyda :)

Share this post


Link to post
Share on other sites
NuqZ

Poradnik bardzo pomocny

5/5

Share this post


Link to post
Share on other sites
PaJonk

Też uważam za świetny poradnik ;).

Tylko ten błąd mnie denerwuje:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p169714/public_html/testing/index.php:2) in /home/p169714/public_html/testing/index.php on line 10

Pomoże ktoś? ;).

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
×
×
  • Create New...