Einkaufszettel in PHP: Implementierung

Nachdem wir uns im ersten Teil grundlegende Gedanken über die Klasse SimpleShoppinglist gemacht haben und uns im zweiten Teil Gedanken über die Datenstruktur gemacht haben, wollen wir nun zur Implementierung kommen.

Da es in dieser Artikelserie nicht darum geht, wie man eine Verbindung zu einer Datenbank aufbaut, gehen wir einfach davon aus, daß diese Verbindung bereits besteht. Deswegen nehmen wir an, daß eine globale Variable $dbh existiert. Da wir uns nicht auf bestimmtes Datenbanksystem festlegen wollen, nehmen wir weiterhin an, daß $dbh eine Instanz der Klasse PDO ist.

Klassendefinition

Zuerst müssen wir die Klasse SimpleShoppinglist definieren.

01 class SimpleShoppinglist
02 {
03     private $_dbh;
04 }
 

Die private Variable $_dbh soll eine Referenz auf die oben angeführte globale Variable $dbh sein. So brauchen wir nur einmal in der Klasse das Schlüsselwort global verwenden: im Konstruktor.

Konstruktor

Die Aufgabe des Konstruktors besteht darin, die Klassenvariable $_dbh auf die globale Variable $dbh zeigen zu lassen.

01 public function __construct()
02 {
03     global $dbh;
04
05     $this->_dbh = &$dbh;
06 }
 

Sollte das Datenbankhandle nicht $dbh heißen, muß natürlich $dbh durch den Namen des Datenbankhandles ersetzt werden.

Hinzufügen

Das Hinzufügen eines Postens soll durch die Methode add($position) erfolgen. Der Posten wird als Parameter $position übergeben. Im Erfolgsfall gibt die Methode true zurück, andernfalls wird false zurückgegeben.

01 public function add($position)
02 {
03     try {
04         $sql = 'INSERT INTO shoppinglist '
05              . '(position) '
06              . 'VALUES '
07              . '(?)';
08
09         $sth = $this->_dbh->prepare($sql);
10
11         return $sth->execute(array($position));
12     } catch (Exception $e) {
13         return false;
14     }
15 }
 

Da $_dbh ein PDO-Objekt ist, wollen wir mit prepared statements arbeiten. In Zeile 9 wird dieses Statement vorbereitet. In Zeile 11 wird dieses Statement ausgeführt und das Ergebnis zurückgegeben. Sollte eine Exception geworfen werden, wird false zurückgegeben (Zeile 13).

Anzeigen

Eine Auflistung aller Posten soll die Methode get($tickedOff) zurückliefern. Mit dem Parameter $tickedOff kann man angeben, ob alle Posten ($tickedOff = true) oder nur die noch zu kaufenden Posten ($tickedOff = false) aufgelistet werden sollen. Standardmäßig sollen nur die noch zu kaufenden Posten zurückgegeben werden.

Zurückgegeben wird ein Array, wobei jedes Element ein assoziatives Array ist, welches die Daten eines Einkaufszetteleintrags enthält.

01 public function get($tickedOff = false)
02 {
03     $sql = 'SELECT id, position, ticked_off '
04          . 'FROM shoppinglist ';
05
06     if ($tickedOff === false) {
07         $sql .= 'WHERE NOT ticked_off';
08     }
09
10     $ret = array();
11
12     foreach ($this->_dbh->query($sql) as $row) {
13         $ret[] = array(
14             'id'         => $row['id'],
15             'position'   => $row['position'],
16             'ticked_off' => $row['ticked_off'],
17         );
18     }
19
20     return $ret;
21 }
 

In den Zeilen 3 bis 8 wird das SQL-Statement zusammengesetzt. In Zeile 10 wird das Array für die Rückgabe angelegt. In den Zeilen 12 bis 18 wird das Rückgabe-Array gefüllt. Dabei nutzen wir aus, daß man bei SELECT-Anweisungen mit PDO::query() über das Ergebnis iterieren kann.

Abhaken

Das Abhaken eines gekauften bzw. in den Warenkorb gelegten Postens wird mit der Methode tickOff($id) realisiert. Als Parameter $id wird dabei die ID des entsprechenden Postens übergeben.

01 public function tickOff($id)
02 {
03     $sql = 'UPDATE shoppinglist '
04          . 'SET ticked_off = true '
05          . 'WHERE id = ?';
06
07     $sth = $this->_dbh->prepare($sql);
08
09     $sth->execute(array($id));
10 }
 

Durchstreichen

Das Durchstreichen – das Löschen – wird mit der Methode delete($id) realisiert. Als Parameter $id wird dabei die ID des zu löschenden Postens übergeben.

01 public function delete($id)
02 {
03     $sql = 'DELETE FROM shoppinglist '
04          . 'WHERE id = ?';
05
06     $sth = $this->_dbh->prepare($sql);
07
08     $sth->execute(array($id));
09 }
 

Vollständige Klasse

Hier ist der vollständige Code der Klasse SimpleShoppinglist ohne Zeilennummern:

class SimpleShoppinglist
{
    private $_dbh;

    public function __construct()
    {
        global $dbh;

        $this->_dbh = &$dbh;
    }

    public function add($position)
    {
        try {
            $sql = 'INSERT INTO shoppinglist '
                 . '(position) '
                 . 'VALUES '
                 . '(?)';

            $sth = $this->_dbh->prepare($sql);

            return $sth->execute(array($position);
        } catch (Exception $e) {
            return false;
        }
    }

    public function get($tickedOff = false)
    {
        $sql = 'SELECT id, position, ticked_off '
             . 'FROM shoppinglist ';

        if ($tickedOff === false) {
            $sql .= 'WHERE NOT ticked_off';
        }

        $ret = array();

        foreach ($this->_dbh->query($sql) as $row) {
            $ret[] = array(
                'id'         => $row['id'],
                'position'   => $row['position'],
                'ticked_off' => $row['ticked_off'],
            );
        }

        return $ret;
    }

    public function tickOff($id)
    {
        $sql = 'UPDATE shoppinglist '
             . 'SET ticked_off = true '
             . 'WHERE id = ?';
        $sth = $this->_dbh->prepare($sql);

        $sth->execute(array($id));
    }

    public function delete($id)
    {
        $sql = 'DELETE FROM shoppinglist '
             . 'WHERE id = ?';

        $sth = $this->_dbh->prepare($sql);

        $sth->execute(array($id));
    }
}
 

Damit ist das Ende dieser kleinen Artikelserie erreicht.

einkaufszettel.zip
Dieses ZIP-Archiv enthält den Quellcode für die Klasse SimpleShoppinglist sowie die zwei verschiedenen SQL-Statements zur Erzeugung der Tabelle shoppinglist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.