Opis skryptu służącego do rejestrowania oraz logowania się użytkowników z użyciem bazy danych.
Aby w pełni zrozumieć poniższy artykuł należy posiadać wiedzę o:
-zmiennych,
-formularzach,
-podstawowy PHP i MySQL.
Utworzone zostanie 6 plików, które umożliwi nam obsługę logowania się użytkowników.
Podczas opisywania kolejnych plików najpierw będę wklejał treść całego pliku a następnie wyjaśniał go krok po kroku.
Pierwszy plik - conn.php
<?
define('DB_HOST','localhost');
define('DB_USER','uzytkownik'); //wpisz nazwęużytkownika bazy danych
define('DB_PASS','haslo'); //wpisz hasło dla tego użytkownika
define('DB_DB','test');
$connect = mysql_connect(DB_HOST, DB_USER, DB_PASS)
or die('Nie udało połączyc się z bazą danych. '.mysql_error());
mysql_select_db(DB_DB,$connect)
?>
Plik ten służy do połączenia się z bazą danych
define('DB_HOST','localhost');
define('DB_USER','uzytkownik');
define('DB_PASS','haslo');
define('DB_DB','test');
Definiujemy stałe, które umożliwią połączenie się z bazą danych: host naszej bazy, login i hasło do bazy oraz jej nazwę.
$conn = mysql_connect(DB_HOST, DB_USER, DB_PASS)
or die('Nie udało połączyć się z bazą danych. '.mysql_error());
Łączymy się z bazą danych, a w przypadku błędu wyświetlamy stosowny komunikat.
Gdy będziemy już publikować naszą stronę należy usunąć .mysql_error() aby zwykły użytkownik nie ujrzał nazw tabel w naszej bazie danych w wypadku jakiegoś błędu.
mysql_select_db(DB_DB,$connect)
Wybieramy naszą bazę jako aktywną. Jest to cały plik który będziemy dołączać do innych fragmentów naszego kodu.
Plik drugi – install.php
<?
require 'conn.php';
$sql0="create database if not exists test";
mysql_query($sql0) or die(mysql_error());
$sql1="create table if not exists user(
id int(11) NOT NULL auto_increment,
login varchar(50) NOT NULL,
password varchar (40) NOT NULL,
PRIMARY KEY (id))";
mysql_query($sql1) or die(mysql_error());
echo('Baza danych utworzona poprawnie')
?>
W tym pliku tworzymy bazę danych oraz wymaganą tabelę.
require 'conn.php';
Dołączamy plik conn.php który wcześniej stworzyliśmy.
$sql0="create database if not exists test";
mysql_query($sql0) or die(mysql_error());
Tworzymy zapytanie tworzące nową bazę danych o nazwie test oraz wykonujemy je.
$sql1="create table if not exists user(
id int(11) NOT NULL auto_increment,
login varchar(30) NOT NULL,
password varchar (40) NOT NULL,
PRIMARY KEY (id))";
mysql_query($sql1) or die(mysql_error());
Tworzymy tabelę, która zawiera:
-numer identyfikacyjny użytkownika (nie może być pusty, jest wypełniany automatycznie, nie może być dwóch takich samych wartości w bazie danych),
-login użytkownika (nie może być pusty, maksimum 30 znaków),
-hasło użytkownika(tu znajdzie się zakodowane hasło użytkownika).
Plik ten należy usunąć z serwera
po utworzeniu bazy danych.
Plik trzeci – register.php
Plik umożliwiający rejestrację użytkownika
<?php
require('conn.php');
if (isset($_POST['konto']) and isset($_POST['password']) and isset($_POST['password2']))
{
if ($_POST['password']==$_POST['password2'])
{
$konto = mysql_real_escape_string (trim($_POST['konto']));
$password = sha1(mysql_real_escape_string (trim($_POST['password'])));
$ile =mysql_query("SELECT * FROM `user` WHERE login = '$konto'");
$ile = mysql_num_rows($ile);
if ($ile==0) {
$zapytanie="INSERT INTO user (login,password) VALUES('$konto','$password')";
mysql_query($zapytanie) or die("Wystąpił błąd" );
echo('Konto '.$konto.' zostalo utworzone');
}
else
{
echo("Taki uzytkownik juz istnieje. Kliknij wstecz aby zarejestrowac sie ponownie");
}
}
else echo ("Podane hasla nie zgadzaja sie");
}
else{
?>
<html>
<body>
<h1>Dodaj nowego uzytkow
nika</h1>
<form action="register.php" method="post">
<strong>Nazwa konta:</strong><input name="konto" type="text" value="" /><br>
<strong>Haslo:</strong><input name="password" type="password" value="" /><br>
<strong>Powtorz haslo:</strong><input name="password2" type="password" value="" /><br>
<input type="submit" value="Zarejestruj" />
</form>
</body>
</html>
<?php
}
?>
Pierwszą czynnością jest dodanie pliku conn.php:
require('conn.php');
if (isset($_POST['konto']) and isset($_POST['password']) and isset($_POST['password2']))
Sprawdzamy czy istnieją zmienne $_POST['konto'], $_POST['password'] i $_POST['password2'] czyli czy przesłano dane z formularza.
Jeśli istnieją sprawdzamy czy $_POST['password'] i $_POST['password2'] mają taką samą wartość.
Gdy są różne wyświetlany jest stosowny komunikat:
else echo ("Podane hasla nie zgadzaja sie");
Natomiast, gdy są takie same:
$konto = mysql_real_escape_string (trim($_POST['konto']));
Tworzymy zmienną $konto mająca wartość $_POST['konto'] jednak usuwamy tzw. białe znaki (funkcja trim() ) oraz dodajemy lewe ukośniki do niektórych znaków (mysql_real_escape_string()). Więcej informacji o tych funkcjach na stronie www.php.net
$password = sha1(mysql_real_escape_string (trim($_POST['password'])));
Tworzymy zmienną $password przekształcamy ja tak samo jak $konto jednak dodatkowo hashujemy ja za pomocą algorytmu SHA1 (można o tym poczytać na stronach wikipedii)
$ile =mysql_query("SELECT * FROM `user` WHERE login = '$konto'");
Wykonujemy zapytanie do bazy danych pobierając wszystkie wpisy gdzie login(cześć tabeli w bazie danych) ma taką samą wartość jak powstała zmienna $konto.
$ile = mysql_num_rows($ile);
Zmiennej $ile przypisujemy ilość otrzymanych rekordów.
if ($ile==0)
Sprawdzamy czy zmienna $ile jest równa zero. Jeśli nie znaczy to że ten login jest już w bazie danych. Wtedy wyświetlamy stosowny komunikat
else
{
echo("Taki uzytkownik juz istnieje. Kliknij wstecz aby zarejestrowac sie ponownie");
}
Jeśli takiego użytkownika nie ma
$zapytanie="INSERT INTO user (login,password) VALUES('$konto','$password')";
mysql_query($zapytanie) or die("Wystąpił błąd" );
Dodajemy do bazy użytkownika o loginie równym $konto i hasle (zakodowanym) o wartości $password
echo('Konto '.$konto.' zostalo utworzone');
Informujemy o pomyślnym dodaniu użytkownika.
Wróćmy teraz do początku opisu tego pliku gdzie sprawdzamy czy istnieją zmienne $_POST['konto'], $_POST['password'] i $_POST['password2']. Rozpatrzyliśmy tylko możliwość, że istnieją. Gdy nie istnieją lub istnieją tylko niektóre z nich wtedy tworzony jest kod HTML wyświetlający formularz rejestracji:
<html>
<body>
<h1>Dodaj nowego uzytkownika</h1>
<form action="register.php" method="post">
<strong>Nazwa konta:</strong><input name="konto" type="text" value="" /><br>
<strong>Haslo:</strong><input name="password" type="password" value="" /><br>
<strong>Powtorz haslo:</strong><input name="password2" type="password" value="" /><br>
<input type="submit" value="Zarejestruj" />
</form>
</body>
</html>
Tym samym omówiony został cały plik register.php
Plik czwarty – login.php
<?php
session_start();
if (isset($_POST['konto']) and isset($_POST['password']) )
{
require('conn.php');
$konto=mysql_real_escape_string(trim($_POST['konto']));
$password=mysql_real_escape_string(trim($_POST['password']));
if ($konto!="" and $password!="")
{
$password = sha1($password);
$zapytanie="SELECT id FROM user WHERE login='$konto' and password ='$password'";
$temp=mysql_query($zapytanie) or die("Wystąpił błąd");
$ile=mysql_num_rows($temp);
$temp=mysql_fetch_array($temp);
$id=$temp['id'];
if ($ile==1)
{
$_SESSION['user_id']=$id;
$_SESSION['login']=$konto;
echo('Zostales zalogowany. ');
}
else echo ('Podales zle dane. Kliknij wstecz aby sprobowac ponownie.');
}
}
else{
?>
<html>
<body>
<form action="login.php" method="post">
<strong>Nazwa konta:</strong><input name="konto" type="text" value="" /><br>
<strong>Haslo:</strong><input name="password" type="password" value="" /><br>
<input type="submit" value="Zaloguj" />
</form>
</body>
</html>
<?php
}?>
Na samym początku rozpoczynamy sesję przeglądarki
session_start();
Następnie wykonywany jest kod, który został opisany przy wyjaśnianiu pliku register.php Dlatego nie będę wyjaśniał go drugi raz
if (isset($_POST['konto']) and isset($_POST['password']) )
{
require('conn.php');
$konto=mysql_real_escape_string(trim($_POST['konto']));
$password=mysql_real_escape_string(trim($_POST['password']));
Dalsza część kodu sprawdza czy zmienne $konto i $password nie są puste po wykonaniu funkcji trim()
if ($konto!="" and $password!="")
{
Jeśli nie wartość zmiennej $password jest hashowana tak jak w pliku register.php
$password = sha1($password);
Tworzymy zapytanie do bazy danych pobierające id użytkownika, którego login równy jest $konto a hasło równe jest $password.
$zapytanie="SELECT id FROM user WHERE login='$konto' and password='$password'";
Zmiennej $temp przypisujemy wynik tego zapytania.
$temp=mysql_query($zapytanie) or die("Wystąpił błąd");
Następnie zmiennej $ile przypisujemy ilość zwróconych wpisów.
$ile=mysql_num_rows($temp);
$temp staje się tablicą zawierającą pobrane dane a $id przyjmuje wartość id użytkownika.
$temp=mysql_fetch_array($temp);
$id=$temp['id'];
Sprawdzamy czy pobraliśmy jakies dane
if ($ile==1)
Jeśli tak to ustanawiamy zmienne sesyjne zawierające login użytkownika i jego id oraz wyświetlamy komunikat o pomyślnym załogowaniu.
$_SESSION['user_id']=$id;
$_SESSION['login']=$konto;
echo('Zostales zalogowany. ');
Jeśli nie otrzymaliśmy danych oznacza to, że użytkownik podał błędne dane zatem informujemy go o tym.
else echo ('Podales zle dane. Kliknij wstecz aby sprobowac ponownie.');
Znowu powracamy do początku opisu i sprawdzenia czy istnieją $_POST['konto'] oraz $_POST['password']. Jeśli nie istnieją (nie rozpatrzyliśmy tej opcji) Wyświetlamy HTML-owy formularz logowania
<html>
<body>
<form action="login.php" method="post">
<strong>Nazwa konta:</strong><input name="konto" type="text" value="" /><br>
<strong>Haslo:</strong><input name="password" type="password" value="" /><br>
<input type="submit" value="Zaloguj" />
</form>
</body>
</html>
Plik piąty – logout.php
<?
session_start();
session_unset();
session_destroy();
echo "Zostales Wylogowany";
?>
Ten plik niszczy ustanowione podczas logowania zmienne sesyjne i informuje użytkownika o tym
Plik szósty – index.php
<?php
session_start();
if (isset($_SESSION['user_id']) and isset($_SESSION['login']))
{
echo "Jestes zalogowany. ";
echo "Twój login to: ";
echo $_SESSION['login'];
}
else
{
echo "Nie jestes zalogowany";
}
W tym pliku po rozpoczęciu sesji sprawdzamy czy istnieją zmienne sesyjne $_SESSION['user_id'] oraz $_SESSION['login']
Jeśli tak znaczy to, że użytkownik jest zalogowany dlatego możemy poinformować go o tym
echo "Jestes zalogowany. ";
echo "Twój login to: ";
echo $_SESSION['login'];
Natomiast, gdy nie istnieją również wyświetlamy komunikat.
echo "Nie jestes zalogowany";
Tym samym dobrnęliśmy do końca skryptu logowania i rejestracji w php.
Więcej informacji o sesjach i użytych funkcjach można znaleźć na stronie www.php.net
Aby zwiększyć bezpieczeństwo należy również ustanawiać id dla każdej sesji jednak nie jest to konieczne dlatego zostało to pominięte.
Jest to mój pierwszy artykuł dlatego proszę o wyrozumiałość. Ewentualne informacje o błędach lub pytania proszę zostawić w komentarzach.
Piotr Jakimiak
Licencja: Creative Commons