2
0

Compare commits

...

21 Commits

Author SHA1 Message Date
Schuledaniel
11a260008e add stuff of 16. Jan 26 2026-01-16 08:15:01 +01:00
Schuledaniel
ec20b28fc4 Update README.md 2026-01-14 14:17:15 +01:00
Schuledaniel
19c2ba6e1f task of LBT3 2026-01-14 14:04:25 +01:00
cwikladaniel
be93d16a61 learning school, task 4 not working 2026-01-13 10:42:20 +01:00
danielvici123
0e3c68542d Merge remote-tracking branch 'origin/main' 2026-01-12 22:58:52 +01:00
danielvici123
ae071b453c learning, task4/6
4 -> not working
5,6 -> not done yet
2026-01-12 22:58:40 +01:00
danielvici123
3ded7fe223 Update Zweites Jahr/README.md 2026-01-12 20:40:25 +00:00
danielvici123
b540d8a11a Update Zweites Jahr/README.md 2026-01-10 14:00:49 +00:00
Schuledaniel
cc73d75998 update Zweites Jahr/README.md for today 2025-12-12 08:29:33 +01:00
Schuledaniel
cb023b88de add form for creating user, multiple ways to display conten of db 2025-12-12 08:27:08 +01:00
Schuledaniel
e59c3c4e59 change task from tomorrow 2025-12-12 07:53:10 +01:00
cwikladaniel
3a3c99701f add task two of today 2025-12-11 12:30:05 +01:00
cwikladaniel
576d664240 remove array outputs and add confirmation 2025-12-11 11:40:54 +01:00
cwikladaniel
a1040bd5db read/write xml file in php, task 2025-12-11 11:35:44 +01:00
Schuledaniel
d26d5ea4a7 add: one line of explaination 2025-12-10 15:09:47 +01:00
Schuledaniel
b98c0037f7 add: one line of explaination 2025-12-10 15:05:14 +01:00
Schuledaniel
4413283006 add: read, write data to database + some explainations 2025-12-10 15:04:05 +01:00
Schuledaniel
385226a4a3 LBT3: begin project 2025-12-10 13:53:48 +01:00
f5408a6ad0 Update Zweites Jahr/README.md 2025-12-10 12:19:12 +00:00
Schuledaniel
58b1ff7eef Merge branch 'main' of https://git.danielvici.com/admin/schule 2025-12-10 13:08:59 +01:00
Schuledaniel
688c610a85 datenbanken in php, aufgabe a2-a5 2025-12-09 14:29:59 +01:00
35 changed files with 1386 additions and 33 deletions

View 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>

View File

@@ -1,27 +1,55 @@
# Zweites Jahr
## Infos
## Gemacht
*Wir eventuell nie aktuell sein.*
Wichtige Informationen
- Wir eventuell nie aktuell sein.
- 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
- CSV Datei in XML Datei konvertiert
## 10-12-25 - PHP
- Unterrichtsprojekt begonnen:
- Verbindung zur Datenbank
## 9-12-25 - PHP (SQL)
- Datenbank durch PHP erstellt und Daten hinzufügen
### 21-11-25 - PHP
- Aufgabe von gestern Kontroliert + Kommentare hinzugefügt
- XML von AP1 Aufgabe
- Aufgabe von gestern Kontroliert + Kommentare hinzugefügt
- XML von AP1 Aufgabe
### 20-11-25 - PHP
- GETTER in PHP
- Übung zu OOP
- GETTER in PHP
- Übung zu OOP
### 19-11-25 - PHP
- Übung Datei lesen/schreiben (Log Access)
- Übung Datei lesen/schreiben (Log Access)
### 18-11-25 - PHP
- Datein lesen
- Datein lesen CSV
### Davor

View File

