Compare commits
13 Commits
a1040bd5db
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11a260008e | ||
|
|
ec20b28fc4 | ||
|
|
19c2ba6e1f | ||
|
|
be93d16a61 | ||
|
|
0e3c68542d | ||
|
|
ae071b453c | ||
|
|
3ded7fe223 | ||
|
|
b540d8a11a | ||
|
|
cc73d75998 | ||
|
|
cb023b88de | ||
|
|
e59c3c4e59 | ||
|
|
3a3c99701f | ||
|
|
576d664240 |
111
Zweites Jahr/Kryptologie/caeser-verschluesselung.php
Normal file
111
Zweites Jahr/Kryptologie/caeser-verschluesselung.php
Normal file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
// WIP
|
||||
|
||||
// Caesar-Chiffre Funktion
|
||||
function caesar($text, $shift) {
|
||||
|
||||
$textArr = str_split($text, 1);
|
||||
// definition is gewohnheit aus angular
|
||||
$textAscii = [];
|
||||
$resAscii = [];
|
||||
$resArr = [];
|
||||
|
||||
for($i = 0; $i > count($textArr); $i++){
|
||||
// jeder buchstabe des textes wird zum array,
|
||||
// in dessen ascii zeichen, $resAscii hinzugefügt
|
||||
array_push($textAscii, ord($textArr[$i]));
|
||||
// verschiebung
|
||||
$resAscii[$i] =+ $shift;
|
||||
// ascii buchstaben werden in ein wort gemacht
|
||||
array_push($resArr, chr($resAscii[$i]));
|
||||
}
|
||||
// aus array ein wort machen
|
||||
$result = implode("", $resArr);
|
||||
|
||||
$yo = print_r($textArr);
|
||||
echo "<pre> $yo </pre>";
|
||||
$yo = print_r($textAscii);
|
||||
echo "<pre> $yo </pre>";
|
||||
$yo = print_r($resAscii);
|
||||
echo "<pre> $yo </pre>";
|
||||
$yo = print_r($resArr);
|
||||
echo "<pre> $yo </pre>";
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
// Formularverarbeitung
|
||||
$output = "";
|
||||
$text = "";
|
||||
$shift = 0;
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$text = $_POST["text"] ?? "";
|
||||
$shift = intval($_POST["shift"] ?? 0);
|
||||
|
||||
if (isset($_POST["encrypt"])) {
|
||||
$output = caesar($text, $shift);
|
||||
}
|
||||
|
||||
if (isset($_POST["decrypt"])) {
|
||||
$output = caesar($text, -$shift);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Caesar Chiffre</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background: #f4f4f4;
|
||||
padding: 30px;
|
||||
}
|
||||
.box {
|
||||
background: white;
|
||||
padding: 20px;
|
||||
max-width: 500px;
|
||||
margin: auto;
|
||||
border-radius: 8px;
|
||||
}
|
||||
textarea, input {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
button {
|
||||
padding: 10px 20px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
label{
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="box">
|
||||
<h2>Caesar Chiffre</h2>
|
||||
|
||||
<form method="post">
|
||||
<label for="text">Nachricht:</label>
|
||||
<textarea name="text" rows="4"><?= htmlspecialchars($text) ?></textarea>
|
||||
|
||||
<label>Verschiebung:</label>
|
||||
<input type="number" name="shift" min = 1 max = 26 value="<?= htmlspecialchars($shift) ?>">
|
||||
<!--<input type="number" name="shift" value="<?= htmlspecialchars($shift) ?>">-->
|
||||
|
||||
<button type="submit" name="encrypt">Verschlüsseln</button>
|
||||
<button type="submit" name="decrypt">Entschlüsseln</button>
|
||||
|
||||
<label for="result"> Verschlüsselte Nachricht:</label>
|
||||
<textarea name="result" rows="4" readonly><?= htmlspecialchars($output ?: $text) ?></textarea>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -5,7 +5,20 @@
|
||||
Wichtige Informationen
|
||||
|
||||
- Wir eventuell nie aktuell sein.
|
||||
- Stundenplan - [Link](https://wvss-mannheim.webuntis.com/WebUntis?school=wvss-mannheim#/basic/timetablePublic/class?date=2025-12-08&entityId=2583)
|
||||
- Stundenplan - [Link](https://wvss-mannheim.webuntis.com/WebUntis/?school=wvss-mannheim#/basic/timetablePublic/class?entityId=2583)
|
||||
|
||||
|
||||
## 16-01-26 - PHP
|
||||
- Modulo
|
||||
|
||||
## 14-01-26 - PHP
|
||||
- Kryptologie (LBT3)
|
||||
|
||||
## 12-12-25 - PHP (SQL)
|
||||
- Aufgabe von gester überarbeitet
|
||||
- Unterrichts Projekt:
|
||||
- Verschiedene wege um daten aus db anzuzeigen
|
||||
- Form um user anzulegen
|
||||
|
||||
## 11-12-25 - PHP (XML)
|
||||
- XML aus PHP erstellt
|
||||
@@ -36,7 +49,7 @@ Wichtige Informationen
|
||||
|
||||
### 18-11-25 - PHP
|
||||
|
||||
- Datein lesen
|
||||
- Datein lesen CSV
|
||||
|
||||
### Davor
|
||||
|
||||
|
||||
@@ -27,8 +27,6 @@ if(!$fp){
|
||||
$header_array =fgetcsv($fp, 0, ";");
|
||||
|
||||
|
||||
print_r($header_array);
|
||||
|
||||
// CREATE XML DOM
|
||||
$xmlDoc = new DOMDocument("1.0", "utf-8");
|
||||
$xmlDoc->formatOutput=true;
|
||||
@@ -55,7 +53,6 @@ while(($row_array = fgetcsv($fp, 0, ";")) !== false){
|
||||
|
||||
// get current collumn
|
||||
$column = $header_array[$i];
|
||||
echo "$row_array[$i]<br>";
|
||||
|
||||
// create a new element with name of column and row data
|
||||
$xmlSchuelerDaten = $xmlDoc->createElement($column, $row_array[$i]);
|
||||
@@ -66,5 +63,7 @@ while(($row_array = fgetcsv($fp, 0, ";")) !== false){
|
||||
}
|
||||
|
||||
// Save whole XML file
|
||||
$fileXml = "e2fi2.xml";
|
||||
$xmlDoc->save(__DIR__ . "/$fileXml");
|
||||
$fileXML = "e2fi2.xml";
|
||||
$xmlDoc->save(__DIR__ . "/$fileXML");
|
||||
|
||||
echo "CSV FILE ($fileCSV) CONVERTED TO XML ($fileXML) AND SAVED";
|
||||
@@ -0,0 +1,6 @@
|
||||
SELECT book.bibNr, book.titel, COUNT(book.bibNr) AS ausleihAnzahl
|
||||
FROM buch as book
|
||||
LEFT JOIN Ausleihe as rent ON book.bibNr = rent.bibNr
|
||||
AND YEAR(rent.ausleihdatum) = 2015
|
||||
GROUP BY book.bibNr, book.titel
|
||||
ORDER BY ausleihAnzahl ASC
|
||||
@@ -0,0 +1,4 @@
|
||||
SELECT bibNr, COUNT(*) AS orderAnzahl
|
||||
FROM Ausleihe
|
||||
GROUP BY bibNr
|
||||
HAVING COUNT(*) > 10;
|
||||
61
Zweites Jahr/aufgaben/saveLibaryDataInXml/task.md
Normal file
61
Zweites Jahr/aufgaben/saveLibaryDataInXml/task.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# 2.2 XML
|
||||
|
||||
## 2.2.1
|
||||
|
||||
- Namen sind klar und deutlich
|
||||
- inhaltlich korrekt geordnet
|
||||
|
||||
## 2.2.2
|
||||
|
||||
````xml
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data>
|
||||
<buch>
|
||||
<bibNr> </bibNr>
|
||||
<title> </title>
|
||||
<zustand> </zustand>
|
||||
<seitenanzahl> </seitenanzahl>
|
||||
</buch>
|
||||
<avmedium>
|
||||
<bibNr> </bibNr>
|
||||
<title> </title>
|
||||
<zustand> </zustand>
|
||||
<dauer> </dauer>
|
||||
</avmedium>
|
||||
</data>
|
||||
````
|
||||
|
||||
### 2.3 SQL
|
||||
|
||||
## 2.3.1
|
||||
### Meine Lösung
|
||||
```sql
|
||||
SELECT book.bibNr, book.titel, COUNT(book.bibNr) AS wieOftAusgeliehen
|
||||
FROM buch AS book
|
||||
LEFT JOIN Ausleihe AS rent ON book.bibNr = rent.bibNr
|
||||
AND YEAR(rent.ausleihdatum) = 2015
|
||||
GROUP BY book.bibNr, book.titel
|
||||
ORDER BY wieOftAusgeliehen ASC
|
||||
```
|
||||
### Lösung des Lehrers
|
||||
```sql
|
||||
SELECT a.bibNr, b.titel, COUNT(*) AS wieOftAusgeliehen
|
||||
FROM Ausleihe, Buch
|
||||
WHERE AUsleihe.bibNr=Buch.bibNr
|
||||
WHERE Aulsiehe.ausleihdatum BETWEEN "2015-01-01" AND "2015-12-32"
|
||||
GROUP BY bibNr, titel
|
||||
ORDER BY COUNT(*) DESC;
|
||||
```
|
||||
|
||||
## 2.3.2
|
||||
|
||||
```sql
|
||||
SELECT bibNr, COUNT(*) AS orderAnzahl
|
||||
FROM Ausleihe
|
||||
GROUP BY bibNr
|
||||
HAVING COUNT(*) > 10; -- HAVING bei solchen funktionen
|
||||
```
|
||||
|
||||
## 2.3.3
|
||||
|
||||
Gute Frage, frag chatgpt!
|
||||
27
Zweites Jahr/aus_anderen_Faechern/subnetze.md
Normal file
27
Zweites Jahr/aus_anderen_Faechern/subnetze.md
Normal file
@@ -0,0 +1,27 @@
|
||||
Sufix - Maske - Max IPs
|
||||
|
||||
/29 - / - 8
|
||||
/28 - / - 16
|
||||
/27 - / - 32
|
||||
/26 - / - 64
|
||||
/25 - 255.255.255.128 - 128
|
||||
/24 - 255.255.255.0 - 255
|
||||
/23 - 255.255.254.0 - 511
|
||||
/22 - 255.255.252.0 - 1024
|
||||
/21 - 255.255.248.0 - 2048
|
||||
/20
|
||||
|
||||
|
||||
|
||||
---
|
||||
bsp. /21 -> 21x 1
|
||||
|
||||
Dez - Binär - Anzahl 1
|
||||
255 - 1111 1111 - 8
|
||||
255 - 1111 1111 - 8
|
||||
248 - 1111 1000 - 5
|
||||
|
||||
|
||||
|
||||
128|64|32|16 | 8|4|2|1
|
||||
|
||||
59
Zweites Jahr/aus_anderen_Faechern/vlsm_übung.md
Normal file
59
Zweites Jahr/aus_anderen_Faechern/vlsm_übung.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# VLSM Übung
|
||||
## Übung 1
|
||||
|
||||
Netz: 10.10.32.0/20
|
||||
|
||||
Netze zu erstellen:
|
||||
|
||||
A - 1022 /22
|
||||
B - 400 /23
|
||||
C - 63 /25
|
||||
D - 12 /28
|
||||
|
||||
Sonstige Anweisungen
|
||||
|
||||
Nach größe Sortieren
|
||||
|
||||
### Netz A:
|
||||
10.10.32.0/21 - 10.10.39.255
|
||||
|
||||
Subnetsmaske:
|
||||
255.255.248.0
|
||||
|
||||
|
||||
#### Rechnung
|
||||
|
||||
Subnetzmaske:
|
||||
Address in Binär
|
||||
0000 1010 . 0000 1010 . 0010 0000 . 0000 0000
|
||||
Letzte Adresse (in Binär & Normal)
|
||||
0000 1010 . 0000 1010 . 0010 0111 . 1111 1111
|
||||
10.10.39.255
|
||||
Subnetmaske in Binär
|
||||
1111 1111 . 1111 1111 . 1111 1000 . 0000 0000
|
||||
|
||||
|
||||
### Netz B:
|
||||
10.10.40.0/23 - 10.10.41.255
|
||||
255.255.254.0
|
||||
|
||||
### Netz C:
|
||||
10.10.42.0/25 - 10.10.42.127
|
||||
|
||||
255.255.255. 1000 0000 -> 128
|
||||
10.10.42. 0111 1111 -> 127
|
||||
|
||||
### Netz D:
|
||||
|
||||
10.10.42.128/28 - 10.10.42.143
|
||||
255.255.255. 1111 0000 -> 240 (Subnetzmaske)
|
||||
10.10.42. 1000 1111 (Bis IP)
|
||||
|
||||
> Info zur Bis IP
|
||||
> Alle 1 wurden zu 0 und alle 0 wurden zu 1 aber
|
||||
> nicht in der 4 Gruppe sondern nun in der 8 Gruppe
|
||||
|
||||
Vergleich Von - Bis (Binär)
|
||||
10.10.42.
|
||||
0000 1010 . 0000 1010 . 0010 1010 . 0111 1111
|
||||
0000 1010 . 0000 1010 . 0010 1010 . 1000 1111
|
||||
@@ -31,7 +31,7 @@
|
||||
echo "<pre> $yo </pre>";
|
||||
|
||||
// Ä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);
|
||||
/* $yo2 = print_r($header_array);
|
||||
echo "<pre> $yo2 </pre>";*/
|
||||
|
||||
26
Zweites Jahr/modulo.php
Normal file
26
Zweites Jahr/modulo.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
$ergebnis = (int)(7/2);
|
||||
echo $ergebnis."<br>";
|
||||
|
||||
$ergebnis = 7%3;
|
||||
echo "Restwert: ".$ergebnis."<br>";
|
||||
|
||||
// Ist ZAhl gerade?
|
||||
|
||||
$zahl = 5;
|
||||
|
||||
if($zahl % 2 == 0)echo "$zahl is gerade.<br>";
|
||||
else echo "$zahl ist ungerade.<br>";
|
||||
|
||||
// LEtze Zahl einer ZAhl ermitteln
|
||||
|
||||
$zahl = 123;
|
||||
|
||||
echo $zahl % 10; // In Zahl steht 3 wenn $zahl%=3
|
||||
|
||||
echo "<br>".$zahl."<br>";
|
||||
|
||||
echo (int)($zahl/10); // 123 -> 12
|
||||
@@ -15,13 +15,18 @@
|
||||
// verbindet sich mit der datenbank
|
||||
$dbh = db_connect();
|
||||
|
||||
// get data from fields:
|
||||
$u_firstname = $_REQUEST['firstname'];
|
||||
$u_lastname = $_REQUEST['lastname'];
|
||||
$u_email = $_REQUEST['email'];
|
||||
|
||||
// definiert den SQL befehl um
|
||||
// einen Nutzer korrekt in der DB anzulegen
|
||||
$addUser="INSERT INTO user VALUES(
|
||||
NULL,
|
||||
'HANS',
|
||||
'WORST',
|
||||
'hans@wor.st'
|
||||
'$u_firstname',
|
||||
'$u_lastname',
|
||||
'$u_email'
|
||||
)";
|
||||
|
||||
// Versucht code auszufügen (try{...}) wenn das fehlschlägt
|
||||
@@ -53,6 +58,8 @@
|
||||
// ####################################
|
||||
// read records from db
|
||||
|
||||
// result consists of multiple rows and columns
|
||||
|
||||
// wähle * (alles) aus 'user' (tabelle)
|
||||
$readUser = "SELECT * FROM user";
|
||||
|
||||
@@ -65,10 +72,12 @@
|
||||
echo "<pre>";
|
||||
print_r($resultReadUser);
|
||||
echo "</pre>";
|
||||
*/
|
||||
|
||||
ODER
|
||||
|
||||
// speicher das ergebnis in der variable,
|
||||
// führe den SQL befehl aus
|
||||
*/
|
||||
$resultReadUser = $dbh->query($readUser);
|
||||
|
||||
// gebe alles aus dem array aus
|
||||
@@ -77,6 +86,36 @@
|
||||
echo "$row[0] | $row[1] | $row[2] | $row[3]<br>";
|
||||
}
|
||||
|
||||
// ---
|
||||
// result consists of one row and multiple columns
|
||||
// gibt eine spalte
|
||||
$UserID = 1;
|
||||
$getUserById = "SELECT * FROM user WHERE u_id = $UserID";
|
||||
$resultGetUserById = $dbh->query($getUserById)->fetch();
|
||||
echo "<pre>";
|
||||
print_r($resultGetUserById);
|
||||
echo "</pre>";
|
||||
|
||||
echo "<p>Search User ID $UserID:</p>";
|
||||
if($resultGetUserById){
|
||||
echo "<p>User found: {$resultGetUserById['u_firstname']} {$resultGetUserById['u_lastname']}</p>";
|
||||
} else {
|
||||
echo "<p>No User found</p>";
|
||||
}
|
||||
|
||||
// ---
|
||||
// result represents one cell
|
||||
// gibt eine zelle zurück
|
||||
$getFirstnameByUserId = "SELECT u_firstname FROM user WHERE u_id = $UserID ";
|
||||
$resultFristnameByUserId = $dbh->query($getFirstnameByUserId)->fetchColumn();
|
||||
|
||||
echo "<p>Search Firstname of User ID $UserID:</p>";
|
||||
if($resultFristnameByUserId){
|
||||
echo "<p>Firstname of User found: $resultFristnameByUserId</p>";
|
||||
} else {
|
||||
echo "<p>No User found</p>";
|
||||
}
|
||||
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
24
Zweites Jahr/unterrichts_projekt/pdo_test_form.php
Normal file
24
Zweites Jahr/unterrichts_projekt/pdo_test_form.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>PDO Testset</h1>
|
||||
<h2>Entry Form</h2>
|
||||
<p>Please insert your data and press 'save'</p>
|
||||
<form action = "pdo_test.php">
|
||||
<label>Firstname:
|
||||
<input name = "firstname">
|
||||
</label><br>
|
||||
<label>Lastname:
|
||||
<input name = "lastname">
|
||||
</label><br>
|
||||
<label>Email:
|
||||
<input name = "email">
|
||||
</label><br>
|
||||
<button>Save!</button>
|
||||
</body>
|
||||
</html>
|
||||
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) X
|
||||
|
||||
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");
|
||||
47
lernen/ka-1-lbt3+4/aufgabe4.php
Normal file
47
lernen/ka-1-lbt3+4/aufgabe4.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
// ###########
|
||||
// # WICHTIG #
|
||||
// ###########
|
||||
// geht nicht!
|
||||
|
||||
ini_set("display_errors", "on");
|
||||
|
||||
// Datei
|
||||
$file = "produkt.csv";
|
||||
|
||||
if(!file_exists($file)){
|
||||
die("File $file doesn't exist or not found!");
|
||||
// Beende das Skript
|
||||
}
|
||||
|
||||
$fp = @fopen($file, 'r');
|
||||
if(!$fp){
|
||||
die("Error while opening file!");
|
||||
}
|
||||
|
||||
$header = fgetcsv($fp);
|
||||
|
||||
|
||||
// READ FILE <- GEHT NICHT
|
||||
|
||||
$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>";
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
|
||||
// WRITE TO FILE <- GEHT
|
||||
// $fp = @fopen($file, "W");
|
||||
//$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