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:
- HTML5-Gerüst mit einer Überschrift
- Ein Absatz mit der PHP-Ausgabe:
<?php echo date('d.m.Y'); ?>
Aufgabe 2: Formularverarbeitung
- Nutze das bereits erstellte Adress-Formular und konfiguriere dieses auf die HTTP-Methode POST und den Skriptnamen: ausgabe.php
- Erstelle die Datei ausgabe.php mit der Eigenschaft:
- Ausgabe der Feldinhalte
- Nutzung der Funktion: htmlspecialchars() gegen XSS-Angriffe
- Nutze:
var_dump() und print_r()für Debugging-Zwecke
Aufgabe 3: SQLite
- Erstelle eine Webanwendung, welche Aufgaben an den Server senden kann.
- Der Server speichert die Aufgaben in einer SQlite-Datenbank
- Liste alle Aufgaben nach Erstellungsdatum auf
- Skript: erstelle_tabelle.php
// 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;
Datenbanknutzung
- Wir nutzen die filebasierte Datenbank SQLite mit einer Anbindung mittels PDO (PHP Data Objects).
- Vorteil von PDO: einfacher Umstieg auf MySQL
- Extensions müssen aktiviert sein: extension=pdo, pdo_sqlite
- SQlite nutzt intern Unicode, der PDO-Treiber standardmäßig UTF-8, seit PHP 5.6 ist UTF-8 Standard
- mögliche Fehlermodi: Silent, Warning, Exception -> wir nutzen Exception -> Fehler abfangen mittels try … catch
- wichtige PDO-Funktionen:
- exec(string $sql): direkte Ausführung von Befehlen ohne Result (INSERT, UPDATE,…)
- query(string $sql): liefert PDOStatement als Ergebnis
- prepare(string $sql): Vorbereitung einer SQL-Anweisung
- execute(): vorbereitetes Statement ausführen, optional mit Parameterübergabe
- bindParam(): Bindet eine Variable
- bindValue(): Bindet einen konkreten Wert
- fetch(): liefert eine Zeile des PDOStatments
- fetchAll(): liefert alle Zeilen des PDOStatements
- beginTransaction(): ACID - Atomicity, Consistency, Isolation, Durability
- commit/rollBack schreibt alle Änderungen oder verwirft alle Änderungen
- lastInsertId(): letzte ID
SQL-Aufgaben
- Auslesen von Daten: SELECT Vorname, Nachname FROM tbl_user
- Einfügen von Daten: INSERT
- Löschen von Daten: DELETE
- Ändern von Daten: UPDATE
- Filter: WHERE(Nachname=”Maier” AND Vorname=”Thomas”)
- Reihenfolge: ORDER BY Nachname
- Anzahl: LIMIT 10
// 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();
Literatur
Fakultativ
Die aktuelle Version ist nicht sicher gegen SQL-Injection, weil wir direkt den Text in die SQL-Anweisung einfügen. 👉 Zukunftsaufgabe: Ersetze die INSERT-Anweisung durch PDO mit Prepared Statements.
Letzte Änderung: 11. March 2026 17:07