dbDelta não criando tabelas

12

Eu passei por muitos tópicos, codex page e tentei mexer com muitas coisas, mas meu código não parece estar criando as tabelas. E eu não sou capaz de descobrir onde estou indo errado. Eu verifiquei o booking_db_version no banco de dados, ele é atualizado quando eu o atualizo 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');
    
por mehulved 26.12.2012 / 10:41

4 respostas

14

Do WordPress-codex sobre dbDelta :

A função dbDelta examina a estrutura da tabela atual, compara-a com a estrutura da tabela desejada e adiciona ou modifica a tabela conforme necessário, por isso pode ser muito útil para atualizações (consulte wp-admin / upgrade-schema.php para 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 em sua instrução SQL.
  • Você deve ter dois espaços entre as palavras PRIMARY KEY e o definição de sua chave primária.
  • Você deve usar a palavra-chave KEY em vez de seu sinônimo INDEX e você deve incluir pelo menos uma KEY.
  • Você não deve usar apóstrofos ou backticks em torno de nomes de campo.

Com essas ressalvas, aqui estão as próximas linhas da 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');
    
por Pontus Abrahamsson 26.12.2012 / 13:35
0

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);
    
por motto 31.03.2016 / 14:58
0

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

    
por Kallol 03.07.2017 / 09:25
-2

As palavras-chave SQL, como CREATE TABLE e UPDATE, devem estar em letras maiúsculas. então mude a linha de criar tabela 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

    
por shirin niki 08.01.2017 / 14:22