我试图更新我的插件。所以我必须升级mysql_table。但当尝试新的列,程序得到异常。
这是我当前的表:
$sql = "CREATE TABLE {$table_name} (
say_id int(11) not null AUTO_INCREMENT,
customer_mail text not null,
customer_name text not null,
customer_messagge text not null,
messagge_date_time datetime not null,
PRIMARY KEY (say_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
require_once(ABSPATH . "wp-admin/includes/upgrade.php");
dbDelta($sql);
现在我添加列多一个表。我尝试改变表,这工作了一次,并添加了一列,但一个更多的刷新我得到这个错误。
这是我的代码
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT 1");
这是我的错
WordPress数据库错误:[列名“say_state”重复] ALTER表格wp_customer_say ADD say_state INT(1)非空默认值1
我看到这个错误,就尝试这个;
$query = $wpdb->query("select * from wp_customer_say");
$respond = mysql_num_fields( $query );
$column_array = array();
for($i = 0; $i < $respond ; $i++):
$column_array[] = mysql_field_name($query,$i);
endfor;
if( !in_array("say_state",$column_array) ):
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT 1");
endif;
我得到了这个错误。
Warning: mysql_num_fields() expects parameter 1 to be resource, integer given in
帮帮忙。谢谢。抱歉,英语不好。
8条答案
按热度按时间lvjbypge1#
使用这个查询。我只使用mysql-standred通过快速查询获取字段名称,这将解决您的问题:
7ajki6be2#
您可以使用以下方式检查WordPress中是否存在列名,
0md85ypi3#
如果列不存在,向表中添加新列的最佳和正确方法。
yvfmudvl4#
只是想补充一点,有一个稍微好一点的方法来做这件事比@阿曼迪普Wadhawan的答案。
您只需确保
install_tables()
函数始终创建反映最终版本号的表,并将my_plugins_current_db_version
选项设置为最终版本号。然后在
update_databases()
函数中,您只需确保在每个后续case之前递增$current_version
。通过这种设置,您可以盲目地进行更新,而不必先进行不必要的查询来确定列或表是否存在--而且查询次数少总是一件好事......特别是当您的更新代码在
plugins_loaded
钩子上触发时。它也更干净,显示了清晰的升级路径,并且只执行必要的更新-因此效率更高。
6jygbczu5#
我真的很喜欢Rikesh's option(甚至投票赞成!),但我认为为了防止硬编码信息可能发生变化,如
wp-config.php
文件中的$table_prefix
,此选项是一个更安全的选择。xtupzzrd6#
编写了一个很好的解决方案,它在所有情况下都有效
eoxn13cs7#
如果数据库中没有记录,这段代码将失败。只有在数据库中至少保存了一条记录时才有效。
ff29svar8#
在这个帖子里有很多人说他们有最好的答案,或者他们想出了一个更好的解决方案。
WordPress有一个内置的函数:可能添加列()https://developer.wordpress.org/reference/functions/maybe_add_column/