Auch im SQL-Datenbank-Bereich wird WoltLab Community Framework 2.0 einen großen Sprung nach vorne machen. Der Inhalt dieses Beitrags richtet sich wieder an Entwickler.
PHP Data Objects ("PDO")
Zukünftig erfolgt die gesamte Datenbankunterstützung direkt über die sogenannten PDOs ("PHP Data Objects"). Diese ermöglichen einen konsistenten Zugriff auf die spezifischen Datenbanksystemen, ohne auf spezifische Eigenheiten, wie zum Beispiel die Verbindungsverwaltung oder bei der Verwendung von "Prepared Statements" (siehe nächster Absatz), näher eingehen zu müssen.
WCF 2.0 stellt über die bekannten Abstraktionswege eine einheitliche Schnittstelle für den Zugriff bereit. Unter Verwendung von Standard-konformen SQL-Abfragen muss ein Entwickler keine Kenntnis der verwendeten Datenbank haben, dies ist insbesondere in Hinblick auf PostgreSQL relevant. Zugleich legt die Verwendung von PDO den Grundstein für die mögliche Unterstützung weiterer Datenbanksystemen in der Zukunft.
Prepared Statements
SQL-Injections sind der Inbegriff von Sicherheitslücken durch nicht-abgesicherte Parameter und stellen ein enormes Risko für die Stabilität und Integrität einer Software dar - ein vergessener Parameter kann bereits fatale Folgen mit sich ziehen.
Einer der Vorteile von "Prepared Statements" ist die Bekanntheit der anzusprechenden Felder (und somit implizit der möglichen Werte) vor der Übermittlung der tatsächlichen Daten an die Datenbank. Im ersten Schritt wird die gewünschte Abfrage auf Basis von abstrakten Parameterwerten, repräsentiert durch das Fragezeichen in der unten stehenden Abfrage, an die Datenbank übermittelt und für die weitere Verwendung vorgehalten.
Der nachfolgende Schritt beinhaltet die Ausführung der zuvor vorbereiteten Abfrage unter Verwendung der Methode execute(). Die zu übermittelten Werte werden explizit nicht durch gängige Methoden wie z. B. escapeString() abgesichert, dies erfolgt vollkommen automatisiert bei der Übermittlung der Daten.
Konkret sieht das dann z. B. so aus:
|
PHP Source code
|
1
2
3
4
5
|
$sql = "DELETE FROM wcf".WCF_N."_user WHERE userID = ?";
$statement = WCF::getDB()->prepareStatement($sql);
foreach ($userIDs as $userID) {
$statement->execute(array($userID));
}
|
Das obige Beispiel vermittelt anschaulich einen weiteren Vorteil bei der Nutzung von Prepared Statements: Die SQL-Abfrage wird nur ein einziges mal an das Datenbanksystem übermittelt und dort zuerst lokal analysiert. Eine von der Datenbank vorgehaltene Abfrage kann so beliebig oft mit den gewünschten Parametern befüllt werden, ohne bei jedem Aufruf die gesamte Abfrage erneut übermitteln zu müssen. Die Effektivität wird gerade bei umfangreichen Datenmanipulationen ersichtlich, wenn beispielsweise viele Themen gleichzeitig gelöscht werden sollen oder im Rahmen der Paketinstallation.
Prepared Statements leisten einen wichtigen Beitrag zur weiteren Verbesserung der Geschwindigkeit, Stabilität und Sicherheit von WoltLab Community Framework.
PostgreSQL
WCF 2.0 wird, neben der bereits bekannten Unterstützung von MySQL, ein weiteres, populäre Datenbanksystem unterstützen: PostgreSQL. Bei PostgreSQL handelt es sich um eine sehr fortschrittliche, kostenlose und schnelle Alternative zur weit verbreiteten Datenbank MySQL. PostgreSQL ist - im Gegensatz zu MySQL - vollständig Open Source und ist somit völlig unabhängig von wirtschaftlichen Interessen, die zuletzt bei MySQL die Abspaltung in die "MariaDB" bewirkt haben.
Ein weiterer Vorteil von PostgreSQL ist die konsequente Umsetzung des SQL-Standards mit relativ geringen Abweichungen, im Vergleich zu anderen Datenbanksystemen. Zudem ist PostgreSQL vor allem mit dem Fokus auf große und umfangreiche Datenbanken ausgelegt, stellt ein sehr hohes Maß an Stabilität sicher und setzt strikt auf die Integrität der enthaltenden Daten.
Foreign Keys (zu Deutsch: "Fremdschlüssel")
Foreign Keys erlauben die Verknüpfung zusammengehöriger Datensätze als logische Verbindungen über mehrere Datenbanktabellen hinweg. Ein Hauptaugenmerk bei der Entwicklung von WCF 2.0 ist die Konsistenz der Datenbank und all ihrer enthaltenen Daten, sowie die Vermeidung von so genannten "Datenleichen" (Daten die keinen Bezug mehr haben und nicht länger existieren sollten). Eine Vielzahl von Aktionen die auf eine Massenverarbeitung ausgelegt sind, können nicht immer wirklich alle referenzierten Daten löschen, etwa wenn das Script zu einem Zeitpunkt X einfach abbricht oder ein anderer Fehler auftritt.
Um zu verhindern dass die Datenbank verwaiste Datensätze enthält, die mitunter Fehler verursachen können, setzen wir konsequent auf den Einsatz von Foreign Keys. Bei der Löschung eines Benutzers werden beispielsweise automatisch alle unmittelbar mit ihm verknüpften Daten gelöscht oder mindestens einem Pseudo-Benutzer (bei Beiträgen am Rang "unregistriert" erkennbar) zugewiesen. Dies bedeutet, dass Forenbeiträge grundsätzlich erst einmal erhalten bleiben, persönliche Einstellungen oder Notizen jedoch sofort entfernt werden.