rejestracjaNajsampierw teoria, która jak mam nadzieje rozjaśni Wasze szare komórki. Naszym celem jest stworzenie skryptu rejestracji, logowania, edycji profilu oraz wylogowania. Całość ma znajdować się w osobnych plikach oraz posiadać mały silnik.

Teoria

System rejestracji polega na dodaniu rekordu do bazy danych. Skrypt pobiera od użytkownika takie wartości jak nick, hasło oraz email. Po przefiltrowaniu oraz sprawdzeniu danych z tablicy $_POST rozpoczyna się translacja z bazą danych. Jeśli w bazie znajduje się już rekord z podanym przez użytkownika nickiem na ekranie pojawia się stosowny komunikat, a do bazy danych nie zostaną dodane żadne wartości dlatego, że z powodów oczywistych nie może być dwóch użytkowników o identycznych nickach.

Logowanie to nic innego jak pobranie od użytkownika loginu z hasłem, a następnie sprawdzeniu czy hasło dla podanego nicku jest prawidłowe. Jeśli dane się zgadzają deklarujemy zmienną sesyjną do tablicy $_SESSION z wartościami takimi jak nick, hasło oraz pobraną z bazy range(aby w razie potrzeby odróżnić administratora od zwykłego użytkownika). Jeśli dane się nie zgadzają wyświetlamy odpowiedni komunikat i dla celów bezpieczeństwa niszczymy zmienne sesyjne funkcją session_destroy(), która będzie użyta w skrypcie wylogowywania.

Edycja profilu rozpoczyna się od sprawdzenia, czy istnieje zmienna sesyjna przy pomocy funkcji isset(). Jeśli zmienna istnieje skrypt pobiera odpowiednie dane do formularza na stronie. Po edycji pól tekstowych przez użytkownika skrypt wykonuje update bazy danych na dane odebrane z formularza. Należy oczywiście pamiętać o filtracji danych.

Wylogowanie polega jedynie na zniszczeniu zmiennych sesyjnych poprzez użycie funkcji session_destroy().

Przygotowania

Mając opanowaną teorie przystępujemy do części praktycznej kursu.

Zacznijmy od utworzenia tabeli danych o nazwie `uzytkownicy`

