FAQ  Szukaj  Użytkownicy  Grupy  Statystyki  Rejestracja  Zaloguj


Poprzedni temat :: Następny temat
Sesje i ich praktyczne wykorzystanie
Autor Wiadomość
loganek 


Wiek: 16
Dołączył: 25 Mar 2008
Posty: 38
Wysłany: 2008-03-25, 10:21   Sesje i ich praktyczne wykorzystanie

Pewnie nie jeden z webmasterów zastanawiał się nad ograniczeniem dostępu do swojej strony lub do kilku jej podstron, tak, aby były one widoczne tylko dla zarejestrowanych użytkowników. Na pierwszy rzut oka może wydawać się to bardzo pracochłonne i skomplikowane, ale tak naprawdę to kilka prostych skryptów. Na podstawie prostej strony postaram się przedstawić i wyjaśnić zasady działania systemu logowania i rejestracji na stronie www.

Sesje
System logowania i rejestracji będzie opierał się na tzw. sesjach. Sesja to czas, w którym użytkownik przegląda witrynę internetową. W PHP to obiekt, który może zawierać dane dotyczące użytkownika. Najważniejsza dana, określana jako PHPSESSID, to unikalny ciąg znaków, który wysyłany jest do przeglądarki użytkownika i zapisywany na dysku w postaci ciasteczka. Dzięki sesjom możemy dowiedzieć się, jakie podstrony naszej witryny były otwierane przez użytkownika, jak długo je przeglądał itp. O funkcjach obsługujących sesje dowiemy się z dalszej części artykułu.

Utworzenie bazy danych.
Dane o loginach oraz hasłach zarejestrowanych użytkowników najlepiej przechowywać w bazie danych MySQL dzięki czemu w łatwy sposób będzie można edytować rekordy bądź je usuwać. Więc utwórzmy tabele o nazwie users. Nasza tabela powinna się składać z co najmniej 3 kolumn: user_id(INT), user_login(VARCHAR(30)) oraz user_haslo(VARCHAR(30)). Tabelę tworzymy poprzez zapytanie do bazy danych:

Kod:
CREATE TABLE `users` (
`user_id` INT NOT NULL AUTO_INCREMENT ,
`user_login` VARCHAR( 30 ),
`user_haslo` VARCHAR( 30 ),
PRIMARY KEY ( `user_id` )
);


Wartość w kolumnie user_id będzie wzrastać o jeden przy każdym dodaniu rekordu do bazy, co uniemożliwi powtórzenie się dwóch tych samych identyfikatorów.

Formularz rejestracyjny
Jeśli chcemy aby nasi użytkownicy mogli się sami zarejestrować, musimy stworzyć im formularz rejestracyjny. Oto gotowy kod, który zapiszemy jako rejestruj.php:

Kod:
<?php
mysql_connect("localhost", "root", "")or die("Nie można nawiązać połączenia z bazą"); //połączenie z bazą danych
mysql_select_db("test")or die("Wystąpił błąd podczas wybierania bazy danych");

function ShowForm($komunikat=""){    //funkcja wyświetlająca formularz rejestracyjny
    echo "$komunikat<br>";
    echo "<form action='rejestruj.php' method=post>";
    echo "Login: <input type=text name=login><br>";
    echo "Hasło: <input type=text name=haslo><br>";
    echo "<input type=hidden value='1' name=send>";
    echo "<input type=submit value='Zarejestruj mnie'>";
    echo "</form>";
}
?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
    <title>Formularz rejestracyjny</title>
</head>
<body>
<?php
if($_POST["send"]==1){    //sprawdzanie czy formularz został wysłany
    if(!empty($_POST["login"]) && !empty($_POST["haslo"])){    //oraz czy uzupełniono wszystkie dane
        if(mysql_num_rows(mysql_query("select * from users where user_login='".htmlspecialchars($_POST["login"]."'"))))ShowForm("Użytkownik o podanym loginie już istnieje!!!"); // sprawdzanie czy użytkownik o podanej nazwie już istnieje
        else{
            mysql_query("insert into users values(NULL, '".htmlspecialchars($_POST["login"])."', '".htmlspecialchars($_POST["haslo"])."')"); // zapisywanie rekordu do bazy
            echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
            }
    }
    else ShowForm("Nie uzupełniono wszystkich pól!!!");
}
else ShowForm();
mysql_close(); //zamykanie połączenia z bazą
?>
</body>
</html>


Myślę że kod jest dość zrozumiały, w celu ułatwienia zrozumienia dodałem komentarze. W razie problemów odsyłam do kursów na tej stronie. Powiem tylko, że kod ma za zadanie wyświetlić formularz rejestracyjny, lub dodać dane do bazy danych, po uprzednim ich sprawdzeniu.

Strona główna serwisu
Po napisaniu formularza rejestracyjnego możemy przystąpić do napisania kodu źródłowego strony głównej. Oto kod:

