問題描述
我經歷了很多執行緒,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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。