dbDelta ne crée pas de tables

15

J'ai parcouru beaucoup de threads, page de codex et essayé de jouer avec beaucoup de choses mais mon code ne semble pas créer les tables. Et je ne peux pas comprendre où je me trompe. J'ai vérifié booking_db_version dans la base de données, il est mis à jour lorsque je le mets à jour dans le fichier.

Voici le code

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');
mehulved
la source

Réponses:

18

De WordPress-codex à propos de dbDelta :

La fonction dbDelta examine la structure de table actuelle, la compare à la structure de table souhaitée et ajoute ou modifie la table si nécessaire, de sorte qu'elle peut être très pratique pour les mises à jour (voir wp-admin / upgrade-schema.php pour plus d'exemples de comment utiliser dbDelta). Notez cependant que la fonction dbDelta est plutôt pointilleuse. Par exemple:

  • Vous devez placer chaque champ sur sa propre ligne dans votre instruction SQL.
  • Vous devez avoir deux espaces entre les mots PRIMARY KEY et la définition de votre clé primaire.
  • Vous devez utiliser le mot clé KEY plutôt que son synonyme INDEX et vous devez inclure au moins une KEY.
  • Vous ne devez pas utiliser d'apostrophes ou de retours en arrière autour des noms de champ.

Avec ces mises en garde, voici les lignes suivantes de notre fonction, qui créeront ou mettront à jour le tableau. Vous devrez remplacer votre propre structure de table dans la variable $ sql.

J'ai changé de sql: "create table $packagetable (

Pour ça: "CREATE TABLE " . $packagetable . " (

Voici une copie de travail de votre code:

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');
Pontus Abrahamsson
la source
1
Cela a fonctionné. J'ai lu que dbDelta est capricieux mais je ne me suis pas rendu compte que ne pas capitaliser CREATE TABLEentraînerait son échec.
mehulved
2
Bien que Wordpress ne le dise pas sur leur page codex, vous ne pouvez pas avoir de virgule de fin sur la dernière ligne. Exemple: PRIMARY KEY (id),. dbDelta dit en fait qu'il crée la table même si ce n'est pas le cas
JoeMoe1984
1
Juste pour référence, le problème avec la virgule de fin PRIMARY KEY (id),est un problème SQL, pas dbDelta ni un problème WP. Par conséquent, aucune documentation.
Jeremy
Notez que lorsque vous créez plusieurs requêtes avec, dbDelta()vous pouvez transmettre vos SQL sous forme de tableau à dbDeltaau lieu d'appeler dbDeltaindividuellement pour chaque requête.
toni_lehtimaki
1

Vous pouvez essayer cette fonction :

$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);
mirza
la source
0

L'utilisation de 'CREATE TABLE' au lieu de 'create table' a résolu le problème pour moi.

Kallol
la source
0

Outre tous ces points importants, vous devez déclencher le crochet d'activation.

Pendant que vous avez développé votre plugin et écrit le code correct, vous devez toujours réactiver votre plugin pour déclencher le hook, donc votre table sera créée lorsque le plugin sera activé.

Adi Prasetyo
la source
-2

Les mots clés SQL, comme CREATE TABLE et UPDATE, doivent être en majuscules. changez donc la ligne de la table de création en:

"CREATE TABLE " . $packagetable . "( 

et

id mediumint(9) NOT NULL AUTO_INCREMENT,

à:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

ou ca:

name text NOT NULL, 

à:

name TEXT NOT NULL, 

etc

shirin niki
la source
"Les mots clés SQL, comme […], doivent être en majuscules" . Désolé, mais non, ce n'est pas vrai.
kaiser
pour utiliser la fonction dbDelta, nous devons utiliser des majuscules. veuillez consulter cette page: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki
Désolé, mais je ne peux lire cela nulle part dans la source . Ai-je oublié quelque chose? Peut-être que vous voulez ajouter un exemple de mini-plugin à votre réponse qui montre qu'il échoue (que quelqu'un peut prendre et tester) avec une syntaxe en boîtier inférieure?
kaiser
dans ce lien: lien , le premier paragraphe de Création ou mise à jour du tableau mentionne ce problème.
shirin niki
Ceci est vrai que pour CREATE TABLE, CREATE DATABASE, INSERT INTOet UPDATE. Tout le reste n'est pas utilisé dans une comparaison sensible à la casse ou converti en minuscules . Vos suggestions n'ont aucun effet.
fuxia