CRUD i Bezpieczeństwo danych w PHP i MySQL

Cel zajęć: Uczeń potrafi tworzyć dynamiczne aplikacje WWW obsługujące bazę danych MySQL oraz stosować podstawowe zasady bezpieczeństwa danych w PHP.

1️⃣ Wprowadzenie teoretyczne – CRUD

Ważne: zawsze filtruj dane i używaj prepared statements, aby chronić aplikację przed SQL Injection.

2️⃣ Przygotowanie środowiska

  1. Uruchom XAMPP i włącz Apache oraz MySQL.
  2. W katalogu htdocs utwórz folder crud_php.
  3. Utwórz bazę danych i tabelę:
    CREATE DATABASE szkola;
    USE szkola;
    CREATE TABLE uczniowie (
      id INT AUTO_INCREMENT PRIMARY KEY,
      imie VARCHAR(50),
      nazwisko VARCHAR(50),
      klasa VARCHAR(10)
    );

3️⃣ Ćwiczenie 1 – Dodawanie rekordów (CREATE)

<?php
$conn = new mysqli("localhost","root","","szkola");
if($_SERVER["REQUEST_METHOD"]=="POST"){
  $imie=htmlspecialchars($_POST['imie']);
  $nazwisko=htmlspecialchars($_POST['nazwisko']);
  $klasa=htmlspecialchars($_POST['klasa']);
  $stmt=$conn->prepare("INSERT INTO uczniowie (imie,nazwisko,klasa) VALUES (?,?,?)");
  $stmt->bind_param("sss",$imie,$nazwisko,$klasa);
  $stmt->execute();
  echo "<p>Dodano ucznia!</p>";
}
?>

<form method="POST">
Imię: <input type="text" name="imie" required><br>
Nazwisko: <input type="text" name="nazwisko" required><br>
Klasa: <input type="text" name="klasa" required><br>
<input type="submit" value="Dodaj ucznia">
</form>

4️⃣ Ćwiczenie 2 – Wyświetlanie danych (READ)

<?php
$conn = new mysqli("localhost","root","","szkola");
$result = $conn->query("SELECT * FROM uczniowie");
?>

<table class="effect-table">
<tr><th>ID</th><th>Imię</th><th>Nazwisko</th><th>Klasa</th><th>Akcje</th></tr>
<?php while($row=$result->fetch_assoc()): ?>
<tr>
  <td><?= $row['id'] ?></td>
  <td><?= $row['imie'] ?></td>
  <td><?= $row['nazwisko'] ?></td>
  <td><?= $row['klasa'] ?></td>
  <td><a href="edytuj.php?id=<?= $row['id'] ?>">Edytuj</a> | <a href="usun.php?id=<?= $row['id'] ?>">Usuń</a></td>
</tr>
<?php endwhile; ?>
</table>

5️⃣ Bezpieczeństwo danych – filtrowanie i walidacja

<?php
$imie = filter_input(INPUT_POST,'imie',FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST,'email',FILTER_SANITIZE_EMAIL);
$wiek = filter_input(INPUT_POST,'wiek',FILTER_VALIDATE_INT);
if($imie && $email && $wiek){
    echo "✅ Dane poprawne!";
} else { echo "❌ Wprowadź poprawne dane!"; }
?>

<form method="POST">
Imię: <input type="text" name="imie"><br>
Email: <input type="email" name="email"><br>
Wiek: <input type="number" name="wiek"><br>
<button type="submit">Sprawdź dane</button>
</form>

6️⃣ Zabezpieczenie przed SQL Injection

<?php
$stmt=$conn->prepare("INSERT INTO uzytkownicy (imie,email) VALUES (?,?)");
$stmt->bind_param("ss",$imie,$email);
$imie=filter_input(INPUT_POST,'imie',FILTER_SANITIZE_STRING);
$email=filter_input(INPUT_POST,'email',FILTER_SANITIZE_EMAIL);
$stmt->execute();
echo "✅ Użytkownik dodany bezpiecznie!";
?>

7️⃣ Bezpieczne logowanie i haszowanie haseł

<?php
if(isset($_POST['register'])){
    $login=$_POST['login'];
    $haslo=password_hash($_POST['haslo'],PASSWORD_DEFAULT);
    $conn->query("INSERT INTO loginy (login,haslo) VALUES ('$login','$haslo')");
}
if(isset($_POST['login_submit'])){
    $login=$_POST['login'];
    $haslo=$_POST['haslo'];
    $res=$conn->query("SELECT * FROM loginy WHERE login='$login'");
    $row=$res->fetch_assoc();
    if($row && password_verify($haslo,$row['haslo'])){
        echo "🔓 Zalogowano!";
    } else { echo "❌ Błędne dane logowania."; }
}
?>