无法使用DBDelta在插件激活时创建新的数据库表

时间:2017-02-06 作者:Himanshu

当我的插件使用dbDelta()激活时,我试图创建一个新的数据库表,但似乎没有创建新表。由于我是WordPress开发的新手,请告诉我哪里出了问题。

<?php
/*
Plugin Name: Xenon-Result
Plugin URI:  https://developer.wordpress.org/plugins/the-basics/
Description: Basic WordPress Plugin Header Comment
Version:     1.0
Author:      Himanshu Gupta
Author URI:  https://developer.wordpress.org/
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
function installer(){
    include(\'installer.php\');
}
register_activation_hook( __file__, \'installer\' ); //executes installer php when installing plugin to create new database

add_action(\'admin_menu\',\'result_menu\'); //wordpress admin menu creation
function result_menu()
{
    add_menu_page(\'Result\',\'Result\',\'administrator\',\'xenon-result\');
    add_submenu_page( \'xenon-result\', \'Manage Marks\', \' Manage Marks\', \'administrator\', \'Manage-Xenon-Marks\', \'Xenon_Marks\' );
}
function Xenon_Marks()
{
    include(\'new/result-add-marks.php\');
}
?>
这是安装程序。php文件:

<?php
global $wpdb;
$table_name = $wpdb->prefix . "xenonresult";

$charset_collate = $wpdb->get_charset_collate();
if(!isset($table_name)){
$sql = "CREATE TABLE $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT
    student-id mediumint(9) NOT NULL,
    student-name text NOT NULL,
    marks-obtained int(9) NOT NULL,
    result text NOT NULL,
    PRIMARY KEY  (id)
)    $charset_collate;";

require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
dbDelta( $sql );
}
?>

2 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

以下是的更新版本installer.php 它在激活插件时创建表。

在继续创建新表之前,已添加检查以查看自定义表是否存在。

还添加了版本号。它存储在选项表中。如果在更新过程中需要修改数据库,这将在将来有所帮助。

<?php
    global $wpdb;
    $table_name = $wpdb->prefix . "xenonresult";
    $xenonresult_db_version = \'1.0.0\';
    $charset_collate = $wpdb->get_charset_collate();

    if ( $wpdb->get_var( "SHOW TABLES LIKE \'{$table_name}\'" ) != $table_name ) {

        $sql = "CREATE TABLE $table_name (
                id mediumint(9) NOT NULL AUTO_INCREMENT,
                `student-id` mediumint(9) NOT NULL,
                `student-name` text NOT NULL,
                `marks-obtained` int(9) NOT NULL,
                result text NOT NULL,
                PRIMARY KEY  (id)
        )    $charset_collate;";

        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        dbDelta( $sql );
        add_option( \'xenonresult_db_version\', $xenonresult_db_version );
    }
原始代码存在一些问题:

if(!isset($table_name)){
这总是会回来的true 因为$table_name 已设置。

此行末尾缺少逗号:

id mediumint(9) NOT NULL AUTO_INCREMENT
表名中的某些字符要求将表名括在反勾中,this includes hyphens:

student-id mediumint(9) NOT NULL,
student-name text NOT NULL,
marks-obtained int(9) NOT NULL,
为了帮助调试,当遇到这样的问题时,最好检查PHP错误日志。

SO网友:jamietelin

你有什么错误吗?感觉这只是一个SQL问题。您是否手动测试了SQL查询并查看其是否有效?

我使用了以下方法,并且可以正常工作,我还设置并检查了表格版本,以备将来更新:

public function createDb()
{
         global $wpdb;

         $charsetCollate = $wpdb->get_charset_collate();

         require_once(constant(\'ABSPATH\') . \'wp-admin/includes/upgrade.php\');

         $tableName = $wpdb->prefix . \'mypluginname\';
         $sql = "CREATE TABLE $tableName (
             id bigint(20) NOT NULL AUTO_INCREMENT,
             word varchar(255) DEFAULT \'\' NOT NULL,
             length int(9) DEFAULT 0 NOT NULL,
             UNIQUE KEY id (id)
         ) $charsetCollate;";
         dbDelta($sql);

         update_option(\'myplugin_db_version\', constant(\'MYPLUGIN_DB_VERSION\'));
}
此外,在插件启动时,我会检查db版本,并在需要时进行更新。

public function __construct()
{
   $installedDbVersion = get_option("myplugin_db_version");
   $pluginDbVersion = constant(\'MYPLUGIN_DB_VERSION\');
   if ((float)$installedDbVersion !== constant(\'MYPLUGIN_DB_VERSION\') &&
      $installedDbVersion !== false
   ) {
    $this->createDb();
    $message = "Updated plugin tables from version ";
    $message .= "{$installedDbVersion} to {$pluginDbVersion}";
    trigger_error($message, E_USER_NOTICE);
   }
}