Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Schreibe ein PHP-Script, welches den Songtext des Liedes «99 Bottles of Beer» ausgibt: http://www.99-bottles-of-beer.net/lyrics.html
Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:
index.php => Route
BeerController.php => Logik
beer.view.php => Ausgabe
Entwickle das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes komplett erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Das Script soll einen Vers für alle 99 Flaschen ausgeben. Nach der ersten Zeile soll ein Zeilenumbruch ausgegeben werden. Nach der zweiten Zeile sollen zwei Zeilenumbrüche folgen.
99bottles of beer on the wall,99bottles of beer. Take one down and pass it around,98bottles of beer on the wall.
98bottles of beer on the wall,98bottles of beer. Take one down and pass it around,97bottles of beer on the wall. ...
Wenn nur noch eine Flasche übrig ist, soll das Wort bottles in der Einzahl als bottle ausgegeben werden.
... 2
bottlesof beer on the wall, 2bottlesof beer. Take one down and pass it around, 1bottleof beer on the wall.1
bottleof beer on the wall, 1bottleof beer. Take one down and pass it around, 0bottlesof beer on the wall.
Wenn keine Flaschen mehr vorhanden sind, soll der letzte Vers ausgegeben werden:
No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall.
Lagere die doppelt ausgeführte Abfrage für die Singular-/Plural-Form des Wortes bottle in eine Funktion getWord aus.
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt. Natürlich ist die Ausgabe des Scripts entscheidend, nicht der Code dazu.
Es sind also mehrere Lösungen möglich, solange durch die richtige Logik die gewünschte Ausgabe erzeugt wird.
4
GET-Parameter
5
Zusatzaufgabe: Arrayfunktionen
6
Zusatzaufgabe: Refactoring
7
Zusatzaufgabe: Stringfunktionen, global, Refactoring
8
Zusatzaufgabe: Output buffering, Refactoring
Generiere auf Basis eines PHP-Arrays eine HTML-Liste.
Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:
ClownController.php => Logik
clown.view.php => Ausgabe
Entwickle das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes komplett erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Erstelle eine einfache HTML-Seite ohne PHP-Code, die folgende Liste bekannter Clowns enthält.
Eugen Rosai
Alfredo Smaldini
Charlie Rivel
Carl Godlewski
Erstelle ein PHP-Array, welches die Namen der Clowns enthält. Generiere die Liste jetzt mit PHP.
Die Liste soll alphabetisch sortiert ausgegeben werden. Verändere die Reihenfolge der Clowns in deinem Array nicht. Sortiere es .
Alfredo Smaldini
Carl Godlewski
Charlie Rivel
Eugen Rosai
Wir möchten die Clowns, deren Name auf -ski endet, fett rot markieren. Erstelle die CSS-Klasse .markiert und setze die Schriftfarbe dafür auf rot und den Schriftstil auf fett.
Du kannst die CSS-Regel in ein style Tag innerhalb deines head Tags schreiben und musst nicht extra ein Stylesheet erstellen.
Vergib die .markiert Klasse nun allen li Elementen, die einen Namen enthalten, der auf -ski endet.
Alfredo Smaldini
Carl Godlewski
Charlie Rivel
Eugen Rosai
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt. Natürlich ist die Ausgabe des Scripts entscheidend, nicht der Code dazu.
Es sind also mehrere Lösungen möglich, solange durch die richtige Logik die gewünschte Ausgabe erzeugt wird.
Du hast eine App für Smartphones entwickelt, mit deren Hilfe man eine Todo-Liste führen kann.
Die Todo-Liste wird auf dem Smartphone bearbeitet. Es können Einträge erstellt und gelöscht werden.
Beim Speichern der Änderungen auf dem Smartphone, wird der neue Datenbestand der Todo-Liste an ein PHP-Script auf deinem Server gesendet, welches die zentrale Datenbank aktualisieren soll.
Dieses Script soll nun ermitteln, welche Einträge in der Datenbank neu eröffnet werden müssen und welche Einträge zu löschen sind.
Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:
TodoController.php => Logik todo.view.php => Ausgabe
Entwickle das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes komplett erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Erstelle das PHP-Script, welches die Datenbestände abgleicht und folgende Ausgabe daraus generiert:
Erweitere das Script so, dass es dir zusätzlich zu vorherigem Output auch noch anzeigt, welche Aufgaben unverändert geblieben sind.
Du hast jetzt vermutlich redundanten (wiederholenden) Code für die Ausgabe der Aufgaben in deinem Script. Da für alle drei Ausgaben die gleiche Logik (Titel + Liste) besteht, bietet sich eine Funktion als Lösung an.
Erstelle die Funktion printTasks die über folgende drei Aufrufe die gleiche Ausgabe wie in Schritt 2 erzeugt.
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt. Natürlich ist die Ausgabe des Scripts entscheidend, nicht der Code dazu.
Es sind also mehrere Lösungen möglich, solange durch die richtige Logik die gewünschte Ausgabe erzeugt wird.
$datenbank = [
'Rasen mähen',
'Einkaufen',
'Pflanzen giessen',
'Katze füttern',
'Staubsaugen'
];
$smartphone = [
'Staubsaugen',
'Einkaufen',
'Hausaufgaben erledigen',
'Ferien buchen'
];Abgeschlossene Aufgaben:
- Rasen mähen
- Pflanzen giessen
- Katze füttern
Neue Aufgaben:
- Hausaufgaben erledigen
- Ferien buchen...
Unveränderte Aufgaben:
- Staubsaugen
- Einkaufenecho printTasks('Abgeschlossene Aufgaben', $abgeschlossen);
echo printTasks('Neue Aufgaben', $neu);
echo printTasks('Unveränderte Aufgaben', $unbearbeitet);Oleg Popow
Herschel Krustofski
Herschel Krustofski
Oleg Popow
Herschel Krustofski
Oleg Popow
...
<head>
<style>
.markiert {
/* ... */
}
</style>
</head>
...
Erstelle eine Template-Klasse und eine View dazu, und verwende das Template dann für alle Übungen.
Erstelle eine neue View /app/Views/template.view.php mit einem HTML-Gerüst und Ausgabe der Variable $content:
Erstelle eine neue Klasse View in /core/view.php und lade sie in /core/bootstrap.php. Erstelle darin eine Methode View::render($template, $view), welche folgendes tut:
Content der View rendern und nicht direkt ausgeben, sondern in eine Variablen $content zwischenspeichern. Ein Beispiel, wie das geht, findest du z.B. auf
Die Template-View laden und von ihr den Content innerhalb des Templates ausgeben lassen.
Vor beiden Schritten solltest du testen, ob es die angegebene Datei auch gibt (file_exists());
Deine bestehenden Aufgaben entsprechend anpassen:
In den bisherigen Views kannst du alles rauslöschen, was nun in template.view.php vorhanden ist.
Im Controller wird nun nicht mehr die View direkt eingefügt (require ...), sondern eine neue View erzeugt und die Methode render() aufgerufen:
Füge in template.view.php VOR dem Content die Navigation aus Aufgabe 7 ein (horizontal).
Klicke alle Aufgaben mal durch und schau, ob alles noch richtig funktioniert.
Die Login-Funktion für das CMS deines Lehrbetriebes wurde von einem Partnerunternehmen in Indien entwickelt. Die Funktion tut was sie soll. Die Code-Qualität hingegen lässt zu wünschen übrig.
Die Login-Funktion überprüft, ob eine Kombination aus Benutzername und Passwort zu einem registrierten Benutzer gehört. Zudem wird überprüft, ob der Benutzer eine Rolle als Administrator oder Publisher hat. Nur diese Benutzerrollen dürfen sich einloggen.
Schreibe den Code der Funktion login
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Meine Seite</title>
<!-- <base ...>: Relative urls start at index.php's directory -->
<base href="<?= dirname($_SERVER['SCRIPT_NAME']); ?>/" />
<link rel="stylesheet" href="public/css/app.css">
</head>
<body>
<?= $content ?>
<script src="public/js/app.js"></script>
</body>
</html>class View
{
/**
* Render a view and display the result with the given template
*
* @param $template string - e.g. "app/Views/template.view.php"
* @param $view string - e.g. "app/Views/spam.view.php"
*/
public function render(string $template, string $view)
{
// Render given `$view` and don't send result to client, but store it into the variable `$content`.
// Dein Code hier...
// Load template view
// Dein Code hier...
}
}class XYController
{
public function xy()
{
// Do what ever needs to be done before loading the view..
// Load view and render with template (replaces require 'app/Views/aufgabe-xy.view.php')
$view = new View();
$view->render('app/Views/template.view.php', 'app/Views/aufgabe-xy.view.php');
}
}Die registrierten Benutzer werden jeweils aus der Datei src/users.php geladen. In dieser Datei findest du alle registrierten Benutzer mit Passwort und Rolle als PHP-Array.
Bearbeite ausschliesslich die Funktion login in der Datei login.php in diesem Verzeichnis.
Überprüfe nach jeder Änderung mit Hilfe der Testfälle, ob alle Bedingungen immer noch fehlerfrei erfüllt werden.
Um die Tests auszuführen, rufe einfach das login.php Script aus deiner Konsole auf.
Führe diesen Schritt jetzt gleich aus. Du solltest für alle fünf Tests einen Status von OK erhalten.
Ändere das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Korrigiere die Einrückung der Funktion login.
Auf den ersten Blick scheinen zwei Elemente mehrfach vorzukommen oder redundant zu sein.
A
$users[$username][...] kommt wiederholt vor. Vereinfache diesen Ausdruck, in dem du ihn in die Variable $user speicherst und alle Vorkommnisse ersetzt.
B
Der Rückgabewert return 'Login okay!'; kommt zwei Mal vor. Möglicherweise lässt sich das if-Statement für diese Prüfung vereinfachen? (Tipp: Logische Operatoren oder in_array)
Durch die vielen Einrückungen ist der Code immernoch sehr schlecht zu verstehen. Als Grundregel gilt, dass nie mehr als 2 Stufen eingerückt werden sollen.
Nutze «Early Returns» um die Einrückung der kompletten Funktion auf eine Stufe zu reduzieren.
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt.
Es sind mehrere Lösungen möglich, solange Dein Code allen gegebenen Vorgaben entspricht.
php -f login.php$user = $users[$username];
// Bisher
$users[$username]['password']
// Wird neu zu
$user['password']// Bisherige Methode
function login($username, $password)
{
if(array_key_exists($username, $users)) {
// Viele
// weitere
// Überprüfungen
} else {
return 'Dieser Benutzer existiert nicht.';
}
}// Mit «Early Return»
function login($username, $password)
{
if( ! array_key_exists($username, $users)) {
return 'Dieser Benutzer existiert nicht.';
}
// Viele
// weitere
// Überprüfungen
}Erstelle ein PHP-Script, welches aufgrund der mitgegebenen GET-Variablen eine Tabelle zur Darstellung eines Pixelbildes generiert.
Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung. Erstelle die Route /pixel:
PixelController.php => Logik
pixel.view.php => Ausgabe
Entwickle das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes komplett erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Erstelle eine einfache View ohne PHP-Code. Auf der View fügst Du eine Tabelle mit 4 Spalten und 4 Zeilen ein.
Kopiere den Inhalt in deine public/css/app.css und binde diese in deiner View ein.
Du solltest nun eine vertikal und horizontal zentrierte Tabelle erhalten.
Erstelle in deinem Controllernun je eine Variable für die Anzahl Spalten ($cols) und die Anzahl Zeilen ($rows). Nutze PHP um die Tabelle dynamisch anhand der Werte der beiden Variablen in deiner View zu generieren.
Wir möchten nun die Möglichkeit haben, via URL-Parameter bestimmen zu können, wie viele Spalten und wie viele Zeilen die Tabelle haben soll.
Beide Parameter sollen optional sein und einen Standard-Wert von 4 haben.
Testfälle
Du kannst über die Superglobale $_GET auf Parameter aus der URL zugreifen.
Wie könntest du hier den verwenden?
Grundsätzlich sollten wir User-Input nie trauen. Die GET-Parameter sind vom User frei bestimmbar und können missbraucht werden. Was, wenn eine Spalten-Anzahl von 10000000 eingegeben wird? Was, wenn eine Anzahl von keineZahl eingegeben wird?
Stelle sicher, dass die folgenden Regeln erfüllt werden.
Regeln
$cols und $rows sollen immer ein Integer sein (siehe )
Die maximale Anzahl von Spalten oder Zeilen soll 60 sein.
Die minimale Anzahl von Spalten oder Zeilen soll 1
Wir möchten nun über einen weiteren GET-Parameter pixels mehrere Koordinaten bestimmen können. Die Koordinaten dienen dazu, Tabellen-Zellen zu identifizieren, die schwarz einzufärben sind.
Die CSS-Klasse .mark ist im CSS-File bereits vorbereitet. Diese Klasse kannst du also Zellen vergeben, die markiert werden sollen.
Die Pixel-Koordinaten werden als String im Format x|y definiert. Möchten wir beispielsweise die 2. Zelle auf der 3. Zeile markieren, wären die Koordinaten 2|3.
Da wir mehrere Koordinaten an das PHP-Script übergeben möchten, können wir den GET-Parameter pixels als Array übergeben. Dies geschieht, indem [] an den Parametername angehängt wird.
Erweitere das PHP-Script so, dass über folgende Query-Strings die korrekten Pixel markiert werden:
Schritt 6
Mit welchem Query-String erhältst du diesen Output?
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt. Natürlich ist die Ausgabe des Scripts entscheidend, nicht der Code dazu.
Es sind also mehrere Lösungen möglich, solange durch die richtige Logik die gewünschte Ausgabe erzeugt wird.
2
URL
Spalten
Zeilen
4
4
4
2
2
4
Query-String
Output
?rows=2&cols=2&pixels[]=2|1&pixels[]=2|2
?rows=3&cols=3&pixels[]=3|1&pixels[]=1|3
?rows=3&cols=3&pixels[]=1|1&pixels[]=2|2&pixels[]=3|3
2
// Tabelle 4x4 wird generiert
$cols = 4;
$rows = 4;
// Tabelle 8x6 wird generiert
$cols = 8;
$rows = 6;// script.php?x=1
$x = $_GET['x'];
// script.php?x=1&y=2
$y = $_GET['y'];<td class="mark"></td> <!-- diese Zelle wird schwarz -->http://localhost/pixels/index.php?pixels[]=1|2&pixels[]=2|1