Kod:
<?php
session_start();
session_register("zalogowany");

if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;

mysql_connect("localhost", "root", "")or die("Nie można nawiązać połączenia z bazą");
mysql_select_db("test")or die("Wystąpił błąd podczas wybierania bazy danych");

function ShowLogin($komunikat=""){
    echo "$komunikat<br>";
    echo "<form action='index.php' method=post>";
    echo "Login: <input type=text name=login><br>";
    echo "Hasło: <input type=text name=haslo><br>";
    echo "<input type=submit value='Zaloguj!'>";
    echo "</form>";
    echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
}

?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
    <title>Strona główna</title>
</head>
<body>
<?php
if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";}
if($_SESSION["zalogowany"]!=1){
    if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
        if(mysql_num_rows(mysql_query("select * from users where user_login = '".htmlspecialchars($_POST["login"])."' AND user_haslo = '".htmlspecialchars($_POST["haslo"])."'"))){
            echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
            $_SESSION["zalogowany"]=1;
            }
        else echo ShowLogin("Podano złe dane!!!");
        }
    else ShowLogin();
}
else{
?>
Gratulacje! Zalogowałeś się pomyślnie! Możesz przejśc teraz do innych podstron, np. do <a href="stronka.php">tej</a>
<br><a href='index.php?wyloguj=tak'>wyloguj się</a>
<?php
}
?>

</body>
</html>
<?php mysql_close(); ?>


Na początku pliku widzimy funkcję session_start(). Ma ona za zadanie utworzenie nowej sesji lub wznowienie już istniejącej. Nie jest ona wymagana w najnowszych wersjach PHP, jednak dla porządku proponuję ją umieszczać. Powinna ona się znajdować na początku pliku.

Kolejna linijka to kolejna nowa funkcja dotycząca sesji. session_register() rejestruje w bieżącej sesji zmienną o nazwie podanej w argumencie funkcji. W zmiennej tej będziemy mogli przechowywać np. informacje o tym, czy użytkownik będący na naszej stronie jest aktualnie zalogowany. Aby odwołać się do tej zmiennej, należy skorzystać z tablicy, której zmienna jest jednym z jej elementów. Tablica nosi nazwę $_SESSION, tak więc jeśli chcemy odwołać do zmiennej zalogowany skorzystamy z zapisu: $_SESSION["zalogowany"]. Linijka:

Kod:
if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;


sprawdza czy zmienna sesyjna zalogowany jest pusta, jeśli tak, przypisuje jej wartość 0. Później następuje połączenie z bazą danych. Jest też definicja funkcji ShowLogin, która wyświetla formularz logowania.

Omówię jeszcze procedurę logowania do strony. Najpierw sprawdzamy czy użytkownik jest zalogowany. Jeśli tak, wyświetlamy odpowiedni tekst, który chcemy żeby był widoczny tylko do zalogowanych użytkowników. Jeśli nie jest zalogowany, sprawdzamy, czy formularz w ogóle został wysłany. Jeśli nie, wyświetlamy go za pomocą funkcji ShowLogin(), natomiast jeśli został wysłany, poprzez zapytanie do bazy danych sprawdzamy czy istnieje użytkownik o podanym loginie i haśle. Sprawdzamy to za pomocą funkcji mysql_num_rows(), która ma za zadanie zwrócić ilość wyników zwróconych przez bazę po zapytaniu. Jeśli funkcja zwróci wartość różną od zera, użytkownik zostanie zalogowany. W przeciwnym razie zostanie wywołana funkcja ShowLogin() z odpowiednim argumentem.

Aby użytkownik mógł się wylogować, przygotowałem specjalny link służący do tego. Odsyłacz wygląda tak:

Kod:
<a href='index.php?wyloguj=tak'>wyloguj się</a>


Jak widać przekazywana jest też w nim zmienna wyloguj. Potrzebna ona będzie do sprawdzenia warunku:
Kod:
Kod:
if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";}

Jeśli zmienna wyloguj ma wartość "tak" zmiennej sesyjnej zalogowany przypisujemy wartość 0.

Przykładowa strona
Jak na razie stworzyliśmy system logowania dla jednej podstrony (dla index). Ale co jeśli nasza strona będzie składała się z wielu podstron? Należy napisać skrypt, który będzie sprawdzał czy użytkownik jest zalogowany Żeby nie powtarzać tego samego kodu, zapiszemy go do jednego pliku (np. check.php), a następnie za pomocą funkcji require() dołączymy go do plików, które powinny być zabezpieczone przed niezalogowanymi internautami. Oto kod znajdujący się w pliku check.php:

Kod:
<?php
session_start();
?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
    <title>podstrona</title>
</head>
<body>
<?php
if($_SESSION["zalogowany"]==0){echo "nie masz dostępu do tej części witryny. <a href='index.php'>Zaloguj się</a></body></html>;"; exit();}
?>

