dbDelta erstellt keine Tabellen


15

Ich habe viele Threads und Codex-Seiten durchgesehen und versucht, mit vielen Dingen herumzuspielen, aber mein Code scheint die Tabellen nicht zu erstellen. Und ich kann nicht herausfinden, wo ich falsch liege. Ich habe booking_db_version in der Datenbank überprüft, es wird aktualisiert, wenn ich es in der Datei aktualisiere.

Hier ist der Code

global $booking_db_version;
$booking_db_version = "1.0.0";

function booking_install() {
    global $wpdb;
    global $booking_db_version;
    global $tableprefix;
    $installed_version = get_option('booking_db_option');

    $tableprefix = $wpdb->prefix . 'booking_';

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

    if ( $installed_version !== $booking_db_version ) {
        /* Create table for packages */
        $packagetable = $tableprefix . 'packages';
        $sql = "create table  $packagetable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            description text NOT NULL, 
            city1 text NOT NULL, 
            city2 text NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Create table for hotels */
        $hoteltable = $tableprefix . 'hotels';
        $sql = "create table $hoteltable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            city text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Create table for addons */
        $addontable = $tableprefix . 'addons';
        $sql = "create table $addontable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            addongroup text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Create table for addon groups */
        $addongrouptable = $tableprefix . 'addon_groups';
        $sql = "create table $addongrouptable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            perhead text NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        update_option('booking_db_version', $booking_db_version);
    }
}
register_activation_hook(__FILE__, 'booking_install');

Antworten:


18

Aus dem WordPress-Codex über dbDelta :

Die Funktion dbDelta überprüft die aktuelle Tabellenstruktur, vergleicht sie mit der gewünschten Tabellenstruktur und fügt die Tabelle nach Bedarf hinzu oder ändert sie, sodass sie für Aktualisierungen sehr nützlich sein kann (weitere Beispiele finden Sie in der Datei wp-admin / upgrade-schema.php) wie man dbDelta benutzt). Beachten Sie jedoch, dass die Funktion dbDelta ziemlich wählerisch ist. Zum Beispiel:

  • Sie müssen jedes Feld in Ihrer SQL-Anweisung in eine eigene Zeile setzen.
  • Zwischen den Wörtern PRIMARY KEY und der Definition Ihres Primärschlüssels müssen zwei Leerzeichen stehen.
  • Sie müssen das Schlüsselwort KEY anstelle des Synonymes INDEX verwenden und mindestens einen KEY angeben.
  • Sie dürfen keine Apostrophe oder Backticks um Feldnamen verwenden.

Mit diesen Einschränkungen folgen die nächsten Zeilen in unserer Funktion, mit denen die Tabelle erstellt oder aktualisiert wird. Sie müssen Ihre eigene Tabellenstruktur in die Variable $ sql einsetzen.

Ich habe deine SQL geändert: "create table $packagetable (

Dazu: "CREATE TABLE " . $packagetable . " (

Hier ist eine Arbeitskopie Ihres Codes:

global $booking_db_version;
$booking_db_version = "1.0.0";

function booking_install() {
    global $wpdb;
    global $booking_db_version;
    global $tableprefix;
    $installed_version = get_option('booking_db_option');

    $tableprefix = $wpdb->prefix . 'booking_';

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

    if ( $installed_version !== $booking_db_version ) {
        // Create table for packages 
        $packagetable = $tableprefix . 'packages';
        $sql = "CREATE TABLE " . $packagetable . " (
            id INT NOT NULL AUTO_INCREMENT, 
            name TEXT NOT NULL, 
            description TEXT NOT NULL, 
            city1 TEXT NOT NULL, 
            city2 TEXT NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Create table for hotels 
        $hoteltable = $tableprefix . 'hotels';
        $sql = "CREATE TABLE " . $hoteltable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            city text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Create table for addons 
        $addontable = $tableprefix . 'addons';
        $sql = "CREATE TABLE " . $addontable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            addongroup text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Create table for addon groups 
        $addongrouptable = $tableprefix . 'addon_groups';
        $sql = "CREATE TABLE " . $addongrouptable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            perhead text NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        update_option('booking_db_version', $booking_db_version);
    }
}
register_activation_hook(__FILE__, 'booking_install');