CREATE TABLE `uzytkownicy` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nick` VARCHAR( 50 ) NOT NULL ,
`haslo` VARCHAR( 32 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
`ranga` INT NOT NULL ,
`osobie` TEXT NOT NULL ,
`data` DATETIME NOT NULL
) ENGINE = MYISAM ;

Zapisujemy do niej kolejno:

  • indywidualny numer ID służący do identyfikowania użytkowników
  • pole nick, przechowujące nich użytkownika
  • pole haslo, będzie przechowywać hash md5 użytkownika
  • email przechowujący Internetowy adres email
  • ranga, aby można było odróżnić administratora od zwykłego użytkownika.
  • osobie, pole typu text. Będą się w nim znajdować dane podane przez użytkownika.
  • data, to data rejestracji wraz z godziną.

Mając bazę danych możemy przystąpić do tworzenia szkieletu strony. Będzie się on składał z pliku index.php oraz silnik.php. Ponadto utworzymy dwa katalogi, strona oraz includes. W pierwszym będziemy trzymać pliki style.css, bottom.php i top.php. Te dwa ostatnie będą nam służyć za prowizoryczne logo oraz stopkę, aby pokazać Czytelnikowi zmiany zachodzące na stronie podczas logowania. W katalogu includes należy stworzyć pliki o nazwach edycja.php, logowanie.php, rejestracja.php i ostatni wylogowanie.php. Będą to podstrony naszego silnika.

Zawartość pliku index.php:

<?php session_start(); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="Stylesheet" type="text/css" href="strona/style.css" />
		<title>
			Testowa strona przedstawiająca skrypt obsługi użytkowników.
		</title>
	</head>
	<body>
		<?
		mysql_connect ("serwer", "uzytkownik", "haslo") or
		die ("Blad podczas polaczenia z MySQL. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
		mysql_select_db ("baza") or
	 	die ("Blad podczas wybierania bazy. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
		include('strona/top.php');
			include('silnik.php'); /*główny silnik - rejestracja, logowanie, edycja i wylogowanie*/
		include('strona/bottom.php');
		?>
	</body>
</html>

Funkcja session_start() odpowiada za podtrzymywanie sesji. Bez niej nasz skrypt nie działałby prawidłowo. Myślę, że reszta kodu nie wymaga dogłębnego omówienia.

Poniżej zawartość plików z katalogu strona.

Style.css:

* {
	margin: 0;
	padding: 0;
}
body {
	margin: 0 auto;
	width: 800px;
}

bottom.php:

<?php
echo'<hr />To jest dolna część stronki';
?>

top.php:

<?php
echo'To jest górna część stronki<hr />
<h4>Menu:</h4>
<a href="?strona=logowanie">Logownaie</a>
<a href="?strona=rejestracja">Rejestracja</a>
<a href="?strona=edycja">Edycja profilu</a>
<a href="?strona=wylogowanie">Wylogowanie</a>
<hr />';
?>

Zawartość pliku silnik.php:

<?php
$get = addslashes($_GET['strona']);
 
switch($get) {
	case '':
		include('includes/logowanie.php');
	break;
 
	case 'glowna':
		include('includes/logowanie.php');
	break;
 
	case 'rejestracja':
		include('includes/rejestracja.php');
	break;
 
	case 'logowanie':
		include('includes/logowanie.php');
	break;
 
	case 'edycja':
		include('includes/edycja.php');
	break;
 
	case 'wylogowanie':
		include('includes/wylogowanie.php');
	break;
}
?>

Zaczynamy

Mając przygotowany szkielet zabieramy się za kodzenie właściwie 😉
Najsampierw przygotujemy skrypt rejestracji(plik rejestracja.php w katalogu includes). Poniżej działający kod wraz z kilkoma komentarzami.

<?php
if(isset($_SESSION['login'])) {
	echo'Posiadasz już konto';
} else {
/*Deklaracja zmiennej $formularz*/
$formularz ='
			<form action="?strona=rejestracja" method="post">
				<table>
					<tr>
						<td width="120">
							Nick
						</td>
						<td>
							<input type="text" name="nick" maxlength="30" />
						</td>
					</tr>
					<tr>
						<td>
							Hasło
						</td>
						<td>
							<input type="password" name="haslo" />
						</td>
					</tr>
					<tr>
						<td>
							Powtórz hasło
						</td>
						<td>
							<input type="password" name="haslo2" />
						</td>
					</tr>
					<tr>
						<td>
							E-mail
						</td>
						<td>
							<input type="text" name="email" maxlength="100" />
						</td>
					</tr>
					<tr>
						<td>
							Kliknij
						</td>
						<td>
							<input type="submit" name="rejestracja" value="Rejestruj" />
						</td>
					</tr>
				</table>
			</form>
	';
 
	if(isset($_POST['rejestracja'])) { //Jeśli został wciśnięty przycisk
		/*Filtracja zmiennych z tablicy $_POST*/
		$nick = addslashes(htmlspecialchars($_POST['nick']));
		$haslo = addslashes(htmlspecialchars($_POST['haslo']));
		$haslo2 = addslashes(htmlspecialchars($_POST['haslo2']));
		$email = addslashes(htmlspecialchars($_POST['email']));
 
		/*Sprawdzanie, czy wszystkie pola zostały uzupełnione i czy są poprawne*/
		if(empty($nick)) {
			echo'<p>Uzupełnij pole <span>nick</span></p>';
		} elseif(strlen($nick) > 50 ) {
			echo'<p>Nick może składać się z maksymalnie 50 znaków</p>';
		} elseif(empty($haslo)) {
			echo'<p>Uzupełnij pole <span>hasło</span></p>';
		} elseif(empty($haslo2)) {
			echo'<p>Powtórz hasło</p>';
		} elseif($haslo != $haslo2) {
			echo'<p>Podane hasła różnią się</p>';
		} elseif(empty($email)) {
			echo'<p>Uzupełnij pole <span>E-mail</span></p>';
		} elseif(strlen($email) > 50 ) {
			echo'<p>E-mail może składać się z maksymalnie 50 znaków</p>';
		} elseif(!preg_match('/^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+.[a-z]{2,4}$/D', $email)) {
			echo'<p>Podany adres <span>E-mail</span> jest nieprawidłowy.
			 Prawidłowy E-mail jest niezbędny w celu dokończenia procesu rejestracji.</p>';
		} else { //Jeśli wszystkie pola się zgadzają zapytujemy bazę danych
			/*Sprawdzanie, czy podany nick istnieje w bazie danych*/
			$zapytajka_user = mysql_query("SELECT * FROM `uzytkownicy` WHERE `nick` = '$nick';");
			if(mysql_num_rows($zapytajka_user) == 1) {
				echo '<p>Przepraszam, taki login jest już zajęty - proszę wybrać inny nick.</p>';
			} else {
				/*Sprawdzanie, czy podany email istnieje w bazie danych*/
		  		$zapytajka_email = mysql_query("SELECT * FROM `uzytkownicy` WHERE `email` = '$email';");
		     	if(mysql_num_rows($zapytajka_email) == 1) {
		        	echo '<p>Przepraszam, taki <span>e-mail</span> jest już zajęty. Możliwe, że posiadasz już konto w moim serwisie, bądź ktoś podał Twój adres.';
				} else {
					/*Dodawanie nowego użytkownika do bazy danych*/
					echo '<p>Dzięki za rejestracje <span>'.$nick.'</span>, możesz się teraz <a href="?strona=glowna">zalogować</a>.</p>';
					$haslo_zakodowane = md5($haslo);
			        $zapytanie = mysql_query("INSERT INTO uzytkownicy (nick, haslo, email, ranga, osobie, data)
			        VALUES ('$nick', '$haslo_zakodowane', '$email',  1, '---', now());");
				}
			}
		}
	} else { //Jeśli nie został wciśnięty przycisk wyświetlamy formularz
		echo $formularz;
	}
}
?>

Jeśli mamy już zarejestrowane konto należy się zalogować używając poniższego kodu:

<?php
$formularz = '
<form action="" method="post">
	<input type="text" name="login" value="login" />
	<input type="password" name="password" value="pass" />
	<input type="submit" name="logowanie" value="Zaloguj" />
</form>
';
 
$login = addslashes(htmlspecialchars($_POST['login'])); //nadajemy zmiennej login wartosc z POST
$haslo = md5(addslashes(htmlspecialchars($_POST['password']))); //nadajemy zmiennej haslo wartosc z POST
 
if(!empty($_POST['logowanie'])) { //jesli klikniemy przycisk wykonuje sie skrypt
   if(empty($login)) { //jesli nie wpisalismy loginu
	  echo 'Podaj login!'; //echujemy wiadomosc
   }
   elseif(empty($haslo)) { //jesli nie wpisalismy hasla
	  echo 'Podaj hasło!'; //echujemy wiadomosc
   }
   else { //jesli sa wpisane login i haslo
	  $zapytanie = mysql_query("SELECT * FROM `uzytkownicy` WHERE `nick` = '$login' AND `haslo` = '$haslo';"); //zapytujemy baze danych
	   while ($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) { //petla, aby pobrac wyniki
		  $loginzbazy = $rekord['nick']; //zapisujemy login z bazy do zmiennej
		  $haslozbazy = $rekord['haslo']; //zapisujemy haslo z bazy do zmiennej
		  $ranga = $rekord['ranga']; //zapisujemy range z bazy do zmiennej
	   }
	   if($login != $loginzbazy || $haslo != $haslozbazy) { //jesli login lub/i haslo bedzie inne niz to z bazy
		  echo 'Niepoprawny login lub/i haslo!'; //echujemy wiadomosc
	   } elseif($login == $loginzbazy && $haslo == $haslozbazy) { //jesli dane sie zgadzaja
		    $_SESSION['login'] = $loginzbazy; //zapisujemy login z bazy do sesji
		    $_SESSION['haslo'] = $haslozbazy; //zapisujemy haslo z bazy do sesji
		    $_SESSION['ranga'] = $ranga; //zapisujemy range z bazy do sesji
		    echo 'Zostałeś poprawnie zalogowany/s <b>'.$_SESSION['login'].'</b>!'; //echujemy wiadomosc
	   } else { //jesli wystapi nieoczekiwany blad
		    echo 'Wystąpił nieoczekiwany błąd. Spróbuj ponownie.'; //echujemy wiadomosc
	   }
   }
} else { //jesli nie klikniemy przycisku wyswietlamy formularz
   if(isset($_SESSION['login'])) { //jesli istnieje sesja z loginem
	  echo 'Jesteś już zalogowany jako<b> '.$_SESSION['login'].'</b>!'; //echujemy wiadomosc
   } else { //jesli nie ma sesji z loginem
	  echo $formularz; //wyswietlamy formularz
	}
}
?>

Pozostaje nam napisać kod odpowiedzialny za edycję danych użytkownika:

<?php
if(isset($_SESSION['login'])) {
	if(!isset($_POST['edycja'])) {
		$login = addslashes($_SESSION['login']);
		$zapytanie = mysql_query("SELECT * FROM `uzytkownicy` WHERE nick='".$login."';");
		while ($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) {
			echo'<h2>Edycja danych</h2>
			<form action="" method="post">
				<textarea name="osobie" cols="40" rows="10">'.$rekord['osobie'].'</textarea>
				<input type="submit" name="edycja" value="Edytuj dane" />
			</form>
			';
		}
	} else {
		$osobie = addslashes(htmlspecialchars($_POST['osobie']));
		$login = addslashes($_SESSION['login']);
		mysql_query("UPDATE `uzytkownicy` SET `osobie`='$osobie' WHERE `nick`='$login'");
		echo'Dane zostały zmodyfikowane pomyślnie!';
	}
} else {
	echo'Aby mieć dostęp do tej strony musisz być <a href="?strona=glowna">zalogowany</a>';
}
?>

A oto proste wylogowanie:

<?php
if(isset($_SESSION['login'])) {
	echo'Wylogowanie przebiegło pomyślnie'.$_SESSION['login'];
	session_destroy();
} else {
	echo'Jesteś już wylogowany/a';
}
?>

Myślę, że kody napisałem dość czytelnie i nie będzie problemów z dostosowaniem skryptów do własnych potrzeb.

Na zakończenie

Pozostaje ostatni problem. Jak odróżnić zwykłego użytkownika od administratora? Nic trudnego. Do bazy danych należy ręcznie dodać nowy rekord z rangą np. 5. Skrypt odpowiedzialny za wyświetlanie informacji dostępnych dla administratora kształtuje się następująco:

<?php
if($_SESSION['ranga'] >= 5) {
	echo'jesteś administratorem ;-)';
} else {
	echo'Nie jesteś administratorem ;-(';
}
?>

To tyle, pisząc ten poradnik chciałem jedynie mniej więcej przybliżyć Wam na czym polega system rejestracja i logowanie na stronie Internetowej.

Gotowiec:

http://blog.grabowski.ostrowwlkp.pl/wp-content/uploads/2010/11/test.zip