Ćwiczenia 1-5: Podstawy SQL
1. Tworzenie tabeli
Zadanie: Utwórz tabelę produkty z kolumnami: id, nazwa, cena, opis.
Rozwiązanie
CREATE TABLE produkty (
id INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100),
cena DECIMAL(10,2),
opis TEXT
);
2. Dodawanie danych
Zadanie: Dodaj nowy produkt do tabeli produkty (np. nazwa: "Laptop", cena: 2500.00, opis: "Nowoczesny laptop").
Rozwiązanie
INSERT INTO produkty (nazwa, cena, opis)
VALUES ('Laptop', 2500.00, 'Nowoczesny laptop');
3. Wybieranie danych
Zadanie: Wyświetl wszystkie produkty z tabeli produkty.
Rozwiązanie
SELECT * FROM produkty;
4. Modyfikowanie danych
Zadanie: Zaktualizuj cenę produktu o id = 1, ustawiając cenę na 2200.00.
Rozwiązanie
UPDATE produkty
SET cena = 2200.00
WHERE id = 1;
5. Usuwanie danych
Zadanie: Usuń produkt z tabeli produkty o id = 1.
Rozwiązanie
DELETE FROM produkty
WHERE id = 1;
Ćwiczenia 6-10: Zaawansowane SQL
⚠️ **Uwaga:** Aby Ćwiczenie 6 działało, musisz najpierw utworzyć kolumnę kategoria_id i tabelę kategorie. Przykładowe zapytanie ALTER TABLE:
-- Utworzenie kolumny do łączenia (np. po wykonaniu Zadania 1)
ALTER TABLE produkty ADD kategoria_id INT;
6. Łączenie tabel (JOIN)
Zadanie: Wyświetl produkty razem z nazwą kategorii z tabeli kategorie, która ma kolumny id i nazwa.
Rozwiązanie (zakładając istnienie kolumny kategoria_id w tabeli produkty)
SELECT p.nazwa AS nazwa_produktu, p.cena, k.nazwa AS nazwa_kategorii
FROM produkty p
JOIN kategorie k ON p.kategoria_id = k.id;
7. Agregacja danych
Zadanie: Oblicz średnią cenę produktów w tabeli produkty.
Rozwiązanie
SELECT AVG(cena) AS srednia_cena FROM produkty;
8. Warunki w zapytaniach (WHERE)
Zadanie: Wyświetl wszystkie produkty, których cena jest mniejsza niż 1000 zł.
Rozwiązanie
SELECT * FROM produkty WHERE cena < 1000;
9. Grupowanie danych
Zadanie: Pogrupuj produkty w tabeli produkty po cenach, licząc ile produktów znajduje się w danej grupie cenowej.
Rozwiązanie
SELECT cena, COUNT(*) AS liczba_produktow
FROM produkty
GROUP BY cena;
10. Sortowanie wyników
Zadanie: Posortuj produkty według ceny w porządku rosnącym.
Rozwiązanie
SELECT * FROM produkty ORDER BY cena ASC;
Ćwiczenia 11-20: SQL + PHP
🚨 **Kluczowa Poprawka:** Rozwiązania PHP (zwłaszcza 12, 15, 16) powinny używać **Prepared Statements** (`$conn->prepare()`) dla bezpieczeństwa (ochrona przed SQL Injection). Poniższe rozwiązania zostały zaktualizowane, aby używały **bezpiecznej techniki mysqli**.
11. Formularz do dodawania produktów (HTML)
Zadanie: Stwórz formularz HTML do dodawania produktów (nazwa, cena, opis) do tabeli produkty.
Rozwiązanie (plik: dodaj.html)
<form action="dodaj.php" method="POST">
<label for="nazwa">Nazwa produktu</label>
<input type="text" id="nazwa" name="nazwa" required>
<label for="cena">Cena</label>
<input type="number" id="cena" name="cena" required step="0.01" min="0">
<label for="opis">Opis</label>
<textarea id="opis" name="opis"></textarea>
<input type="submit" value="Dodaj produkt">
</form>
12. Przetwarzanie formularza PHP (Bezpieczne!)
Zadanie: Zapisz dane z formularza dodawania produktu do tabeli produkty w bazie danych.
Rozwiązanie (plik: dodaj.php) - **Zabezpieczone przed SQL Injection**
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "moja_baza";
// Tworzenie połączenia
$conn = new mysqli($servername, $username, $password, $dbname);
// Sprawdzanie połączenia
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Pobieranie danych z formularza i sanityzacja
$nazwa = $_POST['nazwa'];
$cena = (float)$_POST['cena'];
$opis = $_POST['opis'];
// Wstawianie danych do tabeli za pomocą PREPARED STATEMENT
$sql = "INSERT INTO produkty (nazwa, cena, opis) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
// s: string (nazwa, opis), d: double (cena)
$stmt->bind_param("sds", $nazwa, $cena, $opis);
if ($stmt->execute() === TRUE) {
echo "Nowy produkt dodany pomyślnie!";
} else {
echo "Błąd: " . $stmt->error;
}
$stmt->close();
$conn->close();
?>
13. Wyświetlanie produktów w tabeli HTML
Zadanie: Wyświetl wszystkie produkty z tabeli produkty w formie tabeli HTML.
Rozwiązanie (plik: lista.php) - **Zabezpieczone przed XSS**
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "moja_baza";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, nazwa, cena, opis FROM produkty";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table>";
echo "<tr><th>ID</th><th>Nazwa</th><th>Cena</th><th>Opis</th></tr>";
while($row = $result->fetch_assoc()) {
// Użycie htmlspecialchars() zapobiega atakom XSS
$nazwa_bezpieczna = htmlspecialchars($row["nazwa"]);
$opis_bezpieczny = htmlspecialchars($row["opis"]);
echo "<tr>";
echo "<td>" . $row["id"]. "</td>";
echo "<td>" . $nazwa_bezpieczna . "</td>";
echo "<td>" . $row["cena"]. "</td>";
echo "<td>" . $opis_bezpieczny . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "0 wyników";
}
$conn->close();
?>
14. Formularz z walidacją danych (HTML + PHP)
Zadanie: Dodaj walidację formularza przed jego wysłaniem do bazy danych, sprawdzając czy wszystkie pola są wypełnione i czy cena jest liczbą dodatnią.
Rozwiązanie (plik: waliduj_dodaj.php) - Wymaga walidacji PHP + HTML
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$errors = [];
// Walidacja wypełnienia pól
if (empty($_POST['nazwa']) || empty($_POST['cena'])) {
$errors[] = "Nazwa i Cena są wymagane.";
}
// Walidacja ceny (czy jest liczbą i jest dodatnia)
$cena = filter_input(INPUT_POST, 'cena', FILTER_VALIDATE_FLOAT);
if ($cena === false || $cena <= 0) {
$errors[] = "Cena musi być liczbą dodatnią.";
}
if (empty($errors)) {
// Dodaj kod z Ćw. 12 (Prepared Statement) do zapisu w bazie
echo "<p style='color: green;'>Dane poprawne! Gotowe do zapisu w bazie.</p>";
} else {
foreach ($errors as $error) {
echo "<p style='color: red;'>BŁĄD: $error</p>";
}
}
}
?>
<!-- Formularz HTML z atrybutami walidacji: -->
<form action="" method="POST"> <!-- action="" wysyła do tego samego pliku -->
<label for="nazwa">Nazwa produktu</label>
<input type="text" id="nazwa" name="nazwa" required>
<label for="cena">Cena</label>
<input type="number" id="cena" name="cena" required step="0.01" min="0.01">
<label for="opis">Opis</label>
<textarea id="opis" name="opis"></textarea>
<input type="submit" value="Dodaj produkt">
</form>
15. Aktualizacja danych przez formularz (HTML)
Zadanie: Stwórz formularz do edycji danych produktu (zmiana ceny lub opisu) w bazie danych.
Rozwiązanie (plik: aktualizuj.html)
<form action="aktualizuj.php" method="POST">
<label for="id">ID produktu (wymagane do identyfikacji)</label>
<input type="number" id="id" name="id" required>
<h4>Wypełnij tylko pola do zmiany:</h4>
<label for="cena">Nowa Cena</label>
<input type="number" id="cena" name="cena" step="0.01" min="0">
<label for="opis">Nowy Opis</label>
<textarea id="opis" name="opis"></textarea>
<input type="submit" value="Aktualizuj">
</form>
16. Usuwanie produktu przez formularz (HTML)
Zadanie: Stwórz formularz do usuwania produktu na podstawie jego ID.
Rozwiązanie (plik: usun.html)
<form action="usun.php" method="POST">
<label for="id">ID produktu do usunięcia</label>
<input type="number" id="id" name="id" required>
<input type="submit" value="Usuń produkt" onclick="return confirm('Czy na pewno chcesz usunąć ten produkt?')">
</form>
17. Obsługa sesji w PHP (Korekta Startu)
Zadanie: Zastosuj sesje w PHP do przechowywania danych logowania użytkownika (np. ID, nazwisko, status). Sprawdź, czy użytkownik jest zalogowany przed wykonaniem akcji.
Rozwiązanie (plik: sesja.php) - **session_start() na początku!**
<?php
// session_start() MUSI być na początku pliku
session_start();
// Przykład sprawdzenia, czy użytkownik jest zalogowany
if (!isset($_SESSION['user_id'])) {
// Brak sesji - użytkownik niezalogowany
echo "<p style='color: red;'>Błąd dostępu: Musisz się zalogować!</p>";
} else {
// Użytkownik jest zalogowany
echo "<p style='color: green;'>Witaj " . htmlspecialchars($_SESSION['user_id']) . ". Możesz wykonać akcję.</p>";
}
?>
18. Logowanie użytkownika (HTML)
Zadanie: Stwórz formularz logowania, który pozwala użytkownikowi na zalogowanie się do systemu. Po zalogowaniu powinien pojawić się komunikat powitalny.
Rozwiązanie (plik: login.html)
<form action="login.php" method="POST">
<label for="username">Nazwa użytkownika</label>
<input type="text" id="username" name="username" required>
<label for="password">Hasło</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="Zaloguj">
</form>
19. Rejestracja użytkownika (HTML)
Zadanie: Stwórz formularz rejestracji użytkownika, który zapisuje dane w tabeli uzytkownicy (nazwa użytkownika, hasło, email).
Rozwiązanie (plik: register.html)
<form action="register.php" method="POST">
<label for="username">Nazwa użytkownika</label>
<input type="text" id="username" name="username" required>
<label for="email">E-mail</label>
<input type="email" id="email" name="email" required>
<label for="password">Hasło</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="Zarejestruj">
</form>
20. Filtrowanie wyników z formularza (HTML)
Zadanie: Zastosuj filtr w formularzu, który pozwala na wyszukiwanie produktów na podstawie nazwy.
Rozwiązanie (plik: filter.html)
<form action="lista.php" method="GET"> <!-- GET jest lepsze do filtrowania -->
<label for="nazwa_szukana">Szukaj produktu po nazwie</label>
<input type="text" id="nazwa_szukana" name="nazwa_szukana">
<input type="submit" value="Szukaj">
</form>