Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 2 - Ein paar Hinweise

1. Die Abschnitte

2. Fragen zur Datenbanklasse

Nach dem Erscheinen des ersten Praxistutorials bekam ich einige E-Mails, in denen ich gefragt wurde, ob und in wie fern eine eigene "aufgepfropfte" Datenbankklasse denn überhaupt sinnvoll ist. Und trotz meines Hinweises auf die miese Qualität des Quellcodes ist so eine Frage auf jeden Fall berechtigt. Darum habe ich mich entschlossen, dazu mal meinen Senf von mir zu geben.

Der Sinn hinter einer eigenen Datenbankklasse

... die auf einer MySQL-Erweiterung wie MySQLi oder in diesem Fall auf PDO aufbaut, ist meiner Meinung nach erst mal grundsätzlich völlig in Ordnung. So lange man es nicht übertreibt. Schauen wir uns dazu mal die einzelnen Methoden an.

Den Konstruktor

... halte ich für sehr sinnvoll. Und dabei ist völlig egal, ob man die Verbindung zum MySQL zentral nur ein Mal oder dezentral mehrmals aufbaut. Die Kapselung in einer Methode ist auf jeden Fall sinnvoll, vor allem wenn man mit einer vernünftigen Fehlerbehandlung arbeitet. Was ist hier allerdings nicht getan habe. OK, Asche auf mein Haupt.

selectMultiple und selectOne

Über die beiden Methoden kann man trefflich streiten. Früher habe ich mir so was immer eingebaut, weil ich diese ständigen while-Schleifen leid war. Heute ist mit PDO das eine Zeile mehr Code, so dass man solche Methoden auch nicht mehr braucht.

change

Welcher Teufel mich da geritten hat, weiß ich selber nicht mehr. Die Methode ist überflüssig wie ein Kropf(f).

insert

Die hätte ich mir auch getrost sparen können.

transact

So was ist immer recht sinnvoll, vor allem wenn man mit einer vernünftigen Fehlerbahndlung arbeitet.

transactExchangeOffer

Diese Methode ist für einen ganz speziellen Fall vorgesehen und hat in einer Datenbankklasse eigentlich nichts zu suchen, da die recht allgemein gehalten sein soll. Ich habe sie nur aus reiner Faulheit darein gepackt. Außerdem ist sie noch sehr fehleranfällig, aber das findet ihr sicher selbst heraus.

selectWithBind und deleteWithBind

Heikel, heikel. Vor allem die Löschfunktion. So was ganz man viel besser machen. Allerdings fehlte mir dazu schlichtweg die Zeit und auch die Lust.

Allgemeine Hinweise zu einer eigenen Datenbankklasse

Wenn man eine eigene Datenbankklasse entwirft, so sollte sie auf den Funktionen (MySQL, MySQLi) oder Methoden (MySQLi, PDO) sinnvoll aufbauen und sie nicht "ersetzen" (siehe unsere "Methode" change). Außerdem sollte sie möglichst allgemein gehalten sein, damit man sie flexibel in unterschiedlichen Projekten einsetzen kann. Spezielle Methoden wie unsere transactExchangeOffer gehören in eine höher gelegene Schicht, vulgo in eine andere Klasse.

3. Der Unterschied zwischen bindParam und bindValue

Ich habe euch ja versprochen, auf den feinen Unterschied zwischen beiden Methoden einzugehen. Voilà, hier kommt er nun. Also, die Sache ist ganz einfach. bindParam kann nur Variablen entgegennehmen, bindValue dagegen auch konkrete Werte.


// Wirft Fehler aus
$query 'SELECT * FROM mitglied WHERE name = :suche';
$stmt  $db -> prepare($query);
$stmt -> bindParam(':suche''Mausilein');
$stmt -> execute();

// Funktioniert
$query 'SELECT * FROM mitglied WHERE name = :suche';
$stmt  $db -> prepare($query);
$stmt -> bindValue(':suche''Mausilein');
$stmt -> execute();

// Funktioniert
$suche 'Mausilein';
$query 'SELECT * FROM mitglied WHERE name = :suche';
$stmt  $db -> prepare($query);
$stmt -> bindParam(':suche'$suche);
$stmt -> execute();

// Funktioniert
$suche 'Mausilein';
$query 'SELECT * FROM mitglied WHERE name = :suche';
$stmt  $db -> prepare($query);
$stmt -> bindValue(':suche'$suche);
$stmt -> execute();

Es gibt dabei noch ein paar Kleinigkeiten zu beachten, aber darauf gehe im kommenden Tutorial eingehen.

zurück zum vorherigen Abschnitt