dbDelta non crea tabelle


15

Ho passato molti thread, pagine di codice e ho provato a fare confusione con molte cose, ma il mio codice non sembra creare le tabelle. E non sono in grado di capire dove sto sbagliando. Ho controllato booking_db_version nel database, viene aggiornato quando lo aggiorno nel file.

Ecco il codice

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

Risposte:


18

Dal codice WordPress su dbDelta :

La funzione dbDelta esamina la struttura della tabella corrente, la confronta con la struttura della tabella desiderata e aggiunge o modifica la tabella secondo necessità, quindi può essere molto utile per gli aggiornamenti (vedere wp-admin / upgrade-schema.php per altri esempi di come usare dbDelta). Si noti che la funzione dbDelta è piuttosto esigente, tuttavia. Per esempio:

  • È necessario inserire ciascun campo sulla propria riga nell'istruzione SQL.
  • È necessario disporre di due spazi tra le parole CHIAVE PRIMARIA e la definizione della chiave primaria.
  • Devi usare la parola chiave KEY anziché il suo sinonimo INDICE e devi includere almeno un KEY.
  • Non è necessario utilizzare alcun apostrofo o backtick attorno ai nomi dei campi.

Con questi avvertimenti, ecco le prossime righe della nostra funzione, che in realtà creeranno o aggiorneranno la tabella. Dovrai sostituire la tua struttura di tabella nella variabile $ sql.

Ho cambiato il tuo sql: "create table $packagetable (

A questo: "CREATE TABLE " . $packagetable . " (

Ecco una copia funzionante del tuo codice:

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
Quello ha funzionato. Ho letto che dbDelta è schizzinoso ma non mi sono reso conto che la non capitalizzazione CREATE TABLEprovocherebbe il fallimento.
Mehulved il

2
Sebbene Wordpress non lo dica sulla loro pagina del codice, non puoi avere una virgola finale sull'ultima riga. Esempio: PRIMARY KEY (id),. dbDelta in realtà dice che crea la tabella anche se non lo fa
JoeMoe1984

1
Solo per riferimento, il problema con la virgola finale PRIMARY KEY (id),è un problema SQL, non dbDelta né un problema WP. Quindi nessuna documentazione.
Jeremy,

Si noti che quando si creano più query con dbDelta()è possibile passare i propri SQL come array dbDeltaanziché chiamare dbDeltasingolarmente per ogni query.
toni_lehtimaki,

1

Puoi provare questa funzione :

$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

Usando 'CREATE TABLE' invece di 'create table' ho risolto il problema per me.


0

Oltre a tutti questi punti importanti, dovresti attivare l'hook di attivazione.

Durante lo sviluppo del plug-in e la scrittura del codice corretto, è comunque necessario riattivare il plug-in per attivare l'hook, quindi la tabella verrà creata quando viene attivato il plug-in.


-2

Le parole chiave SQL, come CREATE TABLE e UPDATE, devono essere maiuscole. quindi cambia la riga della tabella di creazione in:

"CREATE TABLE " . $packagetable . "( 

e

id mediumint(9) NOT NULL AUTO_INCREMENT,

per:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

o questo:

name text NOT NULL, 

per:

name TEXT NOT NULL, 

e così via


"Le parole chiave SQL, come […], devono essere maiuscole" . Siamo spiacenti, ma no, questo non è vero.
Kaiser,

per usare la funzione dbDelta, dovremmo usare le maiuscole. controlla questa pagina: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

Mi dispiace, ma non posso leggerlo da nessuna parte nella fonte . Ho dimenticato qualcosa? Forse vuoi aggiungere un mini-plug-in di esempio alla tua risposta che mostra che fallisce (che qualcuno può prendere e testare) con una sintassi inferiore?
Kaiser,

in questo link: link , il primo paragrafo di Creazione o aggiornamento della tabella menziona questo problema.
Shirin Niki,

Questo è vero solo per CREATE TABLE, CREATE DATABASE, INSERT INTO, e UPDATE. Tutto il resto non viene utilizzato in un confronto con distinzione tra maiuscole e minuscole o convertito in lettere minuscole . I tuoi suggerimenti non hanno alcun effetto.
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.