7.5. Skrypt logowania - kompletny.

Poniższy skrypt logowania zbudowany jest na podstawie poprzednich ćwiczeń. W pliku wykorzystano następujące funkcjonalności:

  • zarówno formularz logowania jak i skrypt odbierający dane z formularza znajdują się w jednym pliku;
  • skrypt sprawdza, którą "drogą" użytkownik trafił na stronę;
  • do identyfikacji wykorzystywane są zmienne sesyjne;
  • zdefiniowano stałe potrzebne do połączenia z bazą danych;
  • zdefiniowano funkcje umożliwiające przeprowadzenie procesu logowania, połączenia z bazą, inicjalizowanie tablicy;
  • ustalono instrukcje warunkowe umożliwiające odpowiednie sterowanie stroną;

Ogólną zasadę działania skryptu można przedstawić za pomocą poniższego algorytmu:

Listing 7.5.1. Plik logowanie_5.php

<?php session_start();?><!--Funkcja ta działa tak, że jeżeli 
identyfikator sesji nie istnieje, zostanie on utworzony (przez 
co my otrzymamy możliwość tworzenia zmiennych sesji). Jeśli 
natomiast takowy identyfikator już istnieje, funkcja pobierze 
wartości wszystkich zmiennych obecnej sesji.-->
<HTML>
    <HEAD>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <TITLE>Logowanie</TITLE>
		<style type="text/css">
		/* <![CDATA[ */
		#komunikat{
		text-align:center;
		color:#FFFFFF;
		width:350px;
		background:#FF0000;
		margin:auto;
		}
		/* ]]> */
		</style>
	</HEAD>
	
<BODY>
<?php
// Funkcja tworzy element tablicy gdy ten nie istnieje.
init_tab($_REQUEST, 'cmd'); 

//Sprawdzamy czy użytkownik wcisnął przycisk "ZALOGUJ"
if($_REQUEST['cmd']=='loguj')
	 //Jeżeli tak to uruchomi funkcję "logowanie",
	 //która posiada dwa parametry: <<login>> i <<haslo>>
	{
		$error = logowanie($_POST['login'], $_POST['haslo']);
		echo $out=$error;	
	}
	//Jeżeli nie - sprawdzamy czy został wciśnięty przycisk "WYLOGUJ"
	else if($_REQUEST['cmd']=='wyloguj')
	{
		session_start();
		
		if (isset($_SESSION['user'])) 
			{
				echo $out="
				<div style='text-align:center; width:500px;background: #FFFF9D; margin:auto;'>
				<h1>Panel Administratora:</h1>
				<p style=\"text-align: center; font-size: small;\">Użytkownik <strong>{$_SESSION['user']['login']}</strong> został wylogowany.</p>
				";
				// usuwanie zmiennej
				unset($_SESSION['user']);	//stosujemy << unset($_SESSION['user']) >> 
											//lub << $_SESSION = array() >>
				// Usuwa wszystkie zmienne sesyjne
				$_SESSION = array();
				session_destroy();
			
				echo $out="
				<br>
				<form method=\"post\" action=\"$_SERVER[PHP_SELF]\">
				<input type=\"hidden\" name=\"cmd\" value=\"loguj\">
					<table style='text-align:center; width:200px; margin:auto;'>
						<tr>
							<td>Login:</td>
							<td><input type=\"text\" name=\"login\" id=\"login\"></td>
						</tr>
						<tr>
							<td>Hasło:</td>
							<td><input type=\"password\" name=\"haslo\"></td>
						</tr>
						<tr>
						<td colspan=\"2\"><input type=\"submit\" value=\"Zaloguj\"> <input type=\"reset\" value=\"Wyczyść\"></td>
						</tr>
					</table>
				</form>
				</div>
				";
			}
	}
		else if (isset($_SESSION['user'])) 
			{ 	// jeżeli użytkownik zalogowany to wyświetlamy tą zawartość:
			
				echo $out="
				<div style='text-align: center; width:800px; background:#99FF99; margin:auto;'>
				
				<h1>To jest zawartość strony widoczna dla zalogowanego użytkownika, który trafił na tę stronę z innej ale mając ważne zmienne sesyjne</h1>
				<h3>Zalogowany użytkownik to: <span style='color:red;'>{$_SESSION['user']['login']}</span></h3>
				
				<div style='width:100px; margin:auto;'><form method=\"post\" action=\"$_SERVER[PHP_SELF]\">
				<input type=\"hidden\" name=\"cmd\" value=\"wyloguj\">
					<table>
						<tr>
						<td colspan=\"2\"><input type=\"submit\" value=\"Wyloguj\"></td>
						</tr>
					</table>
				</form></div>
				</div>
				";
				//jeżeli niezalogowany to taka zawartość:
			} else 
				{	
					echo $out="
					
					<div style='text-align:center; width:500px; background: #FF6633; margin:auto;'>
					
					<h1>Witamy w Panelu Administratora</h1>
					
					<h3>Panel logowania:</h3>
					<form method=\"post\" action=\"$_SERVER[PHP_SELF]\">
					<input type=\"hidden\" name=\"cmd\" value=\"loguj\">
						<table style='text-align:center; width:200px; margin:auto;'>
							<tr>
								<td>Login:</td>
								<td><input type=\"text\" name=\"login\" id=\"login\"></td>
							</tr>
							<tr>
								<td>Hasło:</td>
								<td><input type=\"password\" name=\"haslo\"></td>
							</tr>
							<tr>
							<td colspan=\"2\"><input type=\"submit\" value=\"Zaloguj\"> <input type=\"reset\" value=\"Wyczyść\"></td>
							</tr>
						</table>
					</form>
					</div>
					";
				}
