web-dev-qa-db-fra.com

dbDelta ne crée pas de tables

Je suis passé par beaucoup de threads, de pages de codex et j'ai essayé de jouer avec beaucoup de choses mais mon code ne semble pas créer les tables. Et je ne suis pas capable de comprendre où je vais mal. J'ai vérifié booking_db_version dans la base de données, elle est mise à jour lorsque je la 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');
13
mehulved

De WordPress-codex sur dbDelta :

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

  • Vous devez mettre 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 la clé Word KEY plutôt que son synonyme INDEX et vous devez inclure au moins une clé.
  • Vous ne devez pas utiliser d'apostrophes ni de backticks autour des noms de champs.

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

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

Pour cela: "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');
15
Pontus Abrahamsson

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);
1
motto

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, afin que votre table soit créée lors de l'activation du plugin.

0
Adi Prasetyo

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

0
Kallol