Tworzenie Raportów i Dynamicznych Stron

INF.03.7 (3) — Agregacja danych i prezentacja informacji

Idea Od Danych do Informacji

Raportowanie to proces przekształcania surowych danych z bazy (np. lista wszystkich transakcji) w użyteczne, skondensowane informacje (np. sumaryczny przychód w danym miesiącu). Osiągamy to dzięki zaawansowanym zapytaniom SQL i formatowaniu wyników w PHP.

  • Prosty Raport: Zestawienie tabelaryczne wszystkich rekordów (SELECT *).
  • Dynamiczny Raport: Zestawienie filtrowane, grupujące dane i obliczające statystyki (SUM, COUNT, GROUP BY).
  • Dynamiczna Strona: Strona, której treść zmienia się w zależności od parametrów URL (np. `produkt.php?id=5`).

SQL Funkcje Agregujące (GROUP BY)

Aby tworzyć raporty podsumowujące (np. ile produktów jest w każdej kategorii), musimy użyć funkcji agregujących SQL.

Kluczowe Funkcje SQL

  • COUNT(): Liczy liczbę wierszy (rekordów).
  • SUM(): Sumuje wartości w kolumnie.
  • AVG(): Oblicza średnią wartość.
  • GROUP BY: Grupuje wyniki na podstawie wartości w kolumnie, dzięki czemu funkcje agregujące działają na każdej grupie osobno.

Przykład: Raport Sprzedaży wg Kategorii

Chcemy wiedzieć, ile zamówień zrealizowano w każdej kategorii produktów.

SELECT
    k.nazwa_kategorii,
    COUNT(z.id) AS liczba_zamowien,
    SUM(z.cena) AS laczny_przychód
FROM zamowienia z
INNER JOIN produkty p ON z.produkt_id = p.id
INNER JOIN kategorie k ON p.kategoria_id = k.id
GROUP BY k.nazwa_kategorii
ORDER BY laczny_przychód DESC;

PHP Generowanie Prostej Tabeli Raportowej

Wykorzystujemy pętlę `while` w PHP, aby iterować po wynikach zwróconych przez bazę i dynamicznie tworzyć wiersze tabeli HTML (<tr>).

Kod PHP dla prostego raportu (Tabela Produktów)

<table class="report-table">
    <tr><th>Nazwa</th><th>Cena</th><th>Status</th></tr>
    <?php
    $stmt = $pdo->query('SELECT nazwa, cena, dostepny FROM produkty');
    while ($row = $stmt->fetch()):
        $status_kolor = ($row['dostepny'] == 1) ? 'green' : 'red';
    ?>
    <tr>
        <td><?php echo htmlspecialchars($row['nazwa']); ?></td>
        <td><?php echo number_format($row['cena'], 2); ?> zł</td>
        <td style="color:<?php echo $status_kolor; ?>">
            <?php echo ($row['dostepny'] == 1) ? 'Dostępny' : 'Brak'; ?>
        </td>
    </tr>
    <?php endwhile; ?>
</table>

Dynamiczne Filtrowanie Raportów

Aby uczynić raporty dynamicznymi, używamy zmiennych z `$_GET` do filtrowania wyników w zapytaniu SQL. Wymaga to użycia Prepared Statements w celu zapewnienia bezpieczeństwa.

Przykład: Filtrowanie po statusie i cenie (Ponadpodstawowe)

<?php
    $warunki = " WHERE 1"; // Zaczynamy od zawsze prawdziwego warunku
    $parametry = [];

    // Filtrowanie po cenie (jeśli parametr 'max_cena' istnieje w URL)
    if (isset($_GET['max_cena']) && is_numeric($_GET['max_cena'])) {
        $warunki .= " AND cena <= ?";
        $parametry[] = $_GET['max_cena'];
    }

    $sql = "SELECT nazwa, cena FROM produkty" . $warunki . " ORDER BY cena DESC";
    $stmt = $pdo->prepare($sql);
    // Wykonanie zapytania z tablicą parametrów
    $stmt->execute($parametry);

    echo "<p>Liczba wyników: " . $stmt->rowCount() . "</p>";
    // ... następuje wyświetlanie tabeli...
?>

Ćwiczenie Zadania Praktyczne

Zadanie 1: Prosty Raport Użytkowników (Podstawowe)

Załóż, że masz tabelę users (id, login, data_rejestracji). Stwórz prosty raport.

Zadanie 2: Raport Złożony z Agregacją (Ponadpodstawowe)

Załóż, że masz tabelę oceny (id, uczen_id, przedmiot, ocena).

Materiały Narzędzia i Linki

  • W3Schools SQL: SQL GROUP BY (Wizualne przykłady grupowania danych).
  • PHP Manual: number_format() (Formatowanie liczb do prezentacji).
  • Tworzenie dynamicznego SQL: Zawsze używaj Prepared Statements, nawet jeśli filtrujesz dane z $_GET, aby uniknąć SQL Injection.
Materiały: Tworzenie Raportów i Dynamicznych Stron · Opracowanie na podstawie wymagań INF.03 | Autor: Tomasz Puchała (toloki.pl)