Erstelle eine Startseite für deine Übungen für alle deine Routes-Einträge eine gemeinsame Navigation.
Füge einen neuen Routes-Eintrag mit Pfad "/" ein:
Erstelle einen Controller NavigationController und eine Methode home() und eine View home.view.php dazu. Erstelle erst mal manuell ein Array $navigation mit allen bisherigen Links, die du als Menü haben willst:
Gib alle Links als Liste in home.view.php aus:
Fülle nun das Array $navigation dynamisch aus der Routes-Tabelle. Für lesbare Beschriftungen kannst du z.B. die Stringfunktionen explode(), str_replace() und ucfirst() benutzen.
Prüfe nun in der View, ob die Links vernünftige Beschriftungen haben und die Links korrekt funktionieren.
Füge einen neuen Routes-Eintrag hinzu und schau, ob das neue Menü korrekt erscheint und funktioniert.
$routes = [
'/' => 'NavigationController@home', /* NEU */
'/aufgabe/spam' => 'AufgabenController@spam',
// ... alle weiteren bestehenden Routes ...
];class NavigationController {
public function home() {
$navigation = [
'/' => 'Navigation - Home',
'/aufgabe/spam' => 'Aufgaben - Spam',
// ... weitere Menüpunkte
];
}
}<ul>
<?php foreach($navigation as $url => $label) : ?>
<li><a href=".<?= $url ?>"><?= $label ?></a></li>
<?php endforeach; ?>
</ul>class NavigationController {
public function home() {
global $routes;
$navigation = [];
foreach ($routes as $url => $ControllerMethod) {
// Aus $ControllerMethod ein lesbares Link-Label erzeugen.
// Aus 'AufgabenController@spam' soll z.B. 'Aufgaben - Spam' werden.
$navigationLabel = '...';
$navigation[$url] = $navigationLabel;
}
}
Erstelle ein Script, welches Sätze aus einem Array durchläuft und sie bei entsprechendem Inhalt als Spam einstuft.
Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:
SpamController.php => Logik
spam.view.php => Ausgabe
Entwickle das Script immer nur so weit, bis alle Komponenten des jeweiligen Schrittes komplett erfüllt werden. Erweitere es anschliessend, damit der nächste Schritt erfüllt wird.
Verwende folgendes Array als Input:
Schreibe ein Script, welches jeden Input-Satz durchläuft und mit Hilfe der Funktion überprüft, ob das Wort SPAM im Satz enthalten ist.
Erzeuge folgende Ausgabe:
Unser Spamfilter scheint den letzten Satz nicht als Spam zu erkennen, obwohl das Wort spam darin vorkommt. Weisst du wieso? Korrigiere dein Script, damit die folgende korrigierte Ausgabe generiert wird.
Tipp: In der PHP-Dokumentation gibt es zu den meisten Funktionen eine nützliche , in der auf verwandte Funktionen verwiesen wird.
Unser Spamfilter könnte noch etwas besser werden... Angebote von Partnerbörsen interessieren uns nicht und sollen neu auch als Spam eingestuft werden.
Wir erweitern unseren Filter also um das Wort Singles. Folgende neue Ausgabe soll generiert werden:
Mögliche Lösungen zu den Aufgaben werden dir vom Kursleiter bereitgestellt. Natürlich ist die Ausgabe des Scripts entscheidend, nicht der Code dazu.
Es sind also mehrere Lösungen möglich, solange durch die richtige Logik die gewünschte Ausgabe erzeugt wird.
$input = [
'Neue Aktionen von Ihrem Computerteile-Händler.',
'Vergrössern Sie jetzt ihr SPAM mit SPAM.',
'SPAM kann ihnen dabei helfen wieder ruhig zu schlafen.',
'Kennen Sie Justin Bieber? Finden Sie andere Singles in Ihrer Nähe.',
'Wenn spam zum Problem wird, haben Sie ein Problem.'
];Satz 0 ist OK
Satz 1 ist SPAM
Satz 2 ist SPAM
Satz 3 ist OK
Satz 4 ist OKSatz 0 ist OK
Satz 1 ist SPAM
Satz 2 ist SPAM
Satz 3 ist OK
Satz 4 ist SPAMSatz 0 ist OK
Satz 1 ist SPAM
Satz 2 ist SPAM
Satz 3 ist SPAM
Satz 4 ist SPAM