logowanie i sesja PHP

(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

  1. Otwórz XAMPP Control Panel
  2. 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?

  1. Użytkownik się loguje.
  2. PHP tworzy identyfikator sesji.
  3. Dane zapisywane są w $_SESSION.
  4. Przeglądarka przechowuje ID sesji w cookie.
  5. Przy przejściu na inną stronę ID jest wysyłane do serwera.
  6. 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.