All pages
Powered by GitBook
1 of 9

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

01 Bottles of Beer

Aufgabenstellung

Schreibe ein PHP-Script, welches den Songtext des Liedes «99 Bottles of Beer» ausgibt: http://www.99-bottles-of-beer.net/lyrics.html

Zielumgebung

Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:

index.php => Route BeerController.php => Logik beer.view.php => Ausgabe

Lösungsschritte

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.

Schritt 1

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.

99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer. Take one down and pass it around, 97 bottles of beer on the wall. ...

Schritt 2

Wenn nur noch eine Flasche übrig ist, soll das Wort bottles in der Einzahl als bottle ausgegeben werden.

... 2 bottles of beer on the wall, 2 bottles of beer. Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer. Take one down and pass it around, 0 bottles of beer on the wall.

Schritt 3

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.

Schritt 4

Lagere die doppelt ausgeführte Abfrage für die Singular-/Plural-Form des Wortes bottle in eine Funktion getWord aus.

Lösung

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.

06 PHP Aufgaben

Aufgabe

Name

Thema

1

Schleifen, Bedingungen und Funktionen

2

Stringfunktionen und typenstarke Vergleiche

3

Arrays und HTML-Ausgabe

Weiterführende Aufgaben

Weiterführende Aufgaben zum Thema PHP findest Du auf folgenden Plattformen:

4

Pixelgenerator

GET-Parameter

5

Todo-Liste

Zusatzaufgabe: Arrayfunktionen

6

Login-Funktion

Zusatzaufgabe: Refactoring

7

Navigation

Zusatzaufgabe: Stringfunktionen, global, Refactoring

8

Gemeinsames Template

Zusatzaufgabe: Output buffering, Refactoring

Codewars (PHP)
Exercism (PHP)
Bottles of Beer
Einfacher Spamfilter
Clowns

03 Clowns

Aufgabenstellung

Generiere auf Basis eines PHP-Arrays eine HTML-Liste.

Zielumgebung

Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:

ClownController.php => Logik clown.view.php => Ausgabe

Lösungsschritte

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.

Schritt 1

Erstelle eine einfache HTML-Seite ohne PHP-Code, die folgende Liste bekannter Clowns enthält.

  • Eugen Rosai

  • Alfredo Smaldini

  • Charlie Rivel

  • Carl Godlewski

Schritt 2

Erstelle ein PHP-Array, welches die Namen der Clowns enthält. Generiere die Liste jetzt mit PHP.

Schritt 3

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

Schritt 4

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

Lösung

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.

05 Todo-Liste

Aufgabenstellung

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 folgende Arrays als Daten:

Zielumgebung

Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:

TodoController.php => Logik todo.view.php => Ausgabe

Lösungsschritte

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.

Schritt 1

Erstelle das PHP-Script, welches die Datenbestände abgleicht und folgende Ausgabe daraus generiert:

Schritt 2

Erweitere das Script so, dass es dir zusätzlich zu vorherigem Output auch noch anzeigt, welche Aufgaben unverändert geblieben sind.

Schritt 3

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.

Lösung

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
- Einkaufen
echo 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

  • mit der entsprechenden PHP-Funktion
    ...
    <head>
        <style>
            .markiert {
                /* ... */
            }
        </style>
    </head>
    ...

    08 Gemeinsames Template

    Aufgabenstellung

    Erstelle eine Template-Klasse und eine View dazu, und verwende das Template dann für alle Übungen.

    Lösungsschritte

    Schritt 1

    Erstelle eine neue View /app/Views/template.view.php mit einem HTML-Gerüst und Ausgabe der Variable $content:

    Schritt 2

    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:

    1. Content der View rendern und nicht direkt ausgeben, sondern in eine Variablen $content zwischenspeichern. Ein Beispiel, wie das geht, findest du z.B. auf

    2. 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());

    Schritt 3

    Deine bestehenden Aufgaben entsprechend anpassen:

    1. In den bisherigen Views kannst du alles rauslöschen, was nun in template.view.php vorhanden ist.

    2. Im Controller wird nun nicht mehr die View direkt eingefügt (require ...), sondern eine neue View erzeugt und die Methode render() aufgerufen:

    Schritt 4

    Füge in template.view.php VOR dem Content die Navigation aus Aufgabe 7 ein (horizontal).

    Testing

    Klicke alle Aufgaben mal durch und schau, ob alles noch richtig funktioniert.

    06 Login-Funktion

    Aufgabenstellung

    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

    https://stackoverflow.com/questions/8510532/using-include-within-ob-start#answer-8510592
    <!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');
      }
    }
    um, damit er besser lesbar ist.

    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.

    Zielumgebung

    Ü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.

    Lösungsschritte

    Ä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.

    Schritt 1

    Korrigiere die Einrückung der Funktion login.

    Schritt 2

    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)

    Schritt 3

    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.

    Lösung

    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
    }

    04 Pixelgenerator

    Aufgabenstellung

    Erstelle ein PHP-Script, welches aufgrund der mitgegebenen GET-Variablen eine Tabelle zur Darstellung eines Pixelbildes generiert.

    Stylesheet gibt's hier

    Zielumgebung

    Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung. Erstelle die Route /pixel:

    PixelController.php => Logik pixel.view.php => Ausgabe

    Lösungsschritte

    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.

    Schritt 1

    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.

    Schritt 2

    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.

    Schritt 3

    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?

    Schritt 4

    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

    Schritt 5

    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?

    Lösung

    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

    sein.

    URL

    Spalten

    Zeilen

    http://localhost/pixel

    4

    4

    http://localhost/pixel?rows=2

    4

    2

    http://localhost/pixel?cols=2

    2

    4

    http://localhost/pixel?cols=2&rows=2

    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

    des vorgegebenen Stylesheets
    Null Coalesce Operator
    Type Casting

    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
    https://github.com/IctBerufsbildungZentralschweiz/modul-307/tree/master/Tag%201/06%20PHP%20Aufgaben/06%20Login/srcgithub.com
    Startertemplate
    https://github.com/IctBerufsbildungZentralschweiz/modul-307/tree/master/Tag%201/06%20PHP%20Aufgaben/06%20Login/testsgithub.com
    Tests

    07 Navigation

    Aufgabenstellung

    Erstelle eine Startseite für deine Übungen für alle deine Routes-Einträge eine gemeinsame Navigation.

    Lösungsschritte

    Schritt 1

    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:

    Schritt 2

    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.

    Testing

    1. Prüfe nun in der View, ob die Links vernünftige Beschriftungen haben und die Links korrekt funktionieren.

    2. 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;
        }
      }

    02 Einfacher Spamfilter

    Aufgabenstellung

    Erstelle ein Script, welches Sätze aus einem Array durchläuft und sie bei entsprechendem Inhalt als Spam einstuft.

    Zielumgebung

    Nutze zur Strukturierung des Codes die erstellte MVC-Umgebung:

    SpamController.php => Logik spam.view.php => Ausgabe

    Lösungsschritte

    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.

    Schritt 1

    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:

    Schritt 2

    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.

    Schritt 3

    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:

    Lösung

    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.

    strpos
    «Siehe auch» Rubrik
    $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 OK
    Satz 0 ist OK
    Satz 1 ist SPAM
    Satz 2 ist SPAM
    Satz 3 ist OK
    Satz 4 ist SPAM
    Satz 0 ist OK
    Satz 1 ist SPAM
    Satz 2 ist SPAM
    Satz 3 ist SPAM
    Satz 4 ist SPAM