webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Sesje w PHP i ich praktyczne wykorzystanie.

autor: Marcin 'loganek' Kolny, ostatnia modyfikacja: 2008-01-08

szukaj: sesje w php sesje w php  sesje sesje  php php  system logowania system logowania  logowanie logowanie   funkcje obsługujące sesje funkcje obsługujące sesje

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:

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:

<?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:

<?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:

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:

<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:

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:

<?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:

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:

<?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:

Marcin 'loganek' Kolny

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org