⚙️ Integracja PHP i MySQL: Podstawy Aplikacji Webowych (XAMPP)

🔌 0. XAMPP i phpMyAdmin – start

  1. Uruchom XAMPP Control Panel.
  2. Włącz moduły Apache i MySQL.
  3. Otwórz przeglądarkę i przejdź do http://localhost/phpmyadmin/.
  4. Wejdź w zakładkę SQL, wklej blok DDL poniżej i kliknij „Wykonaj”.
Wyjaśnienie: Apache obsługuje pliki PHP z katalogu htdocs, a MariaDB/MySQL w XAMPP będzie serwerem bazy dla wszystkich skryptów z tego zestawu.

🛠️ DDL – struktura bazy danych szkola

Najpierw utwórz bazę danych szkola i tabelę Uczniowie (UTF‑8, polskie znaki).

-- Utworzenie bazy danych z poprawnym kodowaniem CREATE DATABASE IF NOT EXISTS szkola CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci; USE szkola; -- Utworzenie tabeli Uczniowie CREATE TABLE IF NOT EXISTS Uczniowie ( ID INT PRIMARY KEY AUTO_INCREMENT, Imie VARCHAR(50) NOT NULL, Nazwisko VARCHAR(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_polish_ci; -- Przykładowe dane do testów INSERT INTO Uczniowie (Imie, Nazwisko) VALUES ('Alicja', 'Wojcik'), ('Bartosz', 'Zielinski');
Wyjaśnienie: utf8mb4 obsługuje pełny Unicode (w tym emoji), a kolacja utf8mb4_polish_ci zapewnia poprawne sortowanie polskich znaków.

🔗 1. Łączenie i Konfiguracja (Connecting)

Zadanie 11: Połączenie z MySQL (proceduralne mysqli)

Polecenie: Napisz skrypt PHP, który połączy się z bazą szkola i wyświetli komunikat o pomyślnym połączeniu.

<?php $host = "localhost"; $user = "root"; $pass = ""; $db = "szkola"; $conn = mysqli_connect($host, $user, $pass, $db); if (!$conn) { die("Blad polaczenia: " . mysqli_connect_error()); } mysqli_set_charset($conn, "utf8mb4"); echo "Polaczono z baza danych!"; mysqli_close($conn); ?>
Wyjaśnienie: Funkcja mysqli_set_charset() ustawia kodowanie klienta na utf8mb4, co jest zalecanym sposobem pracy z polskimi znakami w MySQL/MariaDB.

Zadanie 12: Wydzielenie danych dostępowych (dbconnect.php)

Polecenie: Dane dostępowe do bazy przenieś do osobnego pliku dbconnect.php, a w głównym skrypcie tylko je wczytaj.

<?php $host = "localhost"; $user = "root"; $pass = ""; $db = "szkola"; $charset = "utf8mb4"; ?> <?php require_once "dbconnect.php"; $conn = mysqli_connect($host, $user, $pass, $db); if (!$conn) { die("Blad polaczenia: " . mysqli_connect_error()); } mysqli_set_charset($conn, $charset); echo "Polaczono z baza danych!"; mysqli_close($conn); ?>
Wyjaśnienie: Rozdzielenie konfiguracji i logiki ułatwia przenoszenie aplikacji między serwerami oraz późniejsze zmiany hasła czy nazwy bazy.

Zadanie 13: Obiektowe połączenie (OOP mysqli)

Polecenie: Połącz się z bazą korzystając z klasy mysqli (podejście obiektowe).

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); if ($conn->connect_error) { die("Blad polaczenia: " . $conn->connect_error); } $conn->set_charset("utf8mb4"); echo "Polaczono z baza danych (OOP)!"; $conn->close(); ?>
Wyjaśnienie: W podejściu obiektowym mamy dostęp do metod i właściwości obiektu $conn, co upraszcza pracę z błędami i dalszymi operacjami.

📖 2. Odczyt Danych (READ - DQL)

Zadanie 14: Pobieranie listy uczniów

Polecenie: Wczytaj wszystkich uczniów z tabeli Uczniowie i wypisz ich w formie tekstowej.

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $sql = "SELECT Imie, Nazwisko FROM Uczniowie"; $result = $conn->query($sql); if ($result && $result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo $row["Imie"] . " " . $row["Nazwisko"] . "<br>"; } } else { echo "Brak wynikow do wyswietlenia."; } $conn->close(); ?>
Wyjaśnienie: Metoda fetch_assoc() zwraca każdy wiersz jako tablicę asocjacyjną, gdzie klucze odpowiadają nazwom kolumn.

