(HTML + XAMPP + MySQL)
To jest kompletny projekt pokazujący:
- jak utworzyć bazę danych
- jak zrobić rejestrację
- jak zrobić logowanie
- jak działa sesja
- jak zabezpieczyć podstrony przed dostępem bez logowania
- jak działa wylogowanie
Projekt działa lokalnie w XAMPP.
ETAP 1 – Uruchomienie serwera
- Otwórz XAMPP Control Panel
- Kliknij Start przy:
- Apache
- MySQL
Jeśli świecą się na zielono – serwer działa.
ETAP 2 – Tworzenie bazy danych
W przeglądarce wpisz:
localhost/phpmyadmin
Kliknij Nowa
Nazwij bazę:
dane
Kliknij Utwórz
Wejdź w zakładkę SQL i wklej:
CREATE TABLE loginy (
id_loginu INT AUTO_INCREMENT PRIMARY KEY,
login VARCHAR(50) NOT NULL,
haslo VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL
);
Kliknij Wykonaj
Dlaczego hasło ma 255 znaków?
Bo używamy:
password_hash()
Hasło nie jest zapisywane w postaci jawnej.
Zapisywany jest hash.
To bardzo ważne na egzaminie.
ETAP 3 – Struktura folderów
Wejdź do:
C:\xampp\htdocs
Utwórz folder:
moja_strona
W nim utwórz pliki:
db.php
logrejestr.php
index.php
strona2.php
strona3.php
strona4.php
logout.php
Uruchamiasz przez:
localhost/moja_strona/index.php
Nigdy dwuklikiem.
PLIK 1 – db.php
Połączenie z bazą danych
<?php
$host = "localhost";
$user = "root";
$pass = "";
$db = "dane";
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die("Błąd połączenia z bazą: " . mysqli_connect_error());
}
// Ustawienie kodowania znaków
mysqli_set_charset($conn, "utf8");
?>
PLIK 2 – logrejestr.php
To najważniejszy plik.
<?php
// ==========================================
// PLIK: logrejestr.php
// Cel: Rejestracja i logowanie użytkownika
// Wersja rozszerzona – z kontrolą duplikatu loginu
// ==========================================
// Uruchomienie sesji – MUSI być przed HTML
session_start();
// Dołączenie połączenia z bazą danych
require_once "db.php";
// =====================================================
// REJESTRACJA UŻYTKOWNIKA
// =====================================================
if (isset($_POST['rejestruj'])) {
// Zabezpieczenie danych przed SQL Injection
$login = mysqli_real_escape_string($conn, $_POST['login']);
$email = mysqli_real_escape_string($conn, $_POST['email']);
// Hashowanie hasła (nie przechowujemy hasła jawnie!)
$haslo = password_hash($_POST['haslo'], PASSWORD_DEFAULT);
// ==========================================
// SPRAWDZENIE CZY LOGIN JUŻ ISTNIEJE
// ==========================================
$check = "SELECT id_loginu FROM loginy WHERE login = '$login'";
$result_check = mysqli_query($conn, $check);
if (mysqli_num_rows($result_check) > 0) {
// Jeśli login istnieje – nie pozwalamy na rejestrację
echo "<p style='color:red;'>Login już istnieje. Wybierz inny.</p>";
} else {
// Jeśli login nie istnieje – dopiero wtedy dodajemy użytkownika
$sql = "INSERT INTO loginy (login, haslo, email)
VALUES ('$login', '$haslo', '$email')";
if (mysqli_query($conn, $sql)) {
echo "<p style='color:green;'>Konto zostało utworzone. Możesz się zalogować.</p>";
} else {
echo "<p style='color:red;'>Błąd bazy danych.</p>";
}
}
}
// =====================================================
// LOGOWANIE UŻYTKOWNIKA
// =====================================================
if (isset($_POST['zaloguj'])) {
// Zabezpieczenie loginu
$login = mysqli_real_escape_string($conn, $_POST['login']);
// Hasła nie filtrujemy – sprawdzamy je przez password_verify()
$haslo = $_POST['haslo'];
// Pobieramy użytkownika z bazy
$sql = "SELECT * FROM loginy WHERE login = '$login'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
$user = mysqli_fetch_assoc($result);
// Sprawdzamy czy hasło pasuje do hasha
if (password_verify($haslo, $user['haslo'])) {
// Tworzymy zmienne sesji
$_SESSION['zalogowany'] = true; // flaga logowania
$_SESSION['user'] = $user['login']; // nazwa użytkownika
$_SESSION['id'] = $user['id_loginu']; // ID użytkownika
// Przekierowanie po udanym logowaniu
header("Location: index.php");
exit();
} else {
echo "<p style='color:red;'>Błędne hasło.</p>";
}
} else {
echo "<p style='color:red;'>Użytkownik nie istnieje.</p>";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Logowanie i Rejestracja</title>
</head>
<body>
<h2>Rejestracja</h2>
<form method="post">
<input type="text" name="login" placeholder="Login" required><br><br>
<input type="email" name="email" placeholder="E-mail" required><br><br>
<input type="password" name="haslo" placeholder="Hasło" required><br><br>
<button type="submit" name="rejestruj">Zarejestruj</button>
</form>
<hr>
<h2>Logowanie</h2>
<form method="post">
<input type="text" name="login" placeholder="Login" required><br><br>
<input type="password" name="haslo" placeholder="Hasło" required><br><br>
<button type="submit" name="zaloguj">Zaloguj</button>
</form>
</body>
</html>
PLIK 3 – index.php
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<nav>
<a href="index.php">Start</a> |
<a href="strona2.php">Strona 2</a> |
<a href="strona3.php">Strona 3</a> |
<a href="strona4.php">Strona 4</a> |
<?php if(isset($_SESSION['zalogowany'])): ?>
<a href="logout.php">Wyloguj</a>
<?php else: ?>
<a href="logrejestr.php">Zaloguj</a>
<?php endif; ?>
</nav>
<hr>
<?php if(isset($_SESSION['zalogowany'])): ?>
<h1>Witaj, <?php echo $_SESSION['user']; ?>!</h1>
<p>Treść widoczna tylko dla zalogowanych.</p>
<?php else: ?>
<h1>Witaj gościu!</h1>
<p>Zaloguj się, aby zobaczyć więcej.</p>
<?php endif; ?>
</body>
</html>
PLIKI 4–6 – Strony zabezpieczone
Każda zaczyna się identycznie.
strona2.php
<?php
session_start();
// Jeśli nie zalogowany – przekieruj
if (!isset($_SESSION['zalogowany'])) {
header("Location: logrejestr.php");
exit();
}
?>
<!DOCTYPE html>
<html>
<body>
<h1>Strona 2</h1>
<p>Zalogowany jako: <?php echo $_SESSION['user']; ?></p>
<p>ID użytkownika: <?php echo $_SESSION['id']; ?></p>
<a href="index.php">Powrót</a>
</body>
</html>
strona3.php i strona4.php
Identyczne zabezpieczenie – zmienia się tylko treść.
logout.php
<?php
session_start();
// Usuwamy wszystkie dane z sesji
session_unset();
// Niszczenie sesji
session_destroy();
// Przekierowanie na stronę główną
header("Location: index.php");
exit();
?>
Jak działa sesja?
- Użytkownik się loguje.
- PHP tworzy identyfikator sesji.
- Dane zapisywane są w
$_SESSION. - Przeglądarka przechowuje ID sesji w cookie.
- Przy przejściu na inną stronę ID jest wysyłane do serwera.
- Serwer odczytuje dane użytkownika.
Jak zabezpieczyć podstrony?
Najważniejszy fragment:
if (!isset($_SESSION['zalogowany'])) {
header("Location: logrejestr.php");
exit();
}
Bez tego każdy mógłby wejść bez logowania.

