dbDelta não criando tabelas


15

Eu passei por muitos tópicos, página de codex e tentei mexer com muitas coisas, mas meu código não parece estar criando as tabelas. E não sou capaz de descobrir onde estou errado. Eu verifiquei booking_db_version no banco de dados, ele é atualizado quando eu atualizá-lo no arquivo.

Aqui está o código

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

Respostas:


18

Do WordPress-codex sobre dbDelta :

A função dbDelta examina a estrutura atual da tabela, a compara com a estrutura desejada e adiciona ou modifica a tabela conforme necessário, para que seja muito útil para atualizações (consulte wp-admin / upgrade-schema.php para obter mais exemplos de como usar o dbDelta). Observe que a função dbDelta é bastante exigente, no entanto. Por exemplo:

  • Você deve colocar cada campo em sua própria linha na sua instrução SQL.
  • Você deve ter dois espaços entre as palavras PRIMARY KEY e a definição da sua chave primária.
  • Você deve usar a palavra-chave KEY em vez de seu sinônimo INDEX e incluir pelo menos uma KEY.
  • Você não deve usar apóstrofos ou reticulares ao redor dos nomes dos campos.

Com essas advertências, aqui estão as próximas linhas em nossa função, que realmente criarão ou atualizarão a tabela. Você precisará substituir sua própria estrutura de tabela na variável $ sql.

Eu mudei seu sql: "create table $packagetable (

Para isso: "CREATE TABLE " . $packagetable . " (

Aqui está uma cópia de trabalho do seu código:

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
Isso funcionou. Eu li que o dbDelta é meticuloso, mas não percebi que não usar letras maiúsculas CREATE TABLEfará com que ele falhe.
— mehulved 27/12/12

2
Embora o Wordpress não diga isso em sua página de codex, você não pode ter uma vírgula na última linha. Exemplo: PRIMARY KEY (id),. dbDelta realmente diz que ele cria a mesa, embora isso não acontece
— JoeMoe1984

1
Apenas para referência, o problema com a vírgula à direita PRIMARY KEY (id),é um problema de SQL, não dbDelta nem um problema de WP. Portanto, não há documentação.
— Jeremy

Observe que, ao criar várias consultas, dbDelta()você pode passar seus SQLs como uma matriz para, em dbDeltavez de chamar dbDeltaindividualmente para cada consulta.
— toni_lehtimaki

1

Você pode tentar esta função :

$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

Usar 'CREATE TABLE' em vez de 'create table' resolveu o problema para mim.


0

Além de todos esses pontos importantes, você deve ativar o gancho de ativação.

Enquanto você desenvolveu seu plug-in e escreveu o código correto, ainda precisa reativar seu plug - in para acionar o gancho, para que sua tabela seja criada quando o plug-in for ativado.


-2

Palavras-chave SQL, como CREATE TABLE e UPDATE, devem estar em maiúsculas. então mude a linha da tabela de criação para:

"CREATE TABLE " . $packagetable . "( 

e

id mediumint(9) NOT NULL AUTO_INCREMENT,

para:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

ou isto:

name text NOT NULL, 

para:

name TEXT NOT NULL, 

e assim por diante


"Palavras-chave SQL, como [...], devem estar em maiúsculas" . Desculpe, mas não, isso não é verdade.
— kaiser

para usar a função dbDelta, devemos usar maiúsculas. por favor, visite esta página: codex.wordpress.org/Creating_Tables_with_Plugins
— shirin Niki

Desculpe, mas eu posso ler isso em nenhum lugar na fonte . Perdi algo? Talvez você queira adicionar um exemplo de mini-plug-in à sua resposta que mostre que ele falha (que alguém pode fazer e testar) com sintaxe mais baixa?
— Kaiser

neste link: link , o primeiro parágrafo de Criando ou Atualizando a Tabela menciona esse problema.
— shirin Niki

Isso só é verdade para CREATE TABLE, CREATE DATABASE, INSERT INTOe UPDATE. Todo o resto não é usado em uma comparação com distinção entre maiúsculas e minúsculas ou convertido em minúsculas . Suas sugestões não têm efeito.
— fuxia
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.