✍️ 3. Operacje CRUD (CREATE/UPDATE/DELETE - DML)

Zadanie 15: Formularz dodawania ucznia (HTML)

Polecenie: Stwórz formularz przesyłający imię i nazwisko do skryptu dodaj_ucznia.php.

<form action="dodaj_ucznia.php" method="post"> <label for="imie">Imie:</label> <input type="text" id="imie" name="imie" required><br><br> <label for="nazwisko">Nazwisko:</label> <input type="text" id="nazwisko" name="nazwisko" required><br><br> <input type="submit" value="Dodaj ucznia"> </form>
Wyjaśnienie: Atrybuty name są kluczami w tablicy $_POST w PHP – ich nazwy muszą zgadzać się z tym, czego używasz w skrypcie.

Zadanie 16: Wstawianie danych (wersja niezabezpieczona – do omówienia)

Polecenie: Obsłuż formularz w dodaj_ucznia.php, wstawiając dane bezpośrednio do SQL (celowo z luką).

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $imie = $_POST["imie"]; $nazwisko = $_POST["nazwisko"]; $sql = "INSERT INTO Uczniowie (Imie, Nazwisko) VALUES ('$imie', '$nazwisko')"; if ($conn->query($sql) === TRUE) { echo "Dodano ucznia: $imie $nazwisko."; } else { echo "Blad: " . $conn->error; } $conn->close(); ?>
Wyjaśnienie: To podejście jest podatne na SQL Injection – zostaje użyte tylko jako materiał do pokazania zagrożenia i przejścia do Prepared Statements.

Zadanie 17: Bezpieczne wstawianie (Prepared Statements)

Polecenie: Zabezpiecz wstawianie danych, używając Prepared Statements.

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $stmt = $conn->prepare( "INSERT INTO Uczniowie (Imie, Nazwisko) VALUES (?, ?)" ); $stmt->bind_param("ss", $_POST["imie"], $_POST["nazwisko"]); if ($stmt->execute()) { echo "Dodano ucznia bezpiecznie."; } else { echo "Blad wykonania: " . $stmt->error; } $stmt->close(); $conn->close(); ?>
Wyjaśnienie: Przy Prepared Statements dane są wysyłane osobno od szablonu zapytania – silnik bazy danych nie traktuje ich jako kod SQL.

Zadanie 18: Aktualizacja danych (UPDATE)

Polecenie: Zaktualizuj nazwisko ucznia o wybranym ID, używając Prepared Statement.

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $nowe_nazwisko = "NoweNazwisko"; $id_ucznia = 1; $stmt = $conn->prepare( "UPDATE Uczniowie SET Nazwisko = ? WHERE ID = ?" ); $stmt->bind_param("si", $nowe_nazwisko, $id_ucznia); if ($stmt->execute()) { echo "Zaktualizowano dane dla ucznia ID: $id_ucznia."; } else { echo "Blad aktualizacji: " . $stmt->error; } $stmt->close(); $conn->close(); ?>

Zadanie 19: Usuwanie danych (DELETE)

Polecenie: Usuń ucznia o podanym ID, także używając Prepared Statement.

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $id_do_usuniecia = 2; $stmt = $conn->prepare( "DELETE FROM Uczniowie WHERE ID = ?" ); $stmt->bind_param("i", $id_do_usuniecia); if ($stmt->execute()) { echo "Usunieto ucznia o ID: $id_do_usuniecia."; } else { echo "Blad usuwania: " . $stmt->error; } $stmt->close(); $conn->close(); ?>

📊 4. Wyświetlanie danych w HTML (READ + HTML)

Zadanie 20: Tabela HTML z listą uczniów

Polecenie: Wyświetl listę uczniów w tabeli HTML z nagłówkami kolumn.

<?php require_once "dbconnect.php"; $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); $sql = "SELECT ID, Imie, Nazwisko FROM Uczniowie"; $result = $conn->query($sql); echo "<h3>Lista Uczniow</h3>"; echo "<table>"; echo "<thead><tr> <th>ID</th> <th>Imie</th> <th>Nazwisko</th> </tr></thead>"; echo "<tbody>"; if ($result && $result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row["ID"] . "</td>"; echo "<td>" . $row["Imie"] . "</td>"; echo "<td>" . $row["Nazwisko"] . "</td>"; echo "</tr>"; } } else { echo "<tr><td colspan='3'>Brak uczniow w bazie.</td></tr>"; } echo "</tbody>"; echo "</table>"; $conn->close(); ?>
Wyjaśnienie: Tabela HTML jest budowana dynamicznie – raz generujesz nagłówki, a w pętli dodajesz wiersze z danymi wczytanymi z bazy.