Tworzenie Raportów i Dynamicznych Stron
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.
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)
<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)
$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.