Obwohl die Dokumentation der WordPress Funktionen im Gegensatz zu anderen OpenSource Projekten ein Traum sind, herrscht manchmal trotzdem Erklärungsbedarf. Das beweist auch, dass mein Beitrag über das hinzufügen von Daten in die Datenbank mittels der $wpdb-Klasse mein am meisten gefundener Artikel über Google ist.
Heute möchte ich dir versuchen, wieder so anschaulich wie möglich zu erklären, wie man in WordPress mit der wpdb-Klasse Daten in die Datenbank schreibt (INSERT), updatet (UPDATE), oder sonstige SQL-Befehle ausführt (PREPARE).
Wer nichts mit WordPress-Programmierung am Hut hat, sollte jetzt weiterscrollen. Wer mit $wpdb->prefix und und der globalen Variableninitialisierung nichts anfangen kann, sollte zuerst den SELECT-Beitrag nochmal lesen.
$wpdb->insert
Als Grundlage dient eine Datenbanktabelle, die ich wp_mannschaften genannt habe. Wobei das “wp_” der Prefix ist und sich je nach WordPress-Installation unterscheiden kann.
Die Tabelle besitzt die Spalten ID, name, sportart und gruendungsjahr. “ID” ist dabei der Primärschlüssel und wird automatisch vergeben (Stichwort: AUTO_INCREMENT). Durch Auto Increment wird sichergestellt, dass keine “ID” doppelt vergeben wird, was für einen Primärschlüssel unabdingbar ist.
Laut Dokumentation ist der Insert-Befehl folgendermaßen aufgebaut:
global $wpdb; //Globale Variable initialisieren! $wpdb->insert( 'table', //Tabellenname array( 'column1' => 'value1', //String-Wert 'column2' => 123 //Ganzzahliger Wert ), array( '%s', //String-Wert (column1) '%d' //Ganzzahliger Wert (column2) ) );
Sehen wir uns die einzelnen Elemente einmal an.
Nachdem die Funktion eingeleitet wurde, muss man den Tabellennamen angeben. In unserem Fall “mannschaften”. Um den Prefix voranzustellen, nutzen wir die globale Variable $wpdb->prefix.
Anschließend übergibt man in einem Element alle Daten, die man in die Datenbank eingeben möchte. Wobei zuerst der Tabellenname als String und dann der Wert übergeben werden muss. Ist der Wert auch ein String, müssen die bekannten Anführungszeichen verwendet werden. Bei Zahlen oder Variablen entfällt das.
Das zweite Array ist wichtig, um die Werte zu deklarieren. Diese müssen exakt in der Reihenfolge bestimmt werden, wie sie im ersten Array angegeben wurden.
Möglich sind nur drei Arten von Werten. %s steht für String (Text), %d für Integer (ganze Zahlen) und %f für Float (Gleitkommazahlen). NULL ist somit nicht möglich einzutragen.
Dadurch brauchst du die Werte nicht escapen und die Eintragung ist automatisch vor SQL-Injections geschützt.
$wpdb->insert Beispielcode
Nun möchte ich den Handballverein THW Kiel in meine Datenbank eintragen. Dafür verwende ich folgenden Code:
global $wpdb; $wpdb->insert( $wpdb->prefix.'mannschaften', array( 'name' => 'THW Kiel', 'sportart' => 'Handball', 'gruendungsjahr' => 1904 ), array( '%s', //name '%s', //sportart '%d' //gruendungsjahr ) );
Wie du siehst, fehlt in dem Codebeispiel das Feld “ID”. Da diese automatisch vergeben wird, muss ich mich nicht darum kümmern.
Allerdings besitzt die INSERT-Funktion ein nettes Feature: Nach der Ausführung kann man mit $wpdb->insert_id nicht nur die ID auslesen, sondern auch überprüfen, ob der Eintrag überhaupt geklappt hat. Wenn Fehler auftreten, ist der Wert der Variable nämlich false. So kann ideal mit dem Ergebnis weitergearbeitet werden:
global $wpdb; $wpdb->insert( $wpdb->prefix.'mannschaften', array( 'name' => 'THW Kiel', 'sportart' => 'Handball', 'gruendungsjahr' => 1904 ), array( '%s', //name '%s', //sportart '%d' //gruendungsjahr ) ); $id = $wpdb->insert_id; if($id !== false) { do_something($id); //in der Variable befindet sich nun die Primärschlüssel ID des THW Kiels } else { echo "Beim Eintragen ist ein Fehler aufgetreten"; }
$wpdb->update
Das Updaten von Daten in der Datenbank ist ähnlich aufgebaut wie die INSERT-Funktion.
Die Besonderheit an der UPDATE-Funktion ist, dass zusätzlich angegeben werden muss, welche Tabellen davon betroffen und von welchem Dateityp diese sind.
Die zwei neuen Arrays stellen also die WHERE-Abfrage dar. Durch die Deklarierung der Dateitypen müssen die Werte ebenfalls nicht escaped werden um die Abfrage vor SQL-Injections zu schützen. Das macht die Funktion von selbst.
global $wpdb; $wpdb->update( 'table', //Tabellenname array( 'column1' => 'value1', // string 'column2' => 'value2' // integer (number) ), array( 'ID' => $id ), //Welcher Eintrag ist davon betroffen? array( '%s', // value1 - String '%d' // value2 - Integer ), array( '%d' ) //Welches Dateiformat hat der gesuchte Key? In unserem Fall ID -> Integer );
$wpdb->update Beispielcode
In meiner Beispieltabelle hat Kiel die ID 7.
wp_mannschaften - mit Kiel
ID | name | sportart | gruendungsjahr |
---|---|---|---|
1 | SSV Jahn Regensburg | Fußball | 1889 |
2 | FC Bayern München | Fußball | 1900 |
3 | Stuttgarter Kickers | Fußball | 1899 |
4 | Dallas Mavericks | Basketball | 1967 |
5 | Denver Broncos | Football | 1960 |
6 | Pittsburgh Steelers | Football | 1933 |
7 | THW Kiel | Handball | 1904 |
Möchte ich hier das Gründungsdatum doch auf 1992 setzen, da in dem Jahr erst die Handballabteilung gegründet wurde, gehe ich folgendermaßen vor:
global $wpdb; $wpdb->update( $wpdb->prefix.'mannschaften', array( 'gruendungsjahr' => 1992, ), array( 'ID' => 7 ), array( '%d' //Integer (gruendungsjahr) ), array( '%d' ) //Integer (ID) );
Die UPDATE-Funktion besitzt natürlich auch einen Rückgabewert.
Die Funktion liefert entweder false zurück oder die Anzahl der betroffenen Tabellen, die geupdatet wurden. War die Abfrage richtig, es war nur kein Datensatz betroffen, dann ist der Rückgabewert 0. Deshalb muss false zwingend mit “===” abgefragt werden, damit die Variable vom gleichen Datentyp ist.
global $wpdb; $result = $wpdb->update( $wpdb->prefix.'mannschaften', array( 'gruendungsjahr' => 1992, ), array( 'ID' => 7 ), array( '%d' //Integer (gruendungsjahr) ), array( '%d' ) //Integer (ID) ); if($result === false) { echo "Fehler bei der Update-Abfrage"; } else { echo $result." Datensätze wurden geupdatet"; }
$wpdb->prepare / query
Freilich ist es auch möglich, alle SQL-Abfragen die MySQL hergibt, im WordPress Framework zu verwenden. Wenn du es auf die harte Tour machen möchtest, nutzt du dazu ausschließlich die $wpdb->query Funktion. Als vernünftiger Entwickler “prepared” man seine Abfragen ums sie so zum Beispiel vor der berühmt berüchtigten SQL-Injection zu schützen.
Bereitet man die Abfragen mit prepare auf, werden die Werte in verschiedenen Schichten übertragen, sodass es für Angreifer schwerer ist, Schadcode zu übermitteln. Wenn du bis hierhin die INSERT und UPDATE Funktion verinnerlicht hast, wirst du merken, auf was $wpdb->prepare hinausläuft.
In $wpdb->prepare kannst du wie gesagt jede SQL-Abfrage, die MySQL unterstütz ausführen und musst lediglich die variablen Werte als Platzhalter in der Abfrage angeben um sie nach dem Komma in der richtigen Reihenfolge zu übergeben.
global $wpdb; $wpdb->query( $wpdb->prepare( " DELETE FROM 'table' WHERE ID = %d AND titel = %s ", 13, 'Gehacktes' ) );
In unserem konkreten Fall könnte man zum Beispiel die Schreibweise aller Fußballteams ändern, da man sich entschieden hat, “Fußball” doch mit doppeltem S zu schreiben.
global $wpdb; $sportart_neu = 'Fussball'; $wpdb->query( $wpdb->prepare( " UPDATE ".$wpdb->prefix."'mannschaften' SET sportart = %s WHERE sportart LIKE %s ", $sportart_neu, 'Fußball' ) );
Der Rückgabewert von der Prepare-Funktion ist unterschiedlich zu behandeln, weshalb nun kein Beispiel folgt.
In jedem Fall liefert sie bei Fehlern false zurück. Dies musst du wie beim UPDATE-Beispiel mit drei Gleichheitszeichen (===) abfragen. Bei SELECT, INSERT, DELETE, UPDATE-Befehlen liefert die Prepare-Funktion im Erfolgsfall die Anzahl der betroffenen Datensätze zurück. Bei CREATE, ALTER, TRUNCATE und DROP- Befehlen lediglich true.
Debuggen
Wie man im Fehlerfall debuggen kann, habe ich im SELECT-Beitrag erklärt
Du kommst bei deinem Projekt nicht weiter oder brauchst einen Boost? Dann lass dir von mir helfen zum Beispiel bei: ► Beratung für Selbständige, Gründer & Ideenschmiede Egal, ob du erste Tipps brauchst. Einmal über deine Idee reden möchtest oder mit mir das Konzept für das nächste Facebook ausarbeiten willst. ► Entwicklung von Software, APPs & Webseiten Beispielsweise: WordPress Shops & Plugins, (Gaming-)Apps, Datenbank-Applikationen oder andere smoothe Anwendungen! Mehr Infos, Preise und Kontaktmöglichkeiten findest du hier! |
Das Tutorial hat mir sehr geholfen, einen eigenen Code zu programmieren, der sowohl Daten in die mySQL-Datenbank schreibt als sie auch ändert oder ausliest. Ich hatte zuvor absolut keine Kenntnisse von mySQL und habe alles auf Anhieb verstanden. Danke!
Danke für dein positives Feedback. Freut mich, wenn es verständlich war.
Danke hat mir sehr geholfen.
Wie kann man eine Tabellenspalte anfüegen ?
Flotte Grüße Dirk
Würde sagen, dass das der am besten geschriebene (deutsche) Beitrag zum Thema wpdb ist! Danke dafür 🙂
Liebe Grüße aus Hamburg!