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

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;
}
?>