Mit $wpdb->insert, prepare & update Daten mit WordPress in die Datenbank schreiben

By | 15. November 2017
Ein Mensch, der auf einem Board mit einem Stift auf ein Datenbankmodell zeigt

Joe Techapanupreeda / shutterstock.com

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.

Screenshot aus PHPmyAdmin der Tabelle wp_mannschaften die als Beispiel dient

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.

Ich würde mich freuen, wenn du meinen Newsletter abonnieren würdest. Dann verpasst du auch keinen interessanten Beitrag mehr.

Benachrichtige mich:



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.

Anzeige:

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

IDnamesportartgruendungsjahr
1SSV Jahn RegensburgFußball1889
2FC Bayern MünchenFußball1900
3Stuttgarter KickersFußball1899
4Dallas MavericksBasketball1967
5Denver BroncosFootball1960
6Pittsburgh SteelersFootball1933
7THW KielHandball1904

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

Robert von Plötzlich-Selbständig.de Schwarz/Weiß Bild

Ich freue mich von dir zu hören!

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.