@@ -0,0 +1,65 @@
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personen>
<benutzer>
<benutzername>maier1</benutzername>
<passwort>mXabc123m!</passwort>
<vorname>Hubertus</vorname>
<nachname>Maier</nachname>
<email>maier1@bfpohg.de</email>
</benutzer>
<benutzer> ... </benutzer>
</personen>
*/
// create xml docs
$xmlDoc = new DOMDocument("1.0", "utf-8");
$xmlDoc->formatOutput=true;
// Root element
$xmlRoot = $xmlDoc->createElement("personen");
$xmlDoc->appendChild($xmlRoot);
// first node - benutzer
$xmlPerson = $xmlDoc->createElement("benutzer");
// child node of benutzer: benutzername
$xmlBenutzername = $xmlDoc->createElement("benutzername", "Daniel");
$xmlPerson->appendChild($xmlBenutzername);
// child node of benutzer: passwort
$xmlPasswort = $xmlDoc->createElement("passwort", "danielISTcool");
$xmlPerson->appendChild($xmlPasswort);
// append node to root
$xmlRoot->appendChild($xmlPerson);
// --- SECOND USER ---
// second node - benutzer
$xmlPerson = $xmlDoc->createElement("benutzer");
// child node of benutzer: benutzername
$xmlBenutzername = $xmlDoc->createElement("benutzername", "Peter");
$xmlPerson->appendChild($xmlBenutzername);
// child node of benutzer: passwort
$xmlPasswort = $xmlDoc->createElement("passwort", "12345");
$xmlPerson->appendChild($xmlPasswort);
// append node to root
$xmlRoot->appendChild($xmlPerson);
// create file
$bytes = $xmlDoc->save(__DIR__ . "/personen.xml");
var_dump($bytes);
echo $bytes . "<br>";
echo __DIR__;
?>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<personen>
<benutzer>
<benutzername>Daniel</benutzername>
<passwort>danielISTcool</passwort>
</benutzer>
<benutzer>
<benutzername>Peter</benutzername>
<passwort>12345</passwort>
</benutzer>
</personen>

View File

@@ -0,0 +1,36 @@
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
echo "<h1>XML Ausgabe</h1>";
// load xml file
$xmlDoc = new DOMDocument();
$xmlDoc->load("personen.xml");
echo "<h2>Einfach</h1>";
// simple output
echo $xmlDoc->saveXML();
echo "<hr>";
echo "<h2>Gesamte Knoten</h1>";
// output of individual nodes
$benutzer=$xmlDoc->getElementsByTagName("benutzer");
foreach($benutzer as $benutzerDaten){
echo "<strong>Person: </strong>".$benutzerDaten->textContent."<br>";
}
echo "<hr>";
echo "<h2>Element eines Knotens</h1>";
// output of an node's element
foreach($benutzer as $benutzerDaten){
foreach($benutzerDaten->childNodes as $element){
if($element->nodeName == "benutzername"){
echo "<strong>Person: </strong>".$element->textContent."<br>";
}
}
}

View File

