6.7. Sichere Datenbankmanipulationen

Fakt ist, dass die Datenbank eines der wichtigsten Bestandteile Ihrer Website ist. Sie ist daher mehr als schützenswert. Einmal zerstört, lassen sich die Daten oft nur schwer wiederherstellen.

WordPress gibt Ihnen daher einige Funktionen an die Hand mit deren Hilfe Sie Datenbankeinträge leicht und sicher bearbeiten können.

Das wpdb Objekt

In einer sehr frühen Startphase instanziiert WordPress die globale Variable $wpdb, die so wie Ihre Klasse benannt wurde. Sie finden die genauen Definitionen in der Datei wp-includes/wp-db.php3.

Die Klasse kann bzw. soll letztlich als Ersatz für die PHP-Internen SQL-Funktionen (z.B. mysql_query()) genutzt werden. Und zwar aus drei Gründen:

  • Die Nutzung der Klasse wpdb bietet mehr Sicherheit.
  • Es ist nach wie vor möglich, die komplette Datenbank-Engine auszutauschen (auch wenn das in den seltensten Fällen passiert). Verwendet ein Benutzer anstatt MySQL PostgreSQL, funktioniert z.B. mysql_query() nicht.
  • Weniger Schreibarbeit. Sie müssen z.B. nicht jedes mal eine Datenbankverbindung aufbauen, wenn Sie eine Abfrage durchführen. Sie nutzen stattdessen die bestehende Verbindung und sparen sich dazu eine Menge zusätzlichen Code.

$wpdb beinhaltet viele Funktionen mit denen sich Daten einer Tabelle lesen, einfügen, aktualisieren oder löschen lassen.

Daten einfügen

Folgende Methode der Klasse wpdb stellt WordPress grundsätzlich bereit:

<?php
class wpdb {
	function insert( $table, $data, $format = null ) {
		...
	}
}
?>

Dabei gilt:

  • $table (string)
    Der Name der Tabelle, in der Daten eingefügt werden sollen.
  • $data (array)
    Die Daten (als Array), die einfügt werden sollen.
  • $format (array|string)
    Die Formatierungsanweisung jedes einzelnen Elements in $data.

Beispiel:

Gehen wir davon aus, es liegt folgende Tabelle mit dem Namen mm_example_table vor:

Abb.: Tabellenbeispiel
Abb.: Tabellenbeispiel

You’re not allowed to see this content. Please log in first.

Daten aktualisieren

Zum aktualisieren von Datenbankinhalten stellt WordPress die Methode update() zur Verfügung:

<?php
class wpdb {
	function update( $table, $data, $where, $format = null, $where_format = null ) {
		...
	}
}
?>

Wobei gilt:

You’re not allowed to see this content. Please log in first.

Daten löschen

Daten zu löschen ist mitunter noch einfacher:

<?php
class wpdb {
	function delete( $table, $where, $where_format = null ) {
		...
	}
}
?>

Wobei gilt:

You’re not allowed to see this content. Please log in first.

Daten ersetzen

Die Methode replace() ersetzt seit Version 3.0.0 eine Zeile in einer Tabelle, falls diese existiert. Falls sie nicht existiert, wird eine neue Zeile eingefügt.

<?php
class wpdb {
	function replace( $table, $data, $format = null ) {
		...
	}
}
?>

Wobei gilt:

You’re not allowed to see this content. Please log in first.

Daten auslesen

Eine Variable auslesen

Um einen einzigen Wert einer Datenbank-Tabelle auszulesen, nutzen Sie die Methode get_var():

<?php
class wpdb {
	function get_var( $query = null, $x = 0, $y = 0 ) {
		...
	}
}
?>

Wobei gilt:

You’re not allowed to see this content. Please log in first.

Eine Zeile auslesen

Eine einzelne Zeile lässt sich mit der Methode get_row() auslesen:

<?php
class wpdb {
	function get_row( $query = null, $output = OBJECT, $y = 0 ) {
		...
	}
}
?>

Dabei gilt:

You’re not allowed to see this content. Please log in first.

Eine Spalte auslesen

Ganze Spalten lassen sich mit der Methode get_col() auslesen.

<?php
class wpdb {
	function get_col( $query = null , $x = 0 ) {
		...
	}
}
?>

Wobei gilt:

You’re not allowed to see this content. Please log in first.

Generische Abfragen

Wenn Sie keine Spalte, eine Zeile oder gar nur einen Wert aus der Datenbank auslesen wollen, sondern eine ganze Fülle an Daten benötigen, hilft Ihnen die Methode get_results():

<?php
class wpdb {
	function get_results( $query = null, $output = OBJECT ) {
		...
	}
}
?>

Dabei gilt:

You’re not allowed to see this content. Please log in first.

Allgemeine Abfragen an die Datenbank

Natürlich können Sie aber auch die Methode query() nutzen um eine direkte Anfrage an die Datenbank zu stellen. Die Anfrage nutzt die globale Verbindung, die WordPress beim Start bereits hergestellt hat. Alle Methoden, die die Klasse wpdb nutzt, basieren auf dieser Methode.

<?php
class wpdb {
	function query( $query ) {
		...
	}
}
?>

Dabei gibt es nur einen Parameter $query, der die eigentliche Abfrage enthält. Zurückgegeben wird entweder ein Integer-Wert, der die Anzahl der betroffenen Zeilen enthält oder false wenn es während der Abfrage zu einem Fehler kam.

Vorbeugen von SQL-Injections

Sie haben in den vorherigen Beispielen zum Auslesen von Date gesehen, dass keine einzige Abfrage gefiltert wurde. Der Grund ist, dass alle Abfragen hart programmiert wurden. Das bedeutet: sie enthalten keine dynamischen Daten, die manipuliert werden könnten.

Wenn Sie jedoch eine dynamische Abfrage machen müssen, die von einer Benutzereingabe abhängt, empfehle ich Ihnen die entsprechenden Daten zu filtern und erst dann an die Datenbank zu übergeben.

You’re not allowed to see this content. Please log in first.

Eigenschaft der Klasse wpdb

Die Klasse wdpb hat einige Eigenschaften, auf die Sie direkt zugreifen und sie nutzen können.

Eine erweiterte Liste finden Sie im Kapitel zur Datenbank-API. Eine vollständige gibt es in der WordPress Referenz unter: http://codex.wordpress.org/Class_Reference/wpdb#Class_Variables. Hier ein Auszug davon:

  • numqueries (int)
    Die Anzahl der Abfragen die bis zum jetzigen Zeitpunkt ausgeführt wurden.
  • queries (array)
    Ein Array von Datenbank-Abfragen die bis zum jetzigen Zeitpunkt ausgeführt wurden. Diese Eigenschaft wird jedoch nur gefüllt wenn die Konstante SAVEQUERIES in der Datei wp-config.php auf true gesetzt wurde.
  • insert_id (int)
    Die ID, die beim letzten INSERT-Befehl durch eine AUTO_INCREMENT-Spalte erzeugt wurde.
  • num_rows (int)
    Die Anzahl an Zeilen die die letzte Abfrage zurückgegeben hat.
  • prefix (string)
    Das Datenbank-Präfix. In einer normalen Einzelsite-Installation enthält es den Wert, der auch in der wp-config.php angegeben wurde. Bei einer Multisite-Installation enthält es zusätzlich die Blog-ID.
  • base_prefix (string)
    Das Datenbank-Präfix, wie es in wp-config.php angegeben wurde.
  1. https://github.com/WordPress/WordPress/blob/master/wp-includes/wp-db.php ↩︎