Na początku wpisaliśmy znaną nam już funkcje session_start(), która przypomnę ma za zadanie rozpoczynać lub wznawiać bieżącą sesje. Plik nie jest długi, ale ważna jest tam ta linijka:
Kod:
if($_SESSION["zalogowany"]!=1){echo "nie masz dostępu do tej części witryny. <a href='index.php'>Zaloguj się</a></body></html>;"; exit();}

Ma ona za zadanie sprawdzić czy użytkownik jest zalogowany - jeśli tak, to jest wyświetlana zawartość pliku, który dołącza plik check.php, jeśli jednak okaże się, że użytkownik nie jest zalogowany, wyświetlamy stosowny komunikat oraz kończymy wykonywanie skryptu za pomocą funkcji exit(). A oto nasza przykładowa strona:
Kod:
<?php require("check.php"); ?>
to treść strony do której mają dostęp tylko zalogowani użytkownicy, między innymi ty:P
<br><a href='index.php?wyloguj=tak'>wyloguj się</a>
</body>
</html>


Na początku dołączamy wspominany wyżej plik. Należy zwrócić uwagę na to, żeby nie pisać nagłówka dokumentu HTML, gdyż jest on już napisany w pliku check.php. Należy umieścić tylko stopkę.

Przykłady innych funkcji związanych z sesjami w PHP
Oprócz znanych już funkcji session_start() oraz session_register() istnieje jeszcze kilka innych funkcji powiązanych z sesjami. Tutaj opiszę kilka z nich:


* session_id() - Jeśli nie podany zostanie argument, funkcja zwróci klucz, który określa sesje, a jeśli do funkcji podano jakiś argument, funkcja ustawi identyfikator sesji na tę wartość.
* session_unregister() - funkcja ma za zadanie wyrejestrować wcześniej zarejestrowaną zmienną funkcją session_register. Argumentem funkcji jest nazwa zmiennej. Od tej pory zmienna nie będzie już przesyłana między stronami.
* session_save_path() - jeśli zostanie podany argument, funkcja ustawi ścieżkę do katalogu, w którym zapisywane będą wartości zmiennych sesji. Jeśli nie argument nie zostanie podany, funkcja zwróci ścieżkę do katalogu.
* session_is_registered()- argumentem funkcji jest nazwa zmiennej. Funkcja sprawdza czy zmienna o podanej nazwie jest zarejestrowana, jeśli tak – zwraca wartość TRUE, jeśli nie – FALSE.
* session_encode()- zwraca zakodowany ciąg zawierający stan bieżącej sesji.
* session_decode()- pobiera ciąg zakodowany funkcją session_encode() i odtwarza stan sesji.
* session_destroy() - funkcja usuwa wszystkie dane o sesji


Artykuł pochodzi ze strony Kod:
Kod:
http://webmade.org
 
     
webmstr 
Webmaster



Wiek: 14
Dołączył: 25 Mar 2008
Posty: 12
Wysłany: 2008-03-25, 16:12   

Fajny artykuł tylko trochę długi i się nie chce czytać ;)
Ostatnio zmieniony przez webmstr 2008-03-25, 16:27, w całości zmieniany 1 raz  
 
 
     
Swift 
Webmaster



Wiek: 16
Dołączył: 09 Mar 2008
Posty: 408
Skąd: Kraśnik
Wysłany: 2008-03-25, 16:21   

Porównaj sobie autora tamtego tematu:
Marcin 'loganek' Kolny
i nick autora tego...
To jest poradnik tej samej osoby ;]
_________________


 
 
     
Walker 
..::ŚWIR::..


Dołączył: 25 Mar 2008
Posty: 2
Skąd: z matrixa
Wysłany: 2008-03-25, 16:24   

Bardzo dobry poradnik..Przyda mi się na pewno xD
 
 
     
tmq 


Dołączył: 25 Mar 2008
Posty: 4
Wysłany: 2008-03-25, 18:06   

Art o lie się nie mylę z webmade.org dokładniej ->
Kod:
http://webmade.org/porady/sesje-php-system-logowania.php
zapomniałeś na końcu napisać.... <lol>
 
 
     
loganek 


Wiek: 16
Dołączył: 25 Mar 2008
Posty: 38
Wysłany: 2008-03-25, 18:45   

już zmieniłem, ale wcale nie musiałem tego dodawać, bo to jest mój artykuł, a regulamin nie zabrania publikacji w innych serwisach
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Stronę monitoruje stat24 website monitoring service



Wymiana Linkiem
Forum Komputerowe | PcPlanet |Forum eKing.pl | Warez | www.warezik.eu | Forum GSM | Serwis SonyEricsson | Robert Kubica | Darmowe dzwonki i motywy | Sony Ericsson Forum | gsmfon.org - GSM | Aukcje EMAR
Strona wygenerowana w 0,35 sekundy. Zapytań do SQL: 13