dbDeltaがテーブルを作成していません


15

私は多くのスレッド、コーデックスページを通過し、多くのものをいじりましたが、私のコードはテーブルを作成していないようです。そして、私はどこが間違っているのか理解できません。データベースでbooking_db_versionをチェックしましたが、ファイルで更新すると更新されます。

ここにコードがあります

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');

回答:


18

WordPress-codexからdbDeltaについて:

dbDelta関数は、現在のテーブル構造を調べ、それを目的のテーブル構造と比較し、必要に応じてテーブルを追加または変更するため、更新に非常に便利です(詳細についてはwp-admin / upgrade-schema.phpを参照してください) dbDeltaの使用方法)。ただし、dbDelta関数はかなりうるさいことに注意してください。例えば:

  • SQLステートメントでは、各フィールドを独自の行に配置する必要があります。
  • PRIMARY KEYと主キーの定義の間に2つのスペースが必要です。
  • シノニムINDEXではなくキーワードKEYを使用し、少なくとも1つのKEYを含める必要があります。
  • フィールド名の周りにアポストロフィまたはバックティックを使用しないでください。

これらの警告を使用して、実際にテーブルを作成または更新する関数の次の行があります。$ sql変数で独自のテーブル構造を置き換える必要があります。

私はあなたのSQLを変更しました: "create table $packagetable (

これに: "CREATE TABLE " . $packagetable . " (

コードの作業コピーは次のとおりです。

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');

1
うまくいきました。dbDeltaは細心の注意を払っていますが、大文字を使用しないCREATE TABLEと失敗します。
測定

2
Wordpressはコーデックスページでこれを言っていませんが、最後の行に末尾のコンマを置くことはできません。例:PRIMARY KEY (id),。dbDeltaは実際にはテーブルを作成しますが、テーブルは作成しません
-JoeMoe1984

1
参考のために、末尾のコンマのPRIMARY KEY (id),問題はSQLの問題であり、dbDeltaやWPの問題ではありません。したがって、ドキュメントはありません。
ジェレミー

複数のクエリを作成する場合、クエリごとに個別に呼び出す代わりにdbDelta()、SQLを配列として渡すことができます。dbDeltadbDelta
-toni_lehtimaki

1

この機能を試すことができます

$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);

0

「テーブルの作成」の代わりに「テーブルの作成」を使用すると、問題が解決しました。


0

これらすべての重要な点に加えて、アクティベーションフックをトリガーする必要があります。

プラグインを開発して正しいコードを記述したが、フックをトリガーするにはプラグイン再度アクティブにする必要があるため、プラグインがアクティブになるとテーブルが作成されます。


-2

CREATE TABLEやUPDATEなどのSQLキーワードは大文字でなければなりません。create tableの行を次のように変更します。

"CREATE TABLE " . $packagetable . "( 

そして

id mediumint(9) NOT NULL AUTO_INCREMENT,

に:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

またはこれ:

name text NOT NULL, 

に:

name TEXT NOT NULL, 

等々


「[…]などのSQLキーワードは大文字でなければなりません」。申し訳ありませんが、いいえ、これは真実ではありません。
カイザー

dbDelta関数を使用するには、大文字を使用する必要があります。このページを確認してください:codex.wordpress.org/Creating_Tables_with_Plugins
shirin

申し訳ありませんが、ソースのどこにも書かれていません。私は何か見落としてますか?たぶん、小文字の構文で失敗することを示すミニプラグインの例を回答に追加したいかもしれませんか?
カイザー

このリンク:linkでは、テーブルの作成または更新の最初の段落でこの問題に言及しています。
シリンニキ

これは、のためにのみ真であるCREATE TABLECREATE DATABASEINSERT INTO、とUPDATE。その他はすべて、大文字と小文字を区別する比較で使用されないか、小文字に変換されます。あなたの提案は効果がありません。
FUXIA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.