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.