Sesje Utworzenie bazy danych. Formularz rejestracyjny

Transkrypt

Sesje Utworzenie bazy danych. Formularz rejestracyjny
Laboratorium 4 – sesje i logowanie
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 rejestracja 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
stronka.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:
• 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
Źródło: Marcin 'loganek' Kolny http://webmade.org/porady/sesje-php-system-logowania.php

Podobne dokumenty