web-dev-qa-db-fra.com

dbDelta ne crée que la dernière table

J'utilise la fonction d'installation suivante avec dbDelta comme référence au codex, articles sur SO J'ai surveillé les problèmes typiques liés à, par exemple. un espace au lieu de deux espacés à la clé primaire ...

function myplugin_install(){
    global $wpdb;
    $table_name = $wpdb->prefix . "vehicles";       

    $sql = "CREATE TABLE IF NOT EXISTS $table_name 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
        description         VARCHAR(25) NOT NULL,
        PRIMARY KEY  (id)
    );  
    ";

    $sql .= "CREATE TABLE IF NOT EXISTS $table_name1 
    (
        ...
    )";

    $sql .= "CREATE TABLE IF NOT EXISTS $table_nameX 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT ,
        art_alarmierung     VARCHAR(25) NOT NULL ,
        PRIMARY KEY  (id)
    );";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
echo $wpdb->last_error;

}

dbDelata ne stocke que la dernière variable $sql. Et echo $wpdb->last_error; ne montre aucune erreur? Où est mon échec?

BR; mybeck

4
mybecks

Exécutez dbDelta pour chaque instruction SQL séparément:

function myplugin_install(){
    global $wpdb;
    $table_name = $wpdb->prefix . "vehicles";       
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    $sql = "CREATE TABLE IF NOT EXISTS $table_name 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
        description         VARCHAR(25) NOT NULL,
        PRIMARY KEY  (id)
    );  
    ";
    dbDelta($sql);

    $sql2 = "CREATE TABLE IF NOT EXISTS $table_name1 
    (
        ...
    )";
    dbDelta($sql2);

    $sql3 = "CREATE TABLE IF NOT EXISTS $table_nameX 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT ,
        art_alarmierung     VARCHAR(25) NOT NULL ,
        PRIMARY KEY  (id)
    );";

    dbDelta($sql3);

}
6
Stephen Harris

Pour ceux qui essaient de comprendre comment certains plugins, comme WooCommerce, peuvent le faire sans appeler dbDelta pour chaque table, la raison en est la partie IF NOT EXISTS de la requête. La fonction dbDelta crée un index basé sur ce qui vient après CREATE TABLE. Elle finit donc par deviner que toutes les requêtes créent la même table.

Si vous êtes arrivé ici, essayez d'utiliser simplement CREATE TABLE tablename et cela fonctionnera :)

2
Felipe Elia