Advanced SQL - Praxistutorial 2 - Ein paar Hinweise
1. Die Abschnitte
- Vorwort
- Übersicht
- Angebote von mir anzeigen
- Angebote von mir zurückziehen
- Angebote von mir ändern
- Angebote an mich anzeigen
- Angebote an mich ablehnen
- Angebote an mich annehmen Teil 1
- Angebote an mich annehmen Teil 2
- Ein paar Hinweise
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.