PHP - działaj z bazami danych

Samo potrzebne mięso do egzaminu, nic więcej.​

Twórz dynamiczne aplikacje webowe: obsługa formularzy, zmienne, pętle, funkcje, sesje, połączenie z bazą danych.

Wstęp – czym jest PHP i do czego służy?

PHP (PHP: Hypertext Preprocessor) to język skryptowy uruchamiany po stronie serwera, służący do tworzenia dynamicznych stron internetowych. Dzięki PHP strony mogą reagować na działania użytkownika, obsługiwać formularze, komunikować się z bazami danych, generować treści na podstawie danych czy zarządzać sesjami i plikami. PHP jest szeroko stosowany w systemach zarządzania treścią (CMS), sklepach internetowych, forach, blogach i portalach społecznościowych.

Ciekawostka

PHP został stworzony w 1994 roku przez Rasmusa Lerdorfa jako proste narzędzie do zliczania odwiedzin na jego stronie internetowej – początkowo nazywało się "Personal Home Page". Dziś PHP jest jednym z najpopularniejszych języków programowania na świecie i według różnych szacunków odpowiada za działanie nawet 77–80% wszystkich stron internetowych.

1. Odpalamy Maszynownię (Setup i absolutne podstawy)

Zanim napiszesz choćby linijkę kodu PHP, musisz zrozumieć jedną, kluczową rzecz: Twój komputer nie mówi w języku PHP. Musisz zainstalować mu tłumacza i stworzyć małe, kontrolowane środowisko, które udaje prawdziwy internet.

  • 1.1 Twoje Prywatne Centrum Dowodzenia: XAMPP

    Teoria: XAMPP to magiczna paczka, która instaluje na Twoim komputerze wszystko, czego potrzebujesz:

    • Serwer Apache: Kelner, który przyjmuje żądania od przeglądarki i podaje jej gotowe dania (strony HTML).
    • PHP: Kucharz, który na zapleczu (na serwerze) przygotowuje te dania według Twoich przepisów (skryptów .php).
    • MariaDB (MySQL): Ogromny, dobrze zorganizowany magazyn (baza danych), w którym trzymasz wszystkie swoje produkty (dane).

    Praktyka krok po kroku:

    1. Zainstaluj XAMPP.
    2. Uruchom XAMPP Control Panel. Zobaczysz listę modułów. Włącz (Start) dwa najważniejsze: Apache i MySQL. Jeśli świecą się na zielono, jesteś w domu.
    3. Znajdź folder htdocs w katalogu, gdzie zainstalowałeś XAMPP. To jest Twój „święty graal”. Wszystkie Twoje projekty muszą mieszkać tutaj.
    4. Dostęp: Stwórz w htdocs folder np. mojastrona. Aby zobaczyć swoją stronę, wpisz w przeglądarce adres: http://localhost/mojastrona.
    5. Zarządzanie bazą: Wejdź na http://localhost/phpmyadmin. To graficzny interfejs do Twojej bazy danych. Tutaj będziesz tworzyć tabele, przeglądać dane i sprawdzać, czy Twoje skrypty nie narobiły bałaganu.
  • 1.2 Składnia PHP: Rozmówki Polsko-Serwerowe

    Teoria: Kod PHP jest jak tajny agent w przebraniu. Żyje wewnątrz pliku HTML, ale jest zamknięty w specjalnych znacznikach <?php ... ?>. Wszystko poza nimi to zwykły HTML, który serwer ignoruje i po prostu wysyła do przeglądarki.

    Praktyka:

    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <title>Test PHP</title>
        <style>
            .pogrubiony { font-weight: bold; }
        </style>
    </head>
    <body>
        <h1>Dane wygenerowane przez serwer</h1>
    
        <?php
            // Zmienne ZAWSZE zaczynają się od $
            $nazwa_uzytkownika = "Mistrz Klawiatury";
            $poziom = 99;
    
            // 'echo' to Twój megafon - drukuje tekst do wynikowego HTML-a
            echo "<p>Witaj na serwerze, <span class='pogrubiony'>" . $nazwa_uzytkownika . "</span>!</p>";
    
            // Kropka (.) służy do łączenia tekstów (konkatenacji)
            echo "<p>Twój poziom zaawansowania: " . $poziom . "</p>";
        ?>
    
        <p>To jest zwykły HTML, PHP już skończył pracę.</p>
    </body>
    </html>
    

    Wskazówka: W PHP jest różnica między apostrofem (') a cudzysłowem ("). Tekst w cudzysłowie próbuje interpretować zmienne w środku (echo "Witaj $nazwa_uzytkownika"; zadziała), a tekst w apostrofie traktuje wszystko dosłownie (echo 'Witaj $nazwa_uzytkownika'; wyświetli nazwę zmiennej, a nie jej wartość).


2. Podstawy Języka PHP – Składamy Zdania

Zanim zaczniemy wydawać skomplikowane polecenia bazie danych, musimy opanować podstawową gramatykę PHP. To fundament, bez którego wszystko inne się posypie.

  • 2.1 Zmienne i Typy Danych

    Teoria: Zmienne to pojemniki na dane. W PHP nie musisz deklarować ich typu – język sam się domyśli, czy przechowujesz tekst, czy liczbę. Najważniejsze typy to:

    • String: Tekst, np. $imie = "Grażyna";
    • Integer: Liczba całkowita, np. $wiek = 50;
    • Float (lub double): Liczba zmiennoprzecinkowa, np. $cena_paczka = 12.99;
    • Boolean: Wartość logiczna, true lub false, np. $czy_ma_rabat = true;
    • Array: Tablica, czyli specjalny pojemnik na wiele wartości.
  • 2.2 Tablice (Array) – Twoja Skrzynka z Narzędziami

    Teoria: Tablice w PHP to super-bohaterowie. Mogą być prostą listą (jak w JS), ale ich prawdziwa moc tkwi w tablicach asocjacyjnych, gdzie sam nadajesz nazwy (klucze) swoim „szufladkom”.

    • Tablica indeksowana (numerycznie):
      $owoce = ["jabłko", "banan", "czereśnia"];
      echo "Drugi owoc na liście to: " . $owoce[1]; // banan (liczymy od zera!)
      
    • Tablica asocjacyjna (klucz => wartość):
      $dane_osobowe = [
          "imie" => "Jan",
          "nazwisko" => "Kowalski",
          "wiek" => 45
      ];
      echo $dane_osobowe["imie"] . " ma " . $dane_osobowe["wiek"] . " lat.";
      

    NA EGZAMINIE MUSISZ TO WIEDZIEĆ: Funkcja mysqli_fetch_assoc(), której używamy do pobierania danych z bazy, zwraca właśnie tablicę asocjacyjną, gdzie kluczami są nazwy kolumn z Twojej tabeli w bazie.

  • 2.3 Instrukcje Warunkowe (if, else)

    Teoria: Logika jest uniwersalna! Działa tak samo jak w JavaScripcie, zmienia się tylko kosmetyka (np. zmienne z $). Pozwala Twojemu kodowi podejmować decyzje.

    $punkty = 78;
    
    if ($punkty >= 90) {
        $ocena = "Bardzo dobry";
    } elseif ($punkty >= 70) {
        $ocena = "Dobry";
    } elseif ($punkty >= 50) {
        $ocena = "Dostateczny";
    } else {
        $ocena = "Niedostateczny";
    }
    echo "Twoja ocena końcowa: " . $ocena;
    
  • 2.4 Pętle – Zagonimy Serwer do Pracy

    Teoria: Pętle pozwalają wykonywać ten sam blok kodu wielokrotnie, oszczędzając nam pisania. W PHP najważniejszą pętlą do pracy z danymi jest foreach.

    • for – gdy znamy liczbę powtórzeń:
      for ($i = 1; $i <= 5; $i++) {
          echo "To jest powtórzenie numer " . $i . "<br>";
      }
      
    • foreach – idealna do przeglądania tablic: Ta pętla jest stworzona do pracy z tablicami. Sama przejdzie przez każdy element i udostępni go w tymczasowej zmiennej.
      // Przykład z tablicą asocjacyjną
      $dane_auta = ["marka" => "Audi", "model" => "A4", "rocznik" => 2020];
      
      echo "<ul>";
      foreach ($dane_auta as $klucz => $wartosc) {
          echo "<li><strong>" . ucfirst($klucz) . ":</strong> " . $wartosc . "</li>";
      }
      echo "</ul>";
      
  • 2.5 Funkcje – Twoje Własne Kapsułki z Kodem

    Teoria: Jeśli jakiś fragment kodu ma być użyty w kilku miejscach, zamykasz go w funkcji. Dajesz mu nazwę i od tej pory możesz go wywoływać, zamiast kopiować kod. 

    function oblicz_cene_brutto($cena_netto) {
        $vat = 0.23;
        $cena_brutto = $cena_netto * (1 + $vat);
        return round($cena_brutto, 2); // round() zaokrągla do 2 miejsc po przecinku
    }
    
    $cena_ksiazki_netto = 40.00;
    $cena_ksiazki_brutto = oblicz_cene_brutto($cena_ksiazki_netto);
    echo "Cena książki brutto: " . $cena_ksiazki_brutto . " zł"; // Wyświetli: 49.2 zł
    

3. Uzyskiwanie Audiencji u Króla (Połączenie z Bazą Danych)

Nie możesz tak po prostu wejść do magazynu i zacząć wynosić towary. Musisz mieć przepustkę i wiedzieć, do których drzwi zapukać.

  • 3.1 Plik connect.php – Twój Złoty Klucz

    Teoria: Dane do połączenia (host, user, hasło, nazwa bazy) to tajne informacje. Trzymanie ich w jednym, osobnym pliku ma dwie zalety: 1. Łatwo je zmienić w jednym miejscu. 2. Możesz ten plik dołączać do każdego innego skryptu, który potrzebuje dostępu do bazy – koniec z kopiowaniem tego samego kodu w kółko!

    Praktyka (plik connect.php):

    <?php
        // Definiujemy stałe z danymi do połączenia
        define('DB_HOST', 'localhost');
        define('DB_USER', 'root');
        define('DB_PASS', '');
        define('DB_NAME', 'sklep_inf03'); // Pamiętaj, żeby stworzyć tę bazę w phpMyAdmin!
    
        // Tworzymy obiekt połączenia przy użyciu rozszerzenia MySQLi
        $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
        // System wczesnego ostrzegania. Jeśli coś pójdzie nie tak...
        if (!$conn) {
            // die() to brutalna komenda. Zatrzymuje CAŁY skrypt i wyrzuca komunikat.
            // To dobrze, bo nie ma sensu kontynuować, jeśli nie ma połączenia z bazą.
            die("FATAL ERROR: Nie można połączyć się z bazą danych. Kod błędu: " . mysqli_connect_errno());
        }
    ?>
    

    Wskazówka: Użyj komendy require_once 'connect.php'; na początku każdego skryptu, który ma gadać z bazą. require_once jest lepsze niż include, bo jeśli pliku nie znajdzie, zatrzyma skrypt z błędem krytycznym – co jest pożądane w tym przypadku.


4. Inwentaryzacja (SELECT) – „Co macie na stanie?”

Czas wyciągnąć dane z bazy i pokazać je światu.

  • 4.1 Wyświetlanie Wszystkiego w Tabeli (Klasyk Egzaminacyjny)

    Teoria: Proces jest jak przepis na zupę: przygotuj składniki (SQL), ugotuj (wyślij zapytanie), a potem nakładaj do miseczek (pętla while z wyświetlaniem wierszy).

    Praktyka (plik lista_produktow.php):

    <?php require_once 'connect.php'; ?>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Lista Produktów</title>
        <style> table, th, td { border: 1px solid black; border-collapse: collapse; padding: 8px; } </style>
    </head>
    <body>
        <h2>Nasze Produkty</h2>
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Nazwa Produktu</th>
                    <th>Cena</th>
                </tr>
            </thead>
            <tbody>
                <?php
                    $sql = "SELECT id, nazwa, cena FROM produkty ORDER BY nazwa ASC";
                    $result = mysqli_query($conn, $sql);
    
                    if (mysqli_num_rows($result) > 0) {
                        // mysqli_fetch_assoc() pobiera JEDEN wiersz i zamienia go na tablicę, gdzie kluczami są nazwy kolumn.
                        // Pętla while wykonuje się tak długo, jak długo są jeszcze jakieś wiersze do pobrania.
                        while ($row = mysqli_fetch_assoc($result)) {
                            echo "<tr>";
                            echo "<td>" . $row['id'] . "</td>";
                            echo "<td>" . $row['nazwa'] . "</td>";
                            echo "<td>" . $row['cena'] . " zł</td>";
                            echo "</tr>";
                        }
                    } else {
                        echo "<tr><td colspan='3'>Brak produktów w bazie danych.</td></tr>";
                    }
                ?>
            </tbody>
        </table>
        <?php mysqli_close($conn); // Po robocie zawsze zamykaj połączenie! ?>
    </body>
    </html>
    
  • 4.2 Wyświetlanie Jednego Bohatera (WHERE)

    Teoria: Aby zobaczyć szczegóły jednego produktu, musimy go jakoś zidentyfikować, najczęściej po jego unikalnym ID, które przekazujemy w adresie URL (np. szczegoly.php?id=7). Dane z adresu URL odczytujemy w PHP za pomocą superglobalnej tablicy $_GET.

    Praktyka (plik szczegoly.php):

    <?php
        require_once 'connect.php';
        // Pobieramy ID z adresu URL i RZUTUJEMY je na liczbę całkowitą.
        // To proste zabezpieczenie, by nikt nie wstrzyknął tam tekstu.
        $produkt_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
    
        if ($produkt_id > 0) {
            // ... przygotowanie i wykonanie zapytania z WHERE id = $produkt_id ...
        } else {
            echo "Nieprawidłowe ID produktu.";
        }
    ?>
    

5. Przyjęcie Dostawy i Remanent (INSERT, UPDATE)

Czas na aktywne zmiany w bazie – dodawanie i modyfikowanie danych.

  • 5.1 INSERT i Rytuał Bezpieczeństwa (Prepared Statements)

    PUŁAPKA EGZAMINACYJNA: Wklejanie zmiennych prosto do zapytania SQL (INSERT INTO ... VALUES ('$nazwa', '$cena')) to proszenie się o kłopoty. To jak zostawienie otwartych drzwi do magazynu z napisem „ZAPRASZAMY ZŁODZIEI”. Atak SQL Injection polega na tym, że ktoś w polu formularza zamiast imienia wpisze złośliwy kod SQL.

    NA EGZAMINIE MUSISZ TO WIEDZIEĆ: Prepared Statements (Zapytania Przygotowane) to Twoja tarcza. Proces jest jak tworzenie formularza do wypełnienia:

    1. Przygotuj (prepare): Wysyłasz do bazy szablon zapytania ze znakami zapytania ? w miejscach na dane.
    2. Podepnij (bind_param): Mówisz bazie: „pod pierwszy ? wstaw tę zmienną (która jest tekstem), a pod drugi ? tę (która jest liczbą)”. Baza sama zadba o bezpieczeństwo tych danych.
    3. Wykonaj (execute): Mówisz „OK, teraz wykonaj przygotowane polecenie”.
  • 5.2 UPDATE – Edycja Danych w Dwóch Krokach

    Teoria: Edycja to taniec. Krok 1: Pokaż, co edytujesz. Krok 2: Zapisz zmiany.

    • Krok 1 (plik edytuj.php?id=X):
      1. Pobierz dane rekordu o ID=X z bazy (SELECT ... WHERE id = X).
      2. Stwórz formularz HTML.
      3. Wypełnij pola formularza pobranymi danymi, używając atrybutu value. <input type="text" name="nazwa" value="<?php echo $row['nazwa']; ?>">
      4. Koniecznie dodaj ukryte pole z ID: <input type="hidden" name="id" value="<?php echo $row['id']; ?>">, żeby skrypt aktualizujący wiedział, który wiersz ma zmienić.
    • Krok 2 (plik aktualizuj.php):
      1. Odbierz dane z formularza ($_POST['id'], $_POST['nazwa'], itd.).
      2. Użyj zapytania UPDATE produkty SET nazwa = ?, cena = ? WHERE id = ?.
      3. Wykonaj „rytuał bezpieczeństwa” z prepare, bind_param i execute.
      4. Po sukcesie przekieruj użytkownika (header('Location: lista_produktow.php');) z powrotem na listę, żeby zobaczył efekty swojej pracy.

6. Usuwanie (DELETE) – „Wylatujesz!”

To najprostsza, ale i najbardziej niszczycielska operacja.

  • 6.1 Jak Bezpiecznie Coś Usunąć?

    Teoria: Klauzula WHERE w zapytaniu DELETE to Twój jedyny hamulec bezpieczeństwa. Jej brak to cyfrowy odpowiednik naciśnięcia przycisku „samozniszczenie” dla całej tabeli.

    Praktyka (link na liście produktów):

    <td>
        <a href="usun.php?id=<?php echo $row['id']; ?>" onclick="return confirm('Czy na pewno chcesz usunąć ten produkt?');">
            Usuń
        </a>
    </td>
    
    • onclick="...": To mały kawałek JavaScriptu. confirm() wyświetla okienko z pytaniem. Jeśli użytkownik kliknie „Anuluj”, funkcja zwróci false i przeglądarka nie przejdzie pod wskazany link. Proste, a chroni przed przypadkowymi kliknięciami!
    • Skrypt usun.php wykonuje zapytanie DELETE FROM produkty WHERE id = ? z użyciem prepare, bind_param i execute, a na koniec przekierowuje z powrotem na listę.

To wszystko!
Teraz czas na przerobienie wcześniejszych egzaminów.
Powodzenia!