Rechnernetze / Kommunikationssysteme

Praktikumsversuch PHP

Dieses Praktikum dient der praktischen Erprobung von PHP.

Entwicklungsserver

Zum Testen der eigenen PHP-Programme kann ein lokaler Server verwendet werden (VSCode, XAMPP, php -S). Das fertige Programm kann über den Webserver der Fakultät Informatik/Mathematik genutzt werden.

Aufgabe 1: PHP-Datei erstellen

Erstellen Sie die Datei hallo.php mit folgendem Inhalt:

Aufgabe 2: Formularverarbeitung

<?php
// Erlaubt nur Skripte von der eigenen Domain und blockiert Inline-JavaScript
header("Content-Security-Policy: default-src 'self'; script-src 'self'");
?>

Aufgabe 3: Datenbanknutzung

Datenbank-Abstraktionsschicht PDO (PHP Data Objects)

Grundlegenden SQL-Operationen (CRUD: Create, Read, Update, Delete):

Optionen

Codebeispiele für verschiedene Datenbankoperationen:

// absoluter Pfad des aktuellen Arbeitsverzeichnisses
$dbFile = __DIR__ . '/scores.db';  
// Nutzung des PDP-Interfaces mit dem SQlite-Treiber
try {
  $pdo = new PDO('sqlite:' . $dbFile);
  // Options
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);        // Exceptions on
  $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE=> PDO::FETCH_ASSOC); // fetch mit asssoziativem Array
  } catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => 'Datenbank‑Fehler: ' . $e->getMessage()]);
    exit;
}
  
// Tabelle anlegen
// Heredoc‑Syntax mit Kennung SQL
$createTableSQL = <<<SQL
CREATE TABLE IF NOT EXISTS scores (
    id         INTEGER PRIMARY KEY AUTOINCREMENT,
    name       TEXT NOT NULL UNIQUE,
    points     INTEGER NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
SQL;
$pdo->exec($createTableSQL);


// 1. Direktes Query (SELECT)
foreach ($pdo->query('SELECT id, name FROM users') as $row) {
    echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}

// 2. Exec (INSERT/UPDATE/DELETE ohne Rückgabe)
$affected = $pdo->exec('DELETE FROM sessions WHERE expires < datetime(\'now\')');

// 3. Prepared Statement mit benannten Parametern
$stmt = $pdo->prepare('SELECT * FROM posts WHERE author = :author AND created > :date');
$stmt->execute([':author' => $author, ':date' => $date]);
$posts = $stmt->fetchAll();   // bereits assoziativ dank DEFAULT_FETCH_MODE

// 4. Transaktion
$pdo->beginTransaction();
try {
    $pdo->exec('INSERT INTO orders (user_id,total) VALUES (1,99.95)');
    $pdo->exec('UPDATE users SET balance = balance - 99.95 WHERE id = 1');
    $pdo->commit();
} catch (PDOException $e) {
    $pdo->rollBack();
    throw $e; // oder loggen
}

// 5. Letzte Insert‑ID
$newId = $pdo->lastInsertId();

Aufgabe 3.1: Highscore per Formular

Aufgabe 3.2: Highscore per Ajax

Aufgabe 3.3 Highscore per REST-API

Beispiel für .htaccess

# Erlaube HTTP-Methoden
<Limit GET POST PUT DELETE OPTIONS HEAD>
    Require all granted
</Limit>

RewriteEngine On
# Leitet Anfragen wie /api/users an index.php weiter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Beispiel für PHP-Skript

<?php
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Origin: *");


// Methode ermitteln (GET, POST, etc.)
$method = $_SERVER['REQUEST_METHOD'];
$request_uri = $_SERVER['REQUEST_URI'];

echo "Anfrage-Pfad: " . $request_uri;


// Beispieldaten (würden normalerweise aus einer DB kommen)
$users = [
    ["id" => 1, "name" => "Max Mustermann"],
    ["id" => 2, "name" => "Erika Musterfrau"]
];

switch ($method) {
    case 'GET':
        // Rückgabe aller Benutzer
        echo json_encode($users);
        break;

    case 'POST':
        // Neuen Benutzer empfangen (simuliert)
        $input = json_decode(file_get_contents('php://input'), true);
        if (!empty($input['name'])) {
            http_response_code(201); // Created
            echo json_encode(["message" => "Benutzer erstellt", "data" => $input]);
        } else {
            http_response_code(400); // Bad Request
            echo json_encode(["error" => "Name fehlt"]);
        }
        break;

    default:
        http_response_code(405); // Method Not Allowed
        echo json_encode(["error" => "Methode nicht erlaubt"]);
        break;
}
?>

Ergebnisse

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Aufgabenliste</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        h1 { color: #333; }
        form { margin: 20px 0; }
        input[type="text"] { padding: 8px; width: 300px; }
        button { padding: 8px 16px; background: #007BFF; color: white; border: none; cursor: pointer; }
        button:hover { background: #0056b3; }
        ul { list-style: none; padding: 0; }
        li { padding: 10px; border-bottom: 1px solid #eee; }
        .zeit { font-size: 0.8em; color: #666; }
    </style>
</head>
<body>

<h1>Meine Aufgabenliste</h1>

<!-- Formular zum Hinzufügen einer neuen Aufgabe -->
<form method="POST" action="">
    <input type="text" name="aufgabe" placeholder="Neue Aufgabe eingeben..." required>
    <button type="submit">Hinzufügen</button>
</form>

<?php
// Verbindung zur SQLite-Datenbank
$db = new SQLite3('aufgaben.db');

// Neue Aufgabe hinzufügen (wenn Formular abgeschickt wurde)
if ($_POST['aufgabe']) {
    $aufgabe = $_POST['aufgabe'];
    $sql = "INSERT INTO aufgaben (aufgabe) VALUES ('$aufgabe')";
    
    if ($db->exec($sql)) {
        echo "<p><strong>✅ Aufgabe hinzugefügt!</strong></p>";
    } else {
        echo "<p><strong>❌ Fehler beim Hinzufügen.</strong></p>";
    }
}

// Aufgaben aus der Datenbank abrufen und anzeigen
$sql = "SELECT * FROM aufgaben ORDER BY erstellt DESC";
$result = $db->query($sql);

echo "<h2>Aufgaben:</h2>";
if ($result->numRows() > 0) {
    echo "<ul>";
    while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
        echo "<li>";
        echo htmlspecialchars($row['aufgabe']);
        echo " <span class='zeit'>(" . $row['erstellt'] . ")</span>";
        echo "</li>";
    }
    echo "</ul>";
} else {
    echo "<p>Keine Aufgaben vorhanden.</p>";
}

// Verbindung schließen
$db->close();
?>

</body>
</html>

// 1. Verbindung herstellen
$db = new PDO('sqlite:./datei.db');

// 2. SQL-Befehl mit Platzhalter vorbereiten
$stmt = $db->prepare("INSERT INTO tabelle (spalte) VALUES (:wert)");

// 3. Daten sicher ausführen
$stmt->execute([':wert' => $userEingabe]);

// 4. Ergebnisse abrufen
$result = $db->query("SELECT * FROM tabelle");
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
    echo $row['spalte'];
}

Aufgabe 3: SQLite

// SQL-Befehl zur Erstellung der Tabelle
$sql = <<<SQL
CREATE TABLE IF NOT EXISTS aufgaben (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    aufgabe TEXT NOT NULL,
    erstellt DATETIME DEFAULT CURRENT_TIMESTAMP
);
SQL;