dbDelta не создает таблицы

15

Я просмотрел множество потоков, страницу кодекса и пытался связываться со многими вещами, но мой код, похоже, не создает таблицы. И я не могу понять, где я иду не так. Я проверил booking_db_version в базе данных, она обновляется, когда я обновляю ее в файле.

Вот код

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');
mehulved
источник

Ответы:

18

Из WordPress-кодекса про dbDelta :

Функция dbDelta проверяет текущую структуру таблицы, сравнивает ее с требуемой структурой таблицы и, при необходимости, добавляет или изменяет таблицу, поэтому она может быть очень удобной для обновлений (дополнительные примеры см. В wp-admin / upgrade-schema.php). как использовать dbDelta). Обратите внимание, что функция dbDelta довольно требовательна. Например:

  • Вы должны поместить каждое поле в отдельной строке в своем выражении SQL.
  • У вас должно быть два пробела между словами PRIMARY KEY и определением вашего первичного ключа.
  • Вы должны использовать ключевое слово KEY, а не его синоним INDEX, и вы должны включить хотя бы один KEY.
  • Вы не должны использовать апострофы или обратные метки вокруг имен полей.

С этими предостережениями, вот следующие строки в нашей функции, которые фактически создадут или обновят таблицу. Вам нужно будет заменить собственную структуру таблицы в переменной $ sql.

Я изменил ваш sql: "create table $packagetable (

К этому: "CREATE TABLE " . $packagetable . " (

Вот рабочая копия вашего кода:

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
Это сработало. Я читал, что dbDelta привередлива, но не понимала, что отсутствие заглавных букв CREATE TABLEприведет к ее провалу.
mehulved
2
Хотя Wordpress не говорит об этом на своей странице кодекса, в последней строке не должно быть запятой. Пример: PRIMARY KEY (id),. На самом деле dbDelta говорит, что создает таблицу, хотя и не
создает
1
Для справки: проблема с запятой PRIMARY KEY (id),- это проблема SQL, а не проблемы dbDelta и WP. Следовательно, нет документации.
Джереми
Обратите внимание, что при создании нескольких запросов dbDelta()вы можете передавать свои SQL в виде массива, dbDeltaа не вызывать их по dbDeltaотдельности для каждого запроса.
toni_lehtimaki
1

Вы можете попробовать эту функцию :

$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

Использование «CREATE TABLE» вместо «создать таблицу» решило проблему для меня.

Kallol
источник
0

Помимо всех этих важных моментов, вы должны активировать ловушку активации.

В то время как вы разработали свой плагин и написали правильный код, вам все равно нужно повторно активировать ваш плагин, чтобы вызвать ловушку, поэтому ваша таблица будет создана при активации плагина.

Ади Прасетьо
источник
-2

Ключевые слова SQL, такие как CREATE TABLE и UPDATE, должны быть в верхнем регистре. поэтому измените строку создания таблицы на:

"CREATE TABLE " . $packagetable . "( 

и

id mediumint(9) NOT NULL AUTO_INCREMENT,

чтобы:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

или это:

name text NOT NULL, 

чтобы:

name TEXT NOT NULL, 

и так далее

Ширин Ники
источник
Msgstr "Ключевые слова SQL, такие как […], должны быть в верхнем регистре" . Извините, но нет, это не так.
Кайзер
для использования функции dbDelta мы должны использовать верхний регистр. пожалуйста, проверьте эту страницу: codex.wordpress.org/Creating_Tables_with_Plugins
Ширин Ники
Извините, но я не могу прочитать это нигде в источнике . Я что-то пропустил? Может быть, вы хотите добавить пример мини-плагина в свой ответ, который показывает, что он не работает (что кто-то может взять и протестировать) с более низким синтаксисом?
Кайзер
в этой ссылке: ссылка , первый параграф «Создание или обновление таблицы» упоминает эту проблему.
Ширин Ники
Это верно только для CREATE TABLE, CREATE DATABASE, INSERT INTOи UPDATE. Все остальное либо не используется в сравнении с учетом регистра, либо преобразуется в нижний регистр . Ваши предложения не имеют никакого эффекта.
fuxia