dbDelta non crea le tabelle

26 dic 2012, 11:41:10
Visualizzazioni: 17.1K
Voti: 17

Ho esaminato molti thread, la pagina del codex e ho provato a modificare diverse cose, ma il mio codice sembra non creare le tabelle. Non riesco a capire dove sto sbagliando. Ho controllato booking_db_version nel database e viene aggiornata quando la modifico 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 ) {
        /* Crea tabella per i pacchetti */
        $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);

        /* Crea tabella per gli hotel */
        $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);

        /* Crea tabella per gli addon */
        $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);

        /* Crea tabella per i gruppi di addon */
        $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');
0
Tutte le risposte alla domanda 5
5
20

Dal WordPress-codex riguardo dbDelta:

La funzione dbDelta esamina la struttura corrente della tabella, la confronta con la struttura desiderata e aggiunge o modifica la tabella secondo necessità, quindi può essere molto utile per gli aggiornamenti (vedi wp-admin/upgrade-schema.php per ulteriori esempi su come usare dbDelta). Tuttavia, nota che la funzione dbDelta è piuttosto esigente. Ad esempio:

  • Devi inserire ogni campo nella sua riga nell'istruzione SQL.
  • Devi avere due spazi tra le parole PRIMARY KEY e la definizione della tua chiave primaria.
  • Devi usare la parola chiave KEY invece del suo sinonimo INDEX e devi includere almeno una KEY.
  • Non devi usare apici o backtick intorno ai nomi dei campi.

Con queste avvertenze, ecco le righe successive nella nostra funzione, che creeranno o aggiorneranno effettivamente la tabella. Dovrai sostituire la tua struttura di tabella nella variabile $sql.

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

In 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 ) {
        // Crea tabella per i pacchetti 
        $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);

        // Crea tabella per gli hotel 
        $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);

        // Crea tabella per gli addon 
        $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);

        // Crea tabella per i gruppi di addon 
        $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');
26 dic 2012 14:35:02
Commenti

Ha funzionato. Ho letto che dbDelta è capriccioso ma non avevo capito che non capitalizzare CREATE TABLE avrebbe causato un fallimento.

mehulved mehulved
27 dic 2012 07:21:00

Anche se WordPress non lo menziona nella sua pagina del codex, non puoi avere una virgola finale nell'ultima riga. Esempio: PRIMARY KEY (id),. dbDelta afferma effettivamente di creare la tabella anche se non lo fa

JoeMoe1984 JoeMoe1984
8 mag 2015 21:57:12

Solo per riferimento, il problema con la virgola finale, PRIMARY KEY (id), è un problema SQL, non di dbDelta né di WordPress. Da qui l'assenza di documentazione.

Jeremy Jeremy
16 ott 2015 19:19:53

Nota che quando crei più query con dbDelta() puoi passare i tuoi SQL come un array a dbDelta invece di chiamare dbDelta individualmente per ogni query.

toni_lehtimaki toni_lehtimaki
11 ott 2017 14:37:27

Un altro punto da aggiungere alla lista: Non dovresti avere una riga vuota nella tua query.

Koorosh Koorosh
28 nov 2024 00:35:56
0

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);
31 mar 2016 15:58:03
0

Utilizzare 'CREATE TABLE' invece di 'create table' ha risolto il problema per me.

3 lug 2017 10:25:03
0

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

Anche se hai sviluppato il tuo plugin e scritto il codice corretto, devi comunque riattivare il tuo plugin per attivare l'hook, in modo che la tua tabella venga creata quando il plugin viene attivato.

25 feb 2019 10:34:55
6
-2

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

"CREATE TABLE " . $packagetable . "(

e

id mediumint(9) NOT NULL AUTO_INCREMENT,

in:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

o questo:

name text NOT NULL,

in:

name TEXT NOT NULL,

e così via

8 gen 2017 15:22:39
Commenti

"Le parole chiave SQL, come […], devono essere in maiuscolo". Scusa, ma no, questo non è vero.

kaiser kaiser
8 gen 2017 15:52:46

per utilizzare la funzione dbDelta, dovremmo usare il maiuscolo. per favore controlla questa pagina: https://codex.wordpress.org/Creating_Tables_with_Plugins

shirin niki shirin niki
8 gen 2017 15:56:25

Scusa, ma non riesco a leggerlo da nessuna parte nel sorgente. Mi sono perso qualcosa? Forse vorresti aggiungere un mini-plugin di esempio alla tua risposta che dimostri che fallisce (che qualcuno può prendere e testare) con la sintassi in minuscolo?

kaiser kaiser
8 gen 2017 15:59:44

in questo link: link , il primo paragrafo di "Creazione o Aggiornamento della Tabella" menziona questo problema.

shirin niki shirin niki
8 gen 2017 16:13:35

Questo è vero solo per CREATE TABLE, CREATE DATABASE, INSERT INTO, e UPDATE. Tutto il resto o non viene utilizzato in un confronto case-sensitive o viene convertito in minuscolo. I tuoi suggerimenti non hanno alcun effetto.

fuxia fuxia
8 gen 2017 16:52:37

ma per me funziona, all'inizio ho usato le maiuscole solo per create table, e il mio plugin non restituiva errori, ma la tabella non veniva creata, mentre la seconda volta che ho cambiato anche le altre parti in maiuscolo ha funzionato correttamente.

shirin niki shirin niki
9 gen 2017 08:42:25
Mostra i restanti 1 commenti