問題描述

我經歷了很多線程,codex 頁面,並嘗試搞亂了很多事情,但我的代碼似乎沒有創建表。我不能弄清楚我在哪裏錯了。我在數據庫中檢查了 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');

最佳解決方案

來自 WordPress-codex 關於 dbDelta

dbDelta 函數檢查當前的表結構,將其與所需的表結構進行比較,並根據需要添加或修改表,因此可以非常方便更新 (有關如何使用 dbDelta 的更多示例,請參閲 wp-admin /upgrade-schema.php ) 。請注意,dbDelta 函數相當挑剔。例如:

  • 您必須在 SQL 語句中將每個字段放在自己的行上。

  • 您必須在單詞 PRIMARY KEY 和主鍵的定義之間有兩個空格。

  • 您必須使用關鍵字 KEY 而不是其同義詞 INDEX,您必須至少包含一個 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');

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。