1
Das hat funktioniert. Ich habe gelesen, dass dbDelta zwar pingelig ist, aber nicht erkannt hat, dass das Nicht-Großschreiben dazu CREATE TABLEführt, dass es fehlschlägt.
27.

1
Obwohl Wordpress dies nicht auf seiner Codex-Seite angibt, darf in der letzten Zeile kein Komma nachgestellt werden. Beispiel: PRIMARY KEY (id),. dbDelta sagt tatsächlich, dass die Tabelle erstellt wird, obwohl dies nicht der
Fall ist

Nur als Referenz, das Problem mit dem PRIMARY KEY (id),nachstehenden Komma ist ein SQL-Problem, kein DbDelta-Problem oder ein WP-Problem. Daher keine Dokumentation.
Jeremy

Beachten Sie, dass Sie beim Erstellen mehrerer Abfragen dbDelta()Ihre SQL-Anweisungen als Array übergeben können, dbDeltaanstatt sie dbDeltafür jede Abfrage einzeln aufzurufen .
toni_lehtimaki

1

Sie können diese Funktion ausprobieren :

$table_name = "ratings";

$table_columns = "id INT(6) UNSIGNED AUTO_INCREMENT,
                    rate tinyint(1) NOT NULL,
                    ticket_id bigint(20) NOT NULL,
                    response_id bigint(20) NOT NULL,
                    created_at TIMESTAMP";

$table_keys = "PRIMARY KEY (id),
                    KEY ratings_rate (rate),
                    UNIQUE KEY ratings_response_id (response_id)";

create_table($table_name, $table_columns, $table_keys);

0

Die Verwendung von 'CREATE TABLE' anstelle von 'create table' löste das Problem für mich.


0

Neben all diesen wichtigen Punkten sollten Sie den Aktivierungshaken auslösen.

Während Sie Ihr Plugin entwickelt und den richtigen Code geschrieben haben, müssen Sie Ihr Plugin immer noch reaktivieren , um den Hook auszulösen, damit Ihre Tabelle erstellt wird, wenn das Plugin aktiviert wird.


-2

SQL-Schlüsselwörter wie CREATE TABLE und UPDATE müssen in Großbuchstaben geschrieben werden. So ändern Sie die Zeile der Tabelle erstellen zu:

"CREATE TABLE " . $packagetable . "( 

und

id mediumint(9) NOT NULL AUTO_INCREMENT,

zu:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

oder dieses:

name text NOT NULL, 

zu:

name TEXT NOT NULL, 

und so weiter


"SQL - Schlüsselwörter wie […] müssen in Großbuchstaben geschrieben werden" . Sorry, aber nein, das stimmt nicht.
Kaiser

Für die Verwendung der DbDelta-Funktion sollten wir Großbuchstaben verwenden. Bitte überprüfen Sie diese Seite: codex.wordpress.org/Creating_Tables_with_Plugins
Shirin Niki

Sorry, aber ich kann das nirgendwo in der Quelle lesen . Habe ich etwas verpasst? Vielleicht möchten Sie Ihrer Antwort ein Beispiel-Mini-Plugin hinzufügen, das zeigt, dass es fehlschlägt (was jemand nehmen und testen kann), wenn die Syntax in einem niedrigeren Gehäuse angegeben ist?
Kaiser

In diesem Link: Link wird dieses Problem im ersten Absatz von Erstellen oder Aktualisieren der Tabelle erwähnt.
Shirin Niki

Dies gilt allerdings nur für CREATE TABLE, CREATE DATABASE, INSERT INTO, und UPDATE. Alles andere wird entweder nicht in einem Vergleich mit Groß- und Kleinschreibung verwendet oder in Kleinbuchstaben umgewandelt . Ihre Vorschläge haben keine Wirkung.
Fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.