问题描述

我经历了很多线程,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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。