如何创建数据库表?

时间:2017-06-03 作者:petrichor-vellichor

我查看了不同的来源,但似乎仍然无法更新我的数据库。

还是我把它放错了?

我放置了一个includes "createTable.php" 在我的主插件代码的开头。

在我的createTable。php这是我写的代码:

function activate() {
    global $wpdb;


    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . "event";
    if ($wpdb->get_var("SHOW TABLES LIKE " . $table_name) != $table_name) {
        $sql = "CREATE TABLE" . $table_name . "(
  id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
  dateOfEvent DATETIME DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
  eventName VARCHAR(100) DEFAULT \'\'  NOT NULL,
  PRIMARY KEY (id)
) $charset_collate";
    }
    require_once(ABSPATH . "wp-admin/includes/upgrade.php");
    dbDelta($sql);
}

register_activation_hook(__FILE__, "activate");
谁能告诉我我做错了什么吗?谢谢

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这里发生了几件事

首先,你的dbDelta 呼叫从未收到CREATE SQL语句。$sql 仅当if语句为true时定义,并且如果开发人员环境设置正确,则运行此代码应生成PHP警告。你真的在跑步dbDelta(\'\');

dbDelta 但已经进行了此检查。它不是为了创建表,而是为了更新它们的模式,因此名称中有“delta”部分,因此立即的改进是:

// not guaranteed to work
function activate() {
    global $wpdb;
    $table_name = $wpdb->prefix . "event";
    $sql = "CREATE TABLE" . $table_name . "(
  id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
  dateOfEvent DATETIME DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
  eventName VARCHAR(100) DEFAULT \'\'  NOT NULL,
  PRIMARY KEY (id)
) $charset_collate";
    require_once(ABSPATH . "wp-admin/includes/upgrade.php");
    dbDelta($sql);
}
最后,SQL语句可能有效,但格式不正确。

谷歌搜索dbDelta 揭示this codex page 第二个结果是,按照以下说明:

您必须在SQL语句中将每个字段放在自己的行上必须使用关键字key而不是其同义词索引,并且必须至少包含一个关键字

您的字段类型都是大写,dbDelta 要求它们都是小写的PRIMARY KEY 以及(id)

global $wpdb;

$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $table_name (
  id mediumint(9) NOT NULL AUTO_INCREMENT,
  time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
  name tinytext NOT NULL,
  text text NOT NULL,
  url varchar(55) DEFAULT \'\' NOT NULL,
  PRIMARY KEY  (id)
) $charset_collate;";

require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
dbDeltaEXTREMELY 对其输入内容挑剔且具体。仅仅因为它是有效的SQL并不意味着它是有效的dbDelta 输入请非常仔细地遵循指南和说明。

侧注创建一个名为event 并使用发布后日期,而不是dateOfEvent. 使用pre_get_posts 筛选以修改显示的帖子,以便显示将来的帖子

这将非常容易做到,使用WordPress中的缓存系统,为您提供URL即插即用、免费GUI、导入/导出支持,并且有大量插件已经做到了这一点,您可以使用它们。

如果可以使用自定义post类型,请不要使用自定义表和原始SQL语句

结束

相关推荐

Database for development

虽然构建插件,但我最大的烦恼之一是我的开发机器与实际安装不匹配。我这里的意思是,我的数据库缺乏。我会编写一些代码,认为它可以工作(因为它在开发过程中工作),然后发现它不能工作,因为我忽略了本地数据库中缺少的一个小细节。即使是我自己的在线安装也不包含完整的数据库。是否有一套预先填写了通常WP内容的db?甚至是自动添加行和列的脚本?我正在寻找不同角色、自定义帖子类型、分类法、评论等的用户,这些用户只能出于开发目的访问?如果没有,是否有人有一个旧站点的备份,他们想共享?