@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PDO SQL Schritte</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
text-align: center;
padding: 20px;
}
.container {
display: flex;
flex-direction: row;
justify-content: center;
gap: 20px;
margin-top: 30px;
flex-wrap: nowrap;
}
.step {
background-color: white;
padding: 20px;
width: 170px;
border: 2px solid #ccc;
border-radius: 10px;
cursor: pointer;
transition: 0.3s;
}
.step:hover {
background-color: #e5f4ff;
}
.info-box {
background-color: white;
border: 2px solid #ccc;
border-radius: 10px;
padding: 20px;
width: 60%;
margin: 40px auto 0 auto;
display: none;
}
.code-snippet {
background: #f0f0f0;
padding: 10px;
border-radius: 8px;
text-align: left;
white-space: pre-wrap;
font-family: monospace;
}
</style>
</head>
<body>
<h1>PDO - Grundlegende SQL-Kommandos</h1>
<div class="container">
<div class="step" data-step="tryCatch">
<h2>try catch</h2>
<p>besseres finden von Fehlern</p>
</div>
<div class="step" data-step="connect">
<h2>PDO verbinden</h2>
<p>Datenbank verbinden</p>
</div>
<div class="step" data-step="create">
<h2>CREATE TABLE</h2>
<p>Tabelle anlegen</p>
</div>
<div class="step" data-step="insert">
<h2>INSERT</h2>
<p>Daten einfügen</p>
</div>
<div class="step" data-step="select">
<h2>SELECT</h2>
<p>Daten lesen</p>
</div>
<div class="step" data-step="delete">
<h2>DELETE</h2>
<p>Daten löschen</p>
</div>
</div>
<div id="info-box" class="info-box">
<h2 id="info-title"></h2>
<p id="info-text"></p>
<pre id="code-snippet" class="code-snippet"></pre>
</div>
<script>
const steps = {
tryCatch: {
title:"try{}catch{}",
desc:"Benutze try und catch um Fehler besser erkennen zu können",
code:`try{\n$pdo = new PDO("mysql:host=localhost;dbname=testdb","root","");\n}catch(PDOException $e){\necho $e->getMessage();\n}`
},
connect: {
title: "PDO Verbindung",
desc: "So stellst du eine einfache Verbindung zu MySQL her.",
code: `Wenn die Datenbank bereits existiert:\n\n<?php\n\ &dollarpdo = new PDO("mysql:host=localhost;dbname=testdb", "root", "");\necho "Verbindung erfolgreich!";\n?>\n\nWenn die Datenbank noch nicht exisitert:\n\n<?php\n$pdo = new PDO("mysql:host=localhost", "root", "");\n$pdo->exec("CREATE DATABASE IF NOT EXISTS testdb");\n$pdo = new PDO("mysql:host=localhost;dbname=testdb","root","");\n?>\n?>`
},
create: {
title: "CREATE TABLE",
desc: "Eine neue Tabelle namens 'users' erstellen.",
code: `<?php\n$sql = "CREATE TABLE users (\n id INT AUTO_INCREMENT PRIMARY KEY,\n username VARCHAR(50),\n email VARCHAR(100)\n)";\n$pdo->exec($sql);\necho "Tabelle 'users' wurde erstellt!";\n?>`
},
insert: {
title: "INSERT",
desc: "Einen Datensatz in die Tabelle einfügen.",
code: `<?php\n$sql = "INSERT INTO person VALUES (\n 'value1'\n 'value2';\n .....\n );\n";\n$pdo->exec($sql)\n?>`
},
select: {
title: "SELECT",
desc: "Daten aus der Tabelle auslesen.",
code: `<?php\n$sql = "SELECT * FROM users";\n$result = $pdo->query($sql);\n\n$valuesArray=$values->fetchAll();\necho"<pre>";\nprint_r($valluesArray);\necho"</pre>"; "<br>";\n}\n?>`
},
delete: {
title: "DELETE",
desc: "Ein Benutzer wird gelöscht (hier: ID = 1).",
code: `<?php\n$sql = "DELETE FROM users WHERE id = 1";\n$pdo->exec($sql);\necho "Benutzer mit ID 1 gelöscht!";\n?>`
}
};
document.querySelectorAll(".step").forEach(box => {
box.addEventListener("click", () => {
const key = box.dataset.step;
document.getElementById("info-title").textContent = steps[key].title;
document.getElementById("info-text").textContent = steps[key].desc;
document.getElementById("code-snippet").textContent = steps[key].code;
document.getElementById("info-box").style.display = "block";
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,69 @@
<h1>CSV -> XML</h1>
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
// DOM struktur
/*
<?xml version="1.0" encoding="utf-8"?>
<personen>
<nr> </nr>
<vorname> </vorname>
<nachname> </nachname>
</personen
*/
// READ CSV FILE
$fileCSV = "e2fi2.csv";
if(!file_exists($fileCSV)){
die("File $fileCSV doesn't exist or not found!");
}
$fp = @fopen($fileCSV, 'r');
if(!$fp){
die("Error while opening CSV file!");
}
$header_array =fgetcsv($fp, 0, ";");
// CREATE XML DOM
$xmlDoc = new DOMDocument("1.0", "utf-8");
$xmlDoc->formatOutput=true;
$xmlRoot = $xmlDoc->createElement("data");
$xmlDoc->appendChild($xmlRoot);
// FILL XML FILE WITH CSV DATA
while(($row_array = fgetcsv($fp, 0, ";")) !== false){
// skip emty value
if ($row_array === null || $row_array === []) {
continue;
}
// create sub elemente
$xmlSchueler = $xmlDoc->createElement("schuelerdata");
// for the count of elements in a row do this
for ($i = 0; $i < count($row_array); $i++){
// make sure there is a header to row
if (!isset($header_array[$i])){
continue;
}
// get current collumn
$column = $header_array[$i];
// create a new element with name of column and row data
$xmlSchuelerDaten = $xmlDoc->createElement($column, $row_array[$i]);
$xmlSchueler->appendChild($xmlSchuelerDaten);
}
// save element
$xmlRoot-> appendChild($xmlSchueler);
}
// Save whole XML file
$fileXML = "e2fi2.xml";
$xmlDoc->save(__DIR__ . "/$fileXML");
echo "CSV FILE ($fileCSV) CONVERTED TO XML ($fileXML) AND SAVED";

View File

@@ -0,0 +1,19 @@
Nr;Vorname;Nachname
1;Noah;Bassmann
2;Dawid;Brueller
3;Maksim;Dessauer
4;Jonas;Gassenhauer
5;Klara;Goettinger
6;Marc;Hausmueller
7;Timo;Heiterberg
8;Johannes;Kachelmann
9;Konstantin;Matern
10;Anna;Manna
11;Kamil;Nether
12;Tobias;Scholz
13;Eric;Schmidt
14;Ferdinand;Tetris
15;Damien;Tapfer
16;Uemit;Toser
17;Sebastian;Wenger
18;Fabio;Wellenwein
1 Nr Vorname Nachname
2 1 Noah Bassmann
3 2 Dawid Brueller
4 3 Maksim Dessauer
5 4 Jonas Gassenhauer
6 5 Klara Goettinger
7 6 Marc Hausmueller
8 7 Timo Heiterberg
9 8 Johannes Kachelmann
10 9 Konstantin Matern
11 10 Anna Manna
12 11 Kamil Nether
13 12 Tobias Scholz
14 13 Eric Schmidt
15 14 Ferdinand Tetris
16 15 Damien Tapfer
17 16 Uemit Toser
18 17 Sebastian Wenger
19 18 Fabio Wellenwein

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<data>
<schuelerdata>
<Nr>1</Nr>
<Vorname>Noah</Vorname>
<Nachname>Bassmann</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>2</Nr>
<Vorname>Dawid</Vorname>
<Nachname>Brueller</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>3</Nr>
<Vorname>Maksim</Vorname>
<Nachname>Dessauer</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>4</Nr>
<Vorname>Jonas</Vorname>
<Nachname>Gassenhauer</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>5</Nr>
<Vorname>Klara</Vorname>
<Nachname>Goettinger</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>6</Nr>
<Vorname>Marc</Vorname>
<Nachname>Hausmueller</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>7</Nr>
<Vorname>Timo</Vorname>
<Nachname>Heiterberg</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>8</Nr>
<Vorname>Johannes</Vorname>
<Nachname>Kachelmann</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>9</Nr>
<Vorname>Konstantin</Vorname>
<Nachname>Matern</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>10</Nr>
<Vorname>Anna</Vorname>
<Nachname>Manna</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>11</Nr>
<Vorname>Kamil</Vorname>
<Nachname>Nether</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>12</Nr>
<Vorname>Tobias</Vorname>
<Nachname>Scholz</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>13</Nr>
<Vorname>Eric</Vorname>
<Nachname>Schmidt</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>14</Nr>
<Vorname>Ferdinand</Vorname>
<Nachname>Tetris</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>15</Nr>
<Vorname>Damien</Vorname>
<Nachname>Tapfer</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>16</Nr>
<Vorname>Uemit</Vorname>
<Nachname>Toser</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>17</Nr>
<Vorname>Sebastian</Vorname>
<Nachname>Wenger</Nachname>
</schuelerdata>
<schuelerdata>
<Nr>18</Nr>
<Vorname>Fabio</Vorname>
<Nachname>Wellenwein</Nachname>
</schuelerdata>
</data>

View File

@@ -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

View File

@@ -0,0 +1,4 @@
SELECT bibNr, COUNT(*) AS orderAnzahl
FROM Ausleihe
GROUP BY bibNr
HAVING COUNT(*) > 10;

View 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!

View 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

View 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

View File

@@ -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
View 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

View File

@@ -0,0 +1,25 @@
<?php
// USERNAME, password
//$pdo = new PDO("mysql:host=localhost", "phpmyadmin", "server");
$pdo = new PDO("mysql:host=localhost;dbname=person","phpmyadmin","server");
$createTable= 'CREATE TABLE IF NOT EXISTS schueler(
id INTEGER AUTO_INCREMENT PRIMARY KEY, -- zahl, wird automatisch ausgefüllt
frstName VARCHAR(255) NOT NULL,
lastName VARCHAR(255) NOT NULL
);';
$pdo->exec($createTable);
echo 'TABELLE ERSTELLT <br>';
$createUser ='INSERT INTO schueler VALUES(
null, -- null da "AUTO_INCREMENT" gestzt wurde
"Schüler Vorname",
"Schüler Nachname"
)';
$pdo->exec($createUser);
echo 'NUTZER ERSTELLT <br>';
?>

22
Zweites Jahr/pdo_a5.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
// USERNAME, password
//$pdo = new PDO("mysql:host=localhost", "phpmyadmin", "server");
$pdo = new PDO("mysql:host=localhost;dbname=person","phpmyadmin","server");
$selectAll= 'SELECT * FROM schueler;';
$allValues = $pdo->query($selectAll);
// $query -> gibt was aus
// $exec -> gibt nix aus
echo "<pre>";
print_r($allValues->fetchAll());
echo "</pre>";
echo 'Alle einträge: <br>';
foreach($allValues as $value){
echo $value["id"]."|".$value['frstName']."|".$value['lastName']."<br>";
}
?>

View File

@@ -0,0 +1,9 @@
<?php
// db_connection_data.php
$db_engine ="mysql";
$db_name = "E2FI1_2025";
$db_host = "localhost";
$db_user = "phpmyadmin";
$db_password = "server";

View File

@@ -0,0 +1,20 @@
<?php
// db_connection_function.php
function db_connect(){
require_once("db_connection_data.php");
// db_server = "mysql:dbname=testdb;host:localhost";
$db_server = "$db_engine:dbname=$db_name;host=$db_host";
try {
$dbh = new PDO ($db_server, $db_user, $db_password);
echo "<p>DB Connection succesfull established!</p>";
return $dbh;
} catch (PDOException $e){
//echo "Could not connect to DB!<br> ";
die("More:".$e->getMessage());
}
}
// Test:
// db_connect();

View File

@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PDO >> TEST <<</title>
</head>
<body>
<?php
// pdo_test.php
// holt sich den code aus der datei
require_once "inc/db_connection_function.php";
// etsablish db connect
// 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,
'$u_firstname',
'$u_lastname',
'$u_email'
)";
// Versucht code auszufügen (try{...}) wenn das fehlschlägt
// nimmt er sich den error und es wird anderer code ausgeführt
// (catch(...){...})
try {
// führe befehl aus
$dbh->exec($addUser);
// gib aus das der user erstellt wurde
echo "USER CREATED";
// kein error also null
$custErrMsg = NULL;
} catch (PDOException $e) {
// weise error nachricht var zu
$errMsg = $e->getMessage();
// weise error code var zu
$errCode = $e->getCode();
//echo "ERROR: user could not created. try again later";
//echo "<br> Error Message: $errMsg";
//echo "<br> Error-Code: $errCode";
switch ($errCode) {
case "23000": $custErrMsg = "<p>Email-Adress already exists</p>"; break;
default: $custErrMsg = "<p>Oooooops, something went wrong!</p>";
}
}
echo $custErrMsg;
// ####################################
// read records from db
// result consists of multiple rows and columns
// wähle * (alles) aus 'user' (tabelle)
$readUser = "SELECT * FROM user";
/*speicher das ergebnis in der variable,
// führe den SQL befehl aus und wandle
// das ergebnis in einen array um.
// resultReadUser = $dbh->query($readUser)->fetchAll();
$dbh->exec($readUser);
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
echo "ID | VORNAME | NACHNAME | MAIL<br>";
foreach($resultReadUser as $row) {
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>

View 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>

View File

@@ -1,22 +0,0 @@
<?php
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personen>
<benutzer>
<benuztername>maier1</benuztername>
<passwort>mXabc123m!<passwort>
<vorname>Hubertus</vorname>
<nachname>Maier</nachname>
<email>maier1@bfpohg.de</email>
</benutzer>
<benutzer> ... </benutzer>
</personen>
*/
// create xml docs
$doc = new DOMDocumnet()
?>

View 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! 🚀

View 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

View 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 ."";
}
?>

View 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();
}

View 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");

View 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, ",");

View 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

View 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:

View 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

View 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
1 ID Name Preis Kategorie
2 1 Mac Book 2600 pc
3 2 Spezi 15 getränk
4 3 Watch 500 uhr
5 4 iPhone 1500 Handy
6 5 NZXT Mini 100 Tastatur
7 6 NZXT Keyboard 120 Tastatur
8 7 NZXTKeyboard 120 Tastatur