Schlagwort-Archive: wpdb

Neue Tabellen-Spalte per Code mit wpdb oder dbDelta hinzufügen

Grundsätzlich bietet WordPress als Basis für Webapps ja eine einfache Möglichkeit, um Daten in die von WP mitgebrachten Tabellen einzugeben.

Siehe:

https://www.wp-entwickler.at/was-ist-dbdelta-und-wofuer-brauch-ich-das/
https://www.wp-entwickler.at/was-ist-dbdelta-und-wofuer-brauch-ich-das/

https://www.wp-entwickler.at/ueberpruefen-ob-tabelle-tabellenspalte-oder-tabellenzeile-existiert-mit-wpdb/
https://www.wp-entwickler.at/ueberpruefen-ob-tabelle-tabellenspalte-oder-tabellenzeile-existiert-mit-wpdb/

Eigene Tabellen sind in vielen Fällen aber besser.
Will ich nun zu einer Tabelle eine neue Spalte per PHP-Code hinzufügen, gibt es mehrere Möglichkeiten:

 

ALTER TABLE

$wpdb->query( "ALTER TABLE {$table_name} ADD {$column_name} LONGTEXT" );

Die einfachste und durchschaubarste Lösung ist wahrscheinlich ALTER TABLE.
Hier erstelle ich in einer Tabelle, notiert mit {$table_name}, eine Spalte mit dem Type LONGTEXT, notiert mit {$column_name}.

dbDelta

DbDelta ist eigentlich dafür da, um Tabellen in der Datenbank zu erstellen. Siehe auch den vorherigen Blogeintrag zu dbDelta.

Man kann dbDelta aber auch dazu verwenden, um Spalten anzufügen.

Aber nur um Spalten hinzuzufügen – dbDelta löscht keine Spalten. Daher funktionieren folgende Beispiele gleich, ohne Fehler zu werfen. Für euch getestet.

 

		
$sql =
	"CREATE TABLE {$table_name} (
          ID mediumint(9) NOT NULL AUTO_INCREMENT,
          post_ID mediumint(9) NOT NULL,
          term_ID mediumint(9) NOT NULL,
          {$column_name} LONGTEXT,
          PRIMARY KEY  (id)
        ) ENGINE = InnoDB {$charset_collate};";

dbDelta( $sql );

 

$sql =
	"CREATE TABLE {$table_name} (
          {$column_name} LONGTEXT,
        ) ENGINE = InnoDB {$charset_collate};";

dbDelta( $sql );

 

In beiden Fällen füge ich der Tabelle {$table_name} die Spalte {$column_name} hinzu.
Im ersten Fall verwende ich den gleichen Code wie zum erzeugen der Tabelle.
Im zweiten Fall Fall fehlen die meisten Zeilen aus dem ersten Beispiel. Dennoch funktioniert beides gleich.

Kleiner Hinweis: Will ich dbDelta verwenden, muss ich die wp-admin/includes/upgrade.php Datei einbinden:

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

 

https://developer.wordpress.org/reference/functions/dbdelta/
https://developer.wordpress.org/reference/functions/dbdelta/

http://wordpress.stackexchange.com/questions/78667/dbdelta-alter-table-syntax
http://wordpress.stackexchange.com/questions/78667/dbdelta-alter-table-syntax

https://codex.wordpress.org/Creating_Tables_with_Plugins#Adding_an_Upgrade_Function
https://codex.wordpress.org/Creating_Tables_with_Plugins#Adding_an_Upgrade_Function

 

http://stackoverflow.com/questions/21330932/add-new-column-to-wordpress-database/21331762#21331762
http://stackoverflow.com/questions/21330932/add-new-column-to-wordpress-database/21331762#21331762

Überprüfen ob Tabelle, Tabellenspalte oder Tabellenzeile existiert mit WPDB

WordPress bietet viele und einfache Möglichkeiten, um Daten zu speichern, ohne eigenen SQL-Code schreiben zu müssen.

Custom Fields (oder Post Metas) werden oft für allerhand Daten verwendet.
Man muss sich nicht selbst um Userinterfaces oder Update- und Löschmechanismen kümmern.

Doch die Tabellenstruktur von WordPress reicht oft nicht, oder ergibt bei größeren Projekten keinen Sinn.

Wenn es dann darum geht, kurze Checks und Überprüfungen an eigenen Tabellen durchzuführen, gehen mir die WordPress eigenen Mittel aus.

Daher nachfolgend ein paar Snippets als Hilfestellung:

Überprüfen ob Tabelle existiert

$table_exists = $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" );

Das ist eine recht einfache Übung – {$table_name} ist dabei der Tabellennamen, auf den man überprüfen möchte.

Überprüfen ob Zeile existiert

$wpdb->get_row( "SELECT * FROM {$table_name} WHERE post_ID = {$post_id}" );
$wpdb->get_row( "SELECT post_ID FROM {$table_name} WHERE post_ID = {$post_id}" );

Dazu gibt es mehrere Möglichkeiten – siehe die Doku zu wpdb.
Hier wird aus einer Tabelle, hier dargestellt mit {$table_name}, eine Zeile mit einer bestimmen post_ID geholt.
Im ersten Fall werden alle Datenfelder der Zeile geholt. Für das Überprüfen ob eine Zeile vorhanden ist, könnte das zu viel an Information und Speicherbelegung sein.
Es reicht vollkommen, wenn ich mir nur ein Datenfeld oder eine Spalte aus der Zeile hole.

Überprüfen ob Spalte existiert

$columns = $wpdb->get_results(
"DESC {$table_name}"
);

{$table_name} ist wieder der Tabellenname.
DESC ist shorthand für DESCRIPTION. Mit obigem Befehl hole ich mir alle Informationen zu einer speziellen Tabelle. Ich bekomme nicht nur die Spaltennamen sondern eine Fülle an Infos..
In dem obigen Fall kommt ein Objekt an Arrays zurück. Jedes Array stellt eine Spalte dar. Ich kann diese Arrays mit einer Schleife durchlaufen, oder zb. auch das Objekt serialisieren und nach Text (= die spezielle Spalte) durchsuchen.

 

Dort wo es nötig ist, bitte nicht auf das Absichern der Abfragen vergessen. WordPress bietet dazu eine Hilfestellung mit $wpdb->prepare an.
Hineiws: Dabei handelt es sich nicht um prepared statements auf DB-Ebene sondern um WordPress-Funktionalität.

 

https://codex.wordpress.org/Class_Reference/wpdb
https://codex.wordpress.org/Class_Reference/wpdb