插件中的数据库查询不起作用

时间:2018-10-22 作者:user2584538

我正在开发一个插件。我想通过插件创建一个表。所以我尝试执行下面的SQL查询。

global $wpdb;
$createSQL              =   "
CREATE TABLE `". $wpdb->prefix ."_book_ratings` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `book_id` bigint(20) UNSIGNED NOT NULL,
  `rating` float(3.1) UNSIGNED NOT NULL,
  `user_ip` varchar(32) NOT NULL
) ENGINE=InnoDB" . $wpdb->get_charset_collate() . " AUTO_INCREMENT=1;
";

require( ABSPATH . \'/wp-admin/includes/upgrade.php\' );
dbDelta( $createSQL );
当我停用插件和重新激活插件时,我会遇到以下错误。

The plugin generated 464 characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.

请让我知道我错在哪里。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

查看中的SQL查询$createSQL,

  1. ENGINE=InnoDB" . $wpdb->get_charset_collate() . " AUTO_INCREMENT=1; 收益率:

    查询中出错(1286):未知的存储引擎“InnoDBDEFAULT”

    要修复它,请在ENGINE=InnoDB (存储引擎)和" . $wpdb->get_charset_collate() (字符集)。

    您已经定义了列idAUTO_INCREMENT, 但该列不是键,这会导致以下错误:

    查询错误(1075):表定义不正确;只能有一个自动列,必须将其定义为键

    要修复它,请定义列id 作为键使用PRIMARY KEY (id)KEY(id).

    因此,以下是在WordPress 4.9.8上尝试和测试的固定代码(或SQL查询):

    $createSQL              =   "
    CREATE TABLE `". $wpdb->prefix ."_book_ratings` (
      `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
      `book_id` bigint(20) UNSIGNED NOT NULL,
      `rating` float(3.1) UNSIGNED NOT NULL,
      `user_ip` varchar(32) NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB " . $wpdb->get_charset_collate() . " AUTO_INCREMENT=1;
    ";
    
    如果这对你不起作用,请遵循指南here, 例如,在单词主键和主键定义之间使用两个空格。

结束