dbDelta不创建表


15

我经历了很多线程和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');

Answers:


18

从有关dbDelta的 WordPress-codex中获取

dbDelta函数检查当前表结构,将其与所需的表结构进行比较,并根据需要添加或修改该表,因此更新非常方便(有关更多示例,请参阅wp-admin / upgrade-schema.php)。如何使用dbDelta)。注意,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');

1
确实有效。我读到dbDelta是挑剔的,但没有意识到不使用大写字母CREATE TABLE会导致它失败。
2012年

2
尽管Wordpress在他们的法典页面上没有说这个,但最后一行不能有逗号结尾。范例:PRIMARY KEY (id),。dbDelta实际上说即使没有创建表也是如此
JoeMoe1984

1
仅供参考,尾随逗号的问题PRIMARY KEY (id),是SQL问题,而不是dbDelta或WP问题。因此,没有文档。
杰里米(Jeremy)2015年

请注意,使用创建多个查询时,dbDelta()您可以将SQL作为数组传递给,dbDelta而不是dbDelta为每个查询单独调用。
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

SQL关键字(例如CREATE TABLE和UPDATE)必须为大写。因此将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关键字,例如[…],必须为大写”。抱歉,但这不是事实。
kaiser

对于使用dbDelta函数,应该使用大写。请检查此页:codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

抱歉,但是我在源代码中看不到任何内容。我错过了什么?也许您想在答案中添加一个示例迷你插件,以显示它使用小写语法失败(有人可以接受并测试)?
kaiser

在此链接:link中,“创建或更新表”的第一段提到了此问题。
shirin niki

这是唯一的真正的CREATE TABLECREATE DATABASEINSERT INTO,和UPDATE。其他所有内容要么不用于区分大小写的比较,要么转换为小写。您的建议无效。
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.