dbDelta nie tworzy tabel


15

Przeszedłem przez wiele wątków, strony kodeksu i próbowałem zadzierać z wieloma rzeczami, ale mój kod prawdopodobnie nie tworzy tabel. I nie jestem w stanie zrozumieć, gdzie się mylę. W bazie danych zaznaczyłem booking_db_version, jest aktualizowany, kiedy aktualizuję go w pliku.

Oto kod

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');

Odpowiedzi:


18

Z WordPress-codex o dbDelta :

Funkcja dbDelta sprawdza bieżącą strukturę tabeli, porównuje ją z pożądaną strukturą tabeli i albo dodaje lub modyfikuje tabelę, jeśli to konieczne, więc może być bardzo przydatna w przypadku aktualizacji (więcej przykładów: patrz wp-admin / upgrade-schema.php jak korzystać z dbDelta). Zauważ jednak, że funkcja dbDelta jest raczej wybredna. Na przykład:

  • Musisz umieścić każde pole w osobnej linii w swojej instrukcji SQL.
  • Musisz mieć dwie spacje między słowami KLUCZ PODSTAWOWY a definicją klucza podstawowego.
  • Musisz użyć słowa kluczowego KLUCZ zamiast jego synonimu INDEKS i musisz dołączyć co najmniej jeden KLUCZ.
  • Nie wolno używać apostrofów ani odwrotnych znaków wokół nazw pól.

Z tymi zastrzeżeniami, oto kolejne wiersze w naszej funkcji, które faktycznie utworzą lub zaktualizują tabelę. Musisz podstawić własną strukturę tabeli w zmiennej $ sql.

Zmieniłem twój sql: "create table $packagetable (

Do tego: "CREATE TABLE " . $packagetable . " (

Oto robocza kopia Twojego kodu:

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
To działało. Przeczytałem, że dbDelta jest wybredna, ale nie zdawałem sobie sprawy, że brak użycia wielkich liter CREATE TABLEspowoduje, że się nie powiedzie.
mehulved

2
Chociaż Wordpress nie mówi tego na swojej stronie kodeksu, nie można wstawić przecinka w ostatnim wierszu. Przykład: PRIMARY KEY (id),. dbDelta faktycznie mówi, że tworzy tabelę, chociaż tak nie jest
JoeMoe1984

1
Dla porównania, problem z przecinkiem końcowym PRIMARY KEY (id),to problem SQL, a nie dbDelta ani problem WP. Stąd brak dokumentacji.
Jeremy

Zauważ, że podczas tworzenia wielu zapytań dbDelta()możesz przekazać swoje SQL jako tablicę dbDeltazamiast wywoływać dbDeltaindywidualnie dla każdego zapytania.
toni_lehtimaki

1

Możesz wypróbować tę funkcję :

$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

Użycie polecenia „UTWÓRZ TABELĘ” zamiast „Utwórz tabelę” rozwiązało problem.


0

Oprócz tych wszystkich ważnych punktów, powinieneś aktywować hak aktywacyjny.

Podczas gdy opracowałeś wtyczkę i napisałeś poprawny kod, nadal musisz ponownie aktywować wtyczkę, aby wywołać zaczep, więc twoja tabela zostanie utworzona po aktywacji wtyczki.


-2

Słowa kluczowe SQL, takie jak CREATE TABLE i UPDATE, muszą być pisane wielkimi literami. więc zmień linię tworzenia tabeli na:

"CREATE TABLE " . $packagetable . "( 

i

id mediumint(9) NOT NULL AUTO_INCREMENT,

do:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

albo to:

name text NOT NULL, 

do:

name TEXT NOT NULL, 

i tak dalej


„Słowa kluczowe SQL, takie jak […], muszą być pisane wielkimi literami” . Przepraszam, ale nie, to nie jest prawda.
kaiser

do korzystania z funkcji dbDelta powinniśmy używać wielkich liter. sprawdź tę stronę: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

Przepraszam, ale nie mogę tego nigdzie przeczytać w źródle . Przegapiłem coś? Może chcesz dodać przykładową mini-wtyczkę do swojej odpowiedzi, która pokazuje, że kończy się ona niepowodzeniem (którą ktoś może wziąć i przetestować) przy składni o małych literach?
kaiser

w tym linku: link pierwszy akapit dotyczący tworzenia lub aktualizowania tabeli wspomina o tym problemie.
shirin niki

Jest to prawdą tylko dla CREATE TABLE, CREATE DATABASE, INSERT INTO, i UPDATE. Cała reszta nie jest używana w porównaniu wielkości liter lub jest konwertowana na małe litery . Twoje sugestie nie działają.
fuxia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.