Compare commits
2 Commits
3ded7fe223
...
0e3c68542d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e3c68542d | ||
|
|
ae071b453c |
@@ -31,7 +31,7 @@
|
|||||||
echo "<pre> $yo </pre>";
|
echo "<pre> $yo </pre>";
|
||||||
|
|
||||||
// Äußere Schleife: Zeile auslesen
|
// Äußere Schleife: Zeile auslesen
|
||||||
while(!feof($fp)){ // solange nicht das Ende der Datei erreich
|
while(!feof($fp)){ // solange nicht das Ende der Datei erreicht ist
|
||||||
$row_array = fgetcsv($fp);
|
$row_array = fgetcsv($fp);
|
||||||
/* $yo2 = print_r($header_array);
|
/* $yo2 = print_r($header_array);
|
||||||
echo "<pre> $yo2 </pre>";*/
|
echo "<pre> $yo2 </pre>";*/
|
||||||
|
|||||||
131
lernen/ka-1-lbt3+4/README.MD
Normal file
131
lernen/ka-1-lbt3+4/README.MD
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# PHP Übungsaufgaben: PDO & File Handling
|
||||||
|
|
||||||
|
## PDO Aufgaben
|
||||||
|
|
||||||
|
### Aufgabe 1: Benutzerverwaltung mit PDO X
|
||||||
|
|
||||||
|
Erstelle ein Verwaltungssystem für Benutzer mit folgenden Features:
|
||||||
|
|
||||||
|
- Datenbank `benutzer_verwaltung` mit Tabelle `users` (id, username, email, created_at, status)
|
||||||
|
- CRUD-Operationen (Create, Read, Update, Delete) mit PDO
|
||||||
|
- Prepared Statements für alle Queries
|
||||||
|
- Error Handling mit try-catch
|
||||||
|
- Pagination für die Benutzeranzeige (20 Benutzer pro Seite)
|
||||||
|
|
||||||
|
**Bonusaufgabe:** Implementiere eine Suchfunktion, die nach username oder email filtert.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Aufgabe 2: Transaktionen und Rollback X
|
||||||
|
|
||||||
|
Erstelle ein Bestell-System mit zwei Tabellen:
|
||||||
|
|
||||||
|
- `produkte` (id, name, preis, lagerbestand)
|
||||||
|
- `bestellungen` (id, produkt_id, anzahl, datum)
|
||||||
|
|
||||||
|
Implementiere eine Bestellfunktion, die:
|
||||||
|
|
||||||
|
- Den Lagerbestand prüft
|
||||||
|
- Bei ausreichendem Lager eine Bestellung anlegt UND den Lagerbestand reduziert
|
||||||
|
- PDO-Transaktionen nutzt (beginTransaction, commit, rollback)
|
||||||
|
- Bei Fehlern oder fehlendem Lagerbestand einen Rollback durchführt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Handling Aufgaben
|
||||||
|
|
||||||
|
### Aufgabe 3: Log-System (TXT)
|
||||||
|
|
||||||
|
Entwickle ein mehrstufiges Logging-System:
|
||||||
|
|
||||||
|
- Schreibe Logs in verschiedene Dateien: `error.log`, `access.log`, `debug.log`
|
||||||
|
- Jeder Log-Eintrag enthält: Timestamp, Log-Level (ERROR/INFO/DEBUG), Nachricht
|
||||||
|
- Implementiere eine Funktion `writeLog($level, $message)`
|
||||||
|
- Erstelle eine Funktion, die die letzten N Zeilen einer Log-Datei ausliest
|
||||||
|
|
||||||
|
**Bonusaufgabe:** Implementiere Log-Rotation (wenn Datei > 1MB, erstelle neue Datei mit Timestamp).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Aufgabe 4: CSV Import/Export System
|
||||||
|
|
||||||
|
Erstelle ein System für Produktdaten:
|
||||||
|
|
||||||
|
- **Import:** Lese CSV-Datei mit Produkten (ID, Name, Preis, Kategorie) und importiere sie in eine Datenbank
|
||||||
|
- **Export:** Exportiere Datenbankeinträge als CSV-Datei
|
||||||
|
- Validierung der CSV-Daten (Preis muss numerisch sein, Pflichtfelder prüfen)
|
||||||
|
- Fehlerhafte Zeilen in separate `fehler.csv` schreiben
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Aufgabe 5: XML Konfigurationsdatei (XML)
|
||||||
|
|
||||||
|
Erstelle ein Konfigurations-Management-System:
|
||||||
|
|
||||||
|
- Lese eine XML-Konfigurationsdatei mit Datenbank-Verbindungsparametern, E-Mail-Settings, etc.
|
||||||
|
- Schreibe eine Klasse `ConfigManager`, die:
|
||||||
|
- XML mit SimpleXML oder DOMDocument parst
|
||||||
|
- Konfigurationswerte auslesen kann (`getConfig('database.host')`)
|
||||||
|
- Konfigurationswerte ändern und zurück in XML schreiben kann
|
||||||
|
- Erstelle eine Funktion, die XML nach JSON konvertiert
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kombinierte Aufgabe
|
||||||
|
|
||||||
|
### Aufgabe 6: Kontaktverwaltung mit Multi-Format Support
|
||||||
|
|
||||||
|
Entwickle eine vollständige Kontaktverwaltung:
|
||||||
|
|
||||||
|
- **Datenbank:** Tabelle `kontakte` (id, vorname, nachname, email, telefon, firma)
|
||||||
|
- **PDO:** Alle CRUD-Operationen mit PDO
|
||||||
|
- **Export-Funktionen:**
|
||||||
|
- Als CSV exportieren
|
||||||
|
- Als XML exportieren
|
||||||
|
- Als JSON exportieren (bonus)
|
||||||
|
- **Import-Funktionen:**
|
||||||
|
- CSV-Import mit Validierung
|
||||||
|
- XML-Import
|
||||||
|
- **Logging:** Alle Aktionen (Erstellen, Ändern, Löschen) in `contacts.log` protokollieren
|
||||||
|
|
||||||
|
**Anforderungen:**
|
||||||
|
|
||||||
|
- Fehlerbehandlung bei allen File- und DB-Operationen
|
||||||
|
- Prepared Statements für SQL
|
||||||
|
- Datei-Upload für CSV/XML-Import
|
||||||
|
- Benutzerfreundliche Fehler-/Erfolgsmeldungen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Zusätzliche Challenges
|
||||||
|
|
||||||
|
### Challenge 1: Backup-System
|
||||||
|
|
||||||
|
Erstelle ein automatisches Backup-System:
|
||||||
|
|
||||||
|
- Exportiere komplette Datenbank-Tabelle als SQL-Dump in TXT-Datei
|
||||||
|
- Komprimiere Backup mit ZIP
|
||||||
|
- Speichere mit Timestamp im Dateinamen
|
||||||
|
- Alte Backups (> 7 Tage) automatisch löschen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Challenge 2: XML-Feed-Parser
|
||||||
|
|
||||||
|
Erstelle einen RSS/XML-Feed-Parser:
|
||||||
|
|
||||||
|
- Parse einen externen XML-Feed (z.B. News-Feed)
|
||||||
|
- Speichere relevante Daten in Datenbank
|
||||||
|
- Aktualisiere nur neue Einträge (vermeide Duplikate)
|
||||||
|
- Erstelle einen eigenen XML-Feed aus den DB-Daten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Nutze immer Prepared Statements für SQL-Queries
|
||||||
|
- Implementiere ordentliches Error Handling
|
||||||
|
- Kommentiere deinen Code
|
||||||
|
- Teste alle Edge Cases (leere Dateien, fehlerhafte Daten, etc.)
|
||||||
|
|
||||||
|
Viel Erfolg! 🚀
|
||||||
3
lernen/ka-1-lbt3+4/access.log
Normal file
3
lernen/ka-1-lbt3+4/access.log
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
TIMESTAMP | LOG-LEVEL | NACHRICHT
|
||||||
|
Mon, 12 Jan 2026 22:17:35 +0100 | access | Es wurde nicht auf die Datei zugegriffen
|
||||||
|
Mon, 12 Jan 2026 22:20:11 +0100 | access | Es wurde nicht auf die Datei zugegriffen
|
||||||
40
lernen/ka-1-lbt3+4/aufgabe1.php
Normal file
40
lernen/ka-1-lbt3+4/aufgabe1.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
// datenbank heißt absichtlich lernenjahr2 und nicht benutzer_verwaltung
|
||||||
|
try {
|
||||||
|
$pdo = new PDO("mysql:host=localhost;dbname=lernenjahr2","root","deinPasswort");
|
||||||
|
|
||||||
|
|
||||||
|
// Tabelle erstellen
|
||||||
|
$createTable = $pdo ->exec('CREATE TABLE IF NOT EXISTS `user`(
|
||||||
|
id INTEGER AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
username VARCHAR(255),
|
||||||
|
email VARCHAR(255),
|
||||||
|
created_at TIME,
|
||||||
|
status VARCHAR(30)
|
||||||
|
);');
|
||||||
|
echo "TABLE CREATED (IF NOT EXISTS) <br>";
|
||||||
|
|
||||||
|
// CREATE USER
|
||||||
|
$createUser = $pdo ->exec('INSERT INTO user VALUES(
|
||||||
|
null,
|
||||||
|
"danielvici223",
|
||||||
|
"daniel@danielvici.com",
|
||||||
|
"11:00:00",
|
||||||
|
"active"
|
||||||
|
);');
|
||||||
|
|
||||||
|
echo "USER CREATED <br>";
|
||||||
|
// update haben wir nicht gemacht
|
||||||
|
|
||||||
|
// DELETE USER
|
||||||
|
$deleteUser = $pdo ->exec('DELETE FROM user WHERE id=1');
|
||||||
|
|
||||||
|
// pagination <- keine was das ist?
|
||||||
|
echo "USER 1 DELETED <br>";
|
||||||
|
|
||||||
|
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
echo "". $e ."";
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
49
lernen/ka-1-lbt3+4/aufgabe2.php
Normal file
49
lernen/ka-1-lbt3+4/aufgabe2.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
try {
|
||||||
|
$pdo = new PDO("mysql:host=localhost;dbname=lernenjahr2","root","deinPasswort");
|
||||||
|
|
||||||
|
$produkteTabelle = 'CREATE TABLE IF NOT EXISTS produkte (
|
||||||
|
id INTEGER AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name VARCHAR(255),
|
||||||
|
preis INTEGER,
|
||||||
|
lagerbestand INTEGER)';
|
||||||
|
|
||||||
|
$produkteBestellung = 'CREATE TABLE IF NOT EXISTS bestellungen (
|
||||||
|
id INTEGER AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
produkt_id INTEGER,
|
||||||
|
anzahl INTEGER,
|
||||||
|
datum DATE)';
|
||||||
|
|
||||||
|
$createTable = $pdo->exec($produkteTabelle);
|
||||||
|
echo "TABELLE produkte ERSTELLT <br>";
|
||||||
|
$createTable = $pdo->exec($produkteBestellung);
|
||||||
|
echo "TABELLE Bestellung ERSTELLT <br>";
|
||||||
|
|
||||||
|
$lagerbestandProProduktQuery = 'SELECT `name`, lagerbestand, id FROM produkte';
|
||||||
|
$lagerbestandProProdukt = $pdo->query($lagerbestandProProduktQuery)->fetchAll();
|
||||||
|
|
||||||
|
echo "<pre>";
|
||||||
|
print_r($lagerbestandProProdukt);
|
||||||
|
echo "</pre>";
|
||||||
|
|
||||||
|
foreach($lagerbestandProProdukt as $row){
|
||||||
|
if ($row[1] >= 1){
|
||||||
|
echo "Von '$row[0]' haben wir aktuell $row[1] (ID: $row[2]). <br>";
|
||||||
|
} else {
|
||||||
|
echo "Von '$row[0]' haben wir nichts mehr <br>";
|
||||||
|
$createBestellung = $pdo->exec("INSERT INTO bestellungen VALUES(
|
||||||
|
null,
|
||||||
|
$row[2],
|
||||||
|
999,
|
||||||
|
'2025-01-12'
|
||||||
|
)");
|
||||||
|
echo "Von '$row[0]' wurden 999 stück bestellt.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
echo "Error: ", $e->getMessage();
|
||||||
|
}
|
||||||
67
lernen/ka-1-lbt3+4/aufgabe3.php
Normal file
67
lernen/ka-1-lbt3+4/aufgabe3.php
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
ini_set("display_errors", "on");
|
||||||
|
|
||||||
|
echo "<h1>AUFGABE 3</h1>";
|
||||||
|
|
||||||
|
// file names
|
||||||
|
$error = "error.log";
|
||||||
|
$access = "access.log";
|
||||||
|
$debug = "debug.log";
|
||||||
|
|
||||||
|
// read function
|
||||||
|
function read($file){
|
||||||
|
$fileName = $file.".log";
|
||||||
|
$fp = fopen($fileName, 'r') or die ("Cannot open file"); // open file
|
||||||
|
$fileLineCount = count(file($fileName)); // count lines
|
||||||
|
// if file is empty
|
||||||
|
if ($fileLineCount == 0) {
|
||||||
|
echo "Datei '".$file.".log' ist leer <br>";
|
||||||
|
} else {
|
||||||
|
//echo "TIMESTAMP | LOG-LEVEL | NACHRICHT<br>";
|
||||||
|
foreach(file($fileName) as $line){
|
||||||
|
echo "$line<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeLog($level, $message){
|
||||||
|
$fileName = $level.".log";
|
||||||
|
$fp = fopen($fileName, 'a') or die ("Cannot open file");
|
||||||
|
// get current time
|
||||||
|
$now = date(DATE_RFC2822, time());
|
||||||
|
|
||||||
|
$fileLineCount = count(file($fileName)); // count lines
|
||||||
|
// if file is empty
|
||||||
|
if ($fileLineCount == 0) {
|
||||||
|
fwrite($fp, "TIMESTAMP | LOG-LEVEL | NACHRICHT\n");
|
||||||
|
}
|
||||||
|
$data = "$now | $level | $message\n";
|
||||||
|
fwrite($fp, $data);
|
||||||
|
echo "Wurde geloggt <br>";
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "<h2>READ LOGS BEFORE WRITE</h2>";
|
||||||
|
|
||||||
|
echo "<h3>Error Log</h3>";
|
||||||
|
read("error");
|
||||||
|
echo "<h3>Access Log</h3>";
|
||||||
|
read("access");
|
||||||
|
echo "<h3>Debug Log</h3>";
|
||||||
|
read("debug");
|
||||||
|
// ------------------------------------------
|
||||||
|
echo "<h2>WRITE LOGS</h2>";
|
||||||
|
|
||||||
|
writeLog("error", "Es gab kein Fehler");
|
||||||
|
writeLog("access", "Es wurde nicht auf die Datei zugegriffen");
|
||||||
|
writeLog("debug","Das ka.php wurde gedebugt");
|
||||||
|
// ------------------------------------------
|
||||||
|
echo "<h2>READ LOGS AFTER WRITE</h2>";
|
||||||
|
|
||||||
|
echo "<h3>Error Log</h3>";
|
||||||
|
read("error");
|
||||||
|
echo "<h3>Access Log</h3>";
|
||||||
|
read("access");
|
||||||
|
echo "<h3>Debug Log</h3>";
|
||||||
|
read("debug");
|
||||||
46
lernen/ka-1-lbt3+4/aufgabe4.php
Normal file
46
lernen/ka-1-lbt3+4/aufgabe4.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// ###########
|
||||||
|
// # WICHTIG #
|
||||||
|
// ###########
|
||||||
|
// geht nicht!
|
||||||
|
|
||||||
|
// Datei
|
||||||
|
$file = "produkt.csv";
|
||||||
|
|
||||||
|
if(!file_exists($file)){
|
||||||
|
die("File $file doesn't exist or not found!");
|
||||||
|
// Beende das Skript
|
||||||
|
}
|
||||||
|
|
||||||
|
$fp = @fopen($file, 'r'); // a -> all (read, write ...)
|
||||||
|
if(!$fp){
|
||||||
|
die("Error while opening file!");
|
||||||
|
}
|
||||||
|
|
||||||
|
$header = fgetcsv($fp, 0, ",");
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
// READ FILE
|
||||||
|
|
||||||
|
$fp = @fopen($file, "W");
|
||||||
|
|
||||||
|
$yo = print_r($header);
|
||||||
|
echo "<pre> $yo </pre>";
|
||||||
|
|
||||||
|
while(!feof($fp)){ // solange nicht das Ende der Datei erreicht ist
|
||||||
|
|
||||||
|
// Inner Schleife: Spalten ausgeben
|
||||||
|
for ($i = 0; $i < count($header); $i++){
|
||||||
|
echo "$header[$i]: $header[$i]<br>";
|
||||||
|
}
|
||||||
|
echo "<p> -------------------------------- </p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE TO FILE
|
||||||
|
|
||||||
|
//$row = [7, "NZXTKeyboard", 120, "Tastatur"];
|
||||||
|
// file, data (array), seperator
|
||||||
|
//fputcsv($fp, $row, ",");
|
||||||
|
|
||||||
3
lernen/ka-1-lbt3+4/debug.log
Normal file
3
lernen/ka-1-lbt3+4/debug.log
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
TIMESTAMP | LOG-LEVEL | NACHRICHT
|
||||||
|
Mon, 12 Jan 2026 22:17:35 +0100 | debug | Das ka.php wurde gedebugt
|
||||||
|
Mon, 12 Jan 2026 22:20:11 +0100 | debug | Das ka.php wurde gedebugt
|
||||||
31
lernen/ka-1-lbt3+4/docker-compose.yml
Normal file
31
lernen/ka-1-lbt3+4/docker-compose.yml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:latest
|
||||||
|
container_name: mysql-db
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: deinPasswort
|
||||||
|
MYSQL_DATABASE: testdb
|
||||||
|
MYSQL_USER: phpuser
|
||||||
|
MYSQL_PASSWORD: phpPasswort
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
volumes:
|
||||||
|
- mysql-data:/var/lib/mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
phpmyadmin:
|
||||||
|
image: phpmyadmin:latest
|
||||||
|
container_name: phpmyadmin
|
||||||
|
environment:
|
||||||
|
PMA_HOST: mysql
|
||||||
|
PMA_PORT: 3306
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
depends_on:
|
||||||
|
- mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mysql-data:
|
||||||
3
lernen/ka-1-lbt3+4/error.log
Normal file
3
lernen/ka-1-lbt3+4/error.log
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
TIMESTAMP | LOG-LEVEL | NACHRICHT
|
||||||
|
Mon, 12 Jan 2026 22:17:35 +0100 | error | Es gab kein Fehler
|
||||||
|
Mon, 12 Jan 2026 22:20:11 +0100 | error | Es gab kein Fehler
|
||||||
8
lernen/ka-1-lbt3+4/produkt.csv
Normal file
8
lernen/ka-1-lbt3+4/produkt.csv
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
ID,Name,Preis,Kategorie
|
||||||
|
1,"Mac Book",2600, pc
|
||||||
|
2,Spezi, 15, getränk
|
||||||
|
3,Watch, 500, uhr
|
||||||
|
4,iPhone,1500,Handy
|
||||||
|
5,"NZXT Mini",100,Tastatur
|
||||||
|
6,"NZXT Keyboard",120,Tastatur
|
||||||
|
7,NZXTKeyboard,120,Tastatur
|
||||||
|
Reference in New Issue
Block a user