假设我有一个现有的表(已经在dB中创建),该表处理用户注册(一个插件),并使用$wpdB->insert插入数据,如下所示:
$success = $wpdb->insert(
$wpdb->mytable,
array(
\'first_name\' => $first_name,
\'last_name\' => $last_name,
\'email\' => $email,
\'activation_key\' => $activation_key,
), array(\'%s\', \'%s\', \'%s\', \'%s\')
);
现在我的问题是,我想在dB中的现有表中添加另一个字段。此字段也应该有自己的数据。处理这种情况的最佳做法是什么?如果数据库中没有列,$wpdB->插入类是否会自动创建列?例如,假设我想在插入中添加爱好字段名:
$success = $wpdb->insert(
$wpdb->mytable,
array(
\'first_name\' => $first_name,
\'last_name\' => $last_name,
\'email\' => $email,
\'hobby\' => $hobby,
\'activation_key\' => $activation_key,
), array(\'%s\', \'%s\', \'%s\', \'%s\')
);
“爱好”数据是否会自动插入到数据库中,并带有新列?如果没有,最简单和推荐的方法是什么?谢谢你的帮助。
最合适的回答,由SO网友:shea 整理而成
否,在向列中插入数据之前,该列必须存在。否则,查询将失败。
您应该编辑表创建SQL查询以适应新列。然后,把它运行一遍dbDelta()
再一次dbDelta()
将比较查询和表结构,只创建缺少的列。
判断数据库结构是否最新的最好方法是将插件版本存储在选项中,并将其与当前插件版本进行比较。
示例:
class Awesome_Plugin {
/** current plugin version */
public $version = \'4.2\';
function __construct() {
$this->create_table();
}
function create_table() {
global $wpdb;
$installed_version = get_option( \'awesome_plugin_version\' );
if ( version_compare( $installed_ver, $this->version, \'!=\' ) ) {
$sql = "CREATE TABLE {$wpdb->prefix}awesome_plugin (
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(100) DEFAULT \'\' NOT NULL,
UNIQUE KEY id (id)
);";
require_once ABSPATH . \'wp-admin/includes/upgrade.php\';
dbDelta( $sql );
update_option( \'awesome_plugin_version\', $this->version );
}
}
}
$awesome_plugin = new Awesome_Plugin();
您可以在
WordPress Codex
SO网友:davidcondrey
Another example:
/**
* Register new database table
*/
add_action( \'init\', \'register_litho_quiz_table\', 1 );
add_action( \'switch_blog\', \'register_litho_quiz_table\' );
function register_litho_quiz_table() {
global $wpdb;
$wpdb->litho_quiz_results = "{$wpdb->prefix}quiz_results";
$wpdb->litho_quiz_questions = "{$wpdb->prefix}quiz_questions";
$wpdb->litho_quiz_choices = "{$wpdb->prefix}quiz_choices";
}
/**
* Create new database table
*/
function create_quiz_tables() {
require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
global $wpdb;
/*
* The global $charset_collate contains the character set and
* collation used by the native WordPress tables. Loosely, these
* define the encodings of characters and how they are compared -
* given that WordPress is used in many different languages it\'s
* important to use the correct collation for your table.
*/
global $charset_collate;
// Call this manually as we may have missed the init hook
register_litho_quiz_table();
/*
* log_id - the log ID.
user_id - the user ID for whom the log corresponds.
activity - the activity that occurred.
object_id - the ID of the object (e.g. post ID, user ID, comment ID etc) that was the subject of the user\'s activity.
object_type - the type of object (e.g. \'post\', \'user\', \'comment\' etc).
activity_date - the datetime of the activity.
table
--key-- --img(255)-- --string(255)--
resultsid resultsimg resultsdescription
resultsid resultsimg resultsdescription
table
--key- --string--
questionid question
questionid question
questionid question
table
--key-- --foreign-- --foreign-- --img(255)-- --string(20)--
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
choiceid questionid resultid choiceimg choicetitle
*/
$sql_create_results = "CREATE TABLE {$wpdb->litho_quiz_results} (
results_id int(2) unsigned NOT NULL auto_increment,
results_img longblob NOT NULL,
results_description varchar,
PRIMARY KEY (results_id)
) $charset_collate; ";
dbDelta( $sql_create_results );
$sql_create_questions = "CREATE TABLE {$wpdb->litho_quiz_questions} (
question_id int(2) unsigned NOT NULL auto_increment,
question_description varchar,
PRIMARY KEY (question_id)
) $charset_collate; ";
dbDelta( $sql_create_questions );
$sql_create_choices = "CREATE TABLE {$wpdb->litho_quiz_choices} (
choice_id int(2) unsigned NOT NULL auto_increment,
choice_img longblob,
choice_description varchar,
question_id int(2) NOT NULL,
results_id int(2) NOT NULL,
results_description varchar NOT NULL,
PRIMARY KEY (choice_id)
FOREIGN KEY (question_id) REFERENCES items(question_id),
FOREIGN KEY (results_id) REFERENCES items(results_id)
) $charset_collate; ";
dbDelta( $sql_create_choices );
}
// Create tables on plugin activation
register_activation_hook( __FILE__, \'create_quiz_tables\' );