【问题标题】:dbDelta/SQL error, very unexpecteddbDelta/SQL 错误,非常意外
【发布时间】:2011-06-28 21:16:00
【问题描述】:

这是我遇到的一个错误。当我在 Wordpress 中使用 dbDelta 函数时会发生这种情况。我实在想不通,也许其他人有类似的经历?我的代码:

$sql1 = "CREATE TABLE `".$table_name1."` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT  PRIMARY KEY ,
`blogid` INT( 11 ) NOT NULL ,
`symbol` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM";

我在 theme_switch 操作期间触发此代码。当我打开主题时,它似乎不会发生,只有当我切换到其他东西时(我知道,这很奇怪)。我已阅读并尝试遵循Wordpress.org 中提到的警告,例如在主键和定义之间放置两个空格。我还有另外两段类似的 SQL 代码会产生相同的错误;这三个最初都是由 phpMyAdmin 生成的,所以我知道它们可以工作。

Notice: Undefined offset: 1 in /Applications/MAMP/htdocs/wp-experiment/wp-admin/includes/upgrade.php on line 1463

Notice: Undefined offset: 1 in /Applications/MAMP/htdocs/wp-experiment/wp-admin/includes/upgrade.php on line 1463

Notice: Undefined offset: 1 in /Applications/MAMP/htdocs/wp-experiment/wp-admin/includes/upgrade.php on line 1463

WordPress database error: [Multiple primary key defined]
ALTER TABLE wp_stocks_0 CHANGE COLUMN id `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/wp-experiment/wp-admin/includes/upgrade.php:1463) in /Applications/MAMP/htdocs/wp-experiment/wp-includes/pluggable.php on line 897

如果我误解了 dbDelta,我或许应该补充一下,上面的代码被执行了好几次......所以表已经存在。但如果我理解 dbDelta,那意味着它根本不应该做任何事情,因为 db 结构中没有什么需要改变。

【问题讨论】:

    标签: sql wordpress


    【解决方案1】:

    有点晚了——但在寻找相同错误消息的解决方案时发现了这个问题——我正在为其他发现这个问题的人添加一个答案:

    来自法典文档http://codex.wordpress.org/Creating_Tables_with_Plugins

    • 不得在字段名称周围使用任何撇号或反引号。

    这已经帮我解决了

    【讨论】:

      【解决方案2】:

      我的问题是我在“创建表”和表名之间有一个额外的空格。

      我有:

      $sqlOptions = "CREATE TABLE  $options_table_name (
      

      我需要的地方:

      $sqlOptions = "CREATE TABLE $options_table_name (
      

      挑剔功能

      【讨论】:

      • 我的表名后面缺少空格。确实很挑剔。
      【解决方案3】:

      试试 --

      $sql1 = "CREATE TABLE `".$table_name1."` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `blogid` int(11) NOT NULL,
      `symbol` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=MYISAM";
      

      根据我的经验,dbDelta 甚至比 Codex 中提到的还要麻烦。

      更新
      根据您的编辑,我建议您首先检查/仅在数据库尚不存在时才创建数据库,您可以使用 --

      global $wpdb;
      
      if ($wpdb->get_var("show tables like `" . $wpdb->prefix . $table_name1 . "`") != $wpdb->prefix . $table_name1) {
        // your dbDelta query here
      }
      

      【讨论】:

      • 它没有用,但是它把错误信息改成了 ALTER TABLE wp_stocks_0 ADD PRIMARY KEY (id) :/
      • 如果你使用这里提到的 if 语句,那么以后对表结构的更改将不会被实现。除非您 100% 确定将来永远不会修改表结构,否则我会避免这种结构。
      猜你喜欢
      • 2018-12-06
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多