?>
</BODY>
</HTML>
<?php
#-------------------------------------------------------------------------------------------------------
/*Zmienna  superglobalna (superglobalna tablica asocjacyjna) $_REQUEST
służy do przechowywania danych wejściowych z formularza pobranych
za pomocą zarówno metody GET jak i POST. Po wydobyciu danych
zostaną one przypisane zmiennym PHP o tych samych nazwach, 
które odpowiadają odpowiednim polom formularza html. Może być 
używana do zbierania danych wejściowych formularza, ponieważ 
łączy w sobie informacje dostępne w tablicach $_GET, $_POST i $_COOKIE. */
function init_tab(&$tab, $key, $value='')
{
	if(!isset($tab[$key]))
		$tab[$key]=$value;
}
#-------------------------------------------------------------------------------------------------------	
function logowanie($login, $haslo)
{
	//Na początku zmienna $error jest pusta
	$error="";
	// Funkcja trim() usuwa znaki odstępu ("białe miejsca" ang. whitespace)
	//z początku oraz końca ciągu znaków.
	$login = trim($login);
	//Sprawdzamy czy uzytkownik wypełnił pole "Login"
	if($login=='') //jeżeli pole jest puste to zmiennej $error przypisywany jest komunikat:
		$error.="<div id='komunikat'>
		<p>Nie można zalogować się na konto, proszę podać <a href='logowanie_5.php'>login</a>.</p>
		</div>";
	//usuwamy znaki odstępu
	$haslo = trim($haslo);
	//Sprawdzamy czy uzytkownik wypełnił pole "Hasło"
	if($haslo=='')
		$error.= "<div id='komunikat'>
		<p>Nie można się zalogować na konto, proszę podać <a href='logowanie_5.php'>hasło</a>.</p>
		</div>";
	//Łączymy się z bazą danych za pomocą funkcji connect_db()
	$db_link = connect_db();
	
	if(!$db_link)
	// Funkcja mysqli_error() zwraca tekst komunikatu błędu z poprzedniej operacji MySQl.
		$error.="<div id='komunikat'>
		<p>Brak połączenia z bazą danych: <i>".mysqli_connect_error()."
		</i><br /> Zgłoś problem administratorowi na adres: <a href='mailto:admin@poczta.pl'>admin@poczta.pl</a></p>
		</div>";

	if($error)
	{
		$error='<div>'.$error.'</div>';
		return $error;
	}
		// Funkcja addslashes() dodaje ukośniki do ciągów tekstowych w celu zmiany ich znaczenia.
		//Dokładny opis np. tu: http://funkcje.net/view/3/1/270/
	$login = addslashes($login);
		// Funkcja mysqli_query() wykonuje zapytania SQL do bazy danych MySQl.
	mysqli_query($db_link, "SET NAMES 'utf8'");	//ustawienie polskich znaków
	$result = mysqli_query($db_link, "SELECT * FROM uzytkownicy WHERE login='$login'");
		// Funkcja mysqli_fetch_array() zapisuje wiersz wyniku w tablicy . 
	$user = mysqli_fetch_array($result);	
	//Jeżeli zmienna $user jest pusta, czyli w bazie danych nie było użytkownika o podanym loginie
	//to  zamykamy połączenie z bazą danych oraz wyświetlamy komunikat o błędzie:
	if(!$user)
	{
		// Funkcja mysqli_close() zamyka połączenie z bazą danych MySQl.
		mysqli_close($db_link);
		return "<div  id='komunikat'>
		<p>Błędny login lub hasło. <a href='logowanie_5.php'>Zaloguj się</a></p>
		</div>";
	}
	else 
	{										//Jeżeli login był w bazie:
		$zaszyfrowane = md5($haslo); 		// - szyfrujemy hasło funkcją md5
		if($user['haslo']==$zaszyfrowane)	// - sprawdzamy czy zaszyfrowane hasło jest takie samo jak zapisane w bazie
		{									//jeżeli tak - ustawiamy sesję i wyświetlamy zawartość strony dostępną
			session_start();				//dla zalogowanych użytkowników
			$_SESSION['user'] = $user;
			echo $out="
							<div style='text-align:center; width:500px;background: #99FFFF; margin:auto;'>
							
							<h1>To jest zawartość strony widoczna po zalogowaniu</h1>
							<h3>Zalogowany użytkownik to: {$_SESSION['user']['login']}</h3>
							
							<form method=\"post\" action=\"$_SERVER[PHP_SELF]\">
							<input type=\"hidden\" name=\"cmd\" value=\"wyloguj\">
								<table>
									<tr>
									<td colspan=\"2\"><input type=\"submit\" value=\"Wyloguj\"></td>
									</tr>
								</table>
							</form>
							</div>";
						mysqli_close($db_link);
		}
		else								//jeżeli nie - zamykamy połączenie z bazą oraz wyświetlamy komunikat
		{
			mysqli_close($db_link);
			return  "<div id='komunikat'><p>Błędny login lub hasło. <a href='logowanie_5.php'>Zaloguj się</a></p></div>";
		}
	}
}
#-------------------------------------------------------------------------------------------------------
function connect_db()
{
// Parametry bazy danych zdefiniowane jako stałe.
define('DB_HOST', 'localhost');
define('DB_NAME', 'baranski');
define('DB_USER', 'root');
define('DB_PASSWORD', '');

// Funkcja mysqli_connect() nawiązuje połączenie z bazą danych MySQL.
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$link) 
	return null;  
else
	return $link;
}
#-------------------------------------------------------------------------------------------------------	
?>