dbDelta ne crée pas de tables

12

J'ai parcouru beaucoup de discussions, de pages de codex et 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, 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');
    
posée mehulved 26.12.2012 - 10:41

4 réponses

14

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 selon les besoins, de sorte qu’elle soit très pratique pour les mises à jour (voir wp-admin / upgrade-schema.php d'autres exemples d'utilisation de 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 les définition de votre clé primaire.
  • Vous devez utiliser le mot clé KEY plutôt que son synonyme INDEX et vous doit 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');
    
réponse donnée Pontus Abrahamsson 26.12.2012 - 13:35
0

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);
    
réponse donnée motto 31.03.2016 - 14:58
0

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

    
réponse donnée Kallol 03.07.2017 - 09:25
-2

Les mots-clés SQL, tels que CREATE TABLE et UPDATE, doivent être majuscules. alors changez 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 ceci:

name text NOT NULL, 

à:

name TEXT NOT NULL, 

et ainsi de suite

    
réponse donnée shirin niki 08.01.2017 - 14:22

Lire d'autres questions sur les étiquettes