web-dev-qa-db-ja.com

dbDeltaは最後のテーブルだけを作成します

私はコーデックスを参照するようにdbDeltaで次のインストール関数を使用していますSOの記事PRIMARY KEYで2つのスペースではなく1つのスペース...

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は、最後の$sql変数のみを格納します。そしてecho $wpdb->last_error;はエラーを表示しませんか?私の失敗はどこにありますか?

BR; Mybecks

4
mybecks

SQLステートメントごとにdbDeltaを別々に実行します。

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

WooCommerceのようないくつかのプラグインがすべてのテーブルに対してdbDeltaを呼び出さなくてもそれを実行できる方法を理解しようとしている人にとって、その理由はqueryのIF NOT EXISTS部分です。 dbDelta関数は、CREATE TABLEの後にくるものに基づいてインデックスを作成するので、すべてのクエリが同じテーブルを作成すると推測してしまいます。

ここに来たら、CREATE TABLE tablenameだけを使ってみてください。

2
Felipe Elia