我尝试更新我的插件。所以我必须升级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);
现在我添加colum更多一个表。我尝试Alter表,这个工作一次并添加一个列但是再刷新一次我得到了这个错误。
这是我的代码
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT 1");
这是我的错误
WordPress数据库错误:[重复列名'say_state'] ALTER TABLE wp_customer_say ADD say_state INT(1)NOT NULL DEFAULT 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
请帮助。谢谢。 抱歉英文不好。
答案 0 :(得分:9)
使用此查询。我通过快速查询只使用mysql-standred获取字段名称,这将解决您的问题:
$row = $wpdb->get_results( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'wp_customer_say' AND column_name = 'say_state'" );
if(empty($row)){
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT 1");
}
答案 1 :(得分:6)
您可以使用以下方式检查WordPress中存在的列名称,
$myCustomer = $wpdb->get_row("SELECT * FROM wp_customer_say");
//Add column if not present.
if(!isset($myCustomer->say_state)){
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT 1");
}
答案 2 :(得分:1)
只是想补充一点,比@Amandeep Wadhawan的答案还要好一点。
register_activation_hook(__FILE__, 'install_tables');
function install_tables()
{
update_options('my_plugins_current_db_version', 0); // Replace 0 with whatever your final database version is
// Code here to create the final version of your database tables
}
add_action('plugins_loaded', 'update_databases');
public function update_databases()
{
global $wpdb;
$prefix = $wpdb->prefix;
$a_table_to_update = $prefix . $a_table_to_update;
$current_version = get_option('my_plugins_current_db_version', 0);
switch($current_version)
{
// First update
case 0:
// first update code goes here (alter, new table, whatever)
$current_version++;
case 1:
// next update code goes here
$current_version++;
}
update_option('my_plugins_current_db_version', $current_version);
}
您只需确保install_tables()
函数始终创建反映最终版本号的表,并将my_plugins_current_db_version
选项设置为最终版本号。
然后在update_databases()
函数中,您必须确保在每个后续案例之前增加$current_version
。
使用此设置,您可以盲目地更新,而无需不必要地查询以确定列或表是否存在 - 并且较少的查询总是一件好事....特别是如果您的更新代码在{{{ 1}}挂钩。
它也更清晰,显示清晰的升级路径,只执行必要的更新 - 因此效率更高。
答案 3 :(得分:1)
写出一个好的解决方案,它在所有情况下都有效
$check_column = (array) $wpdb->get_results( "SELECT count(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = '{$wpdb->prefix}my_table' AND COLUMN_NAME = 'some_name'" )[0];
$table_name = $wpdb->prefix . 'my_table';
$check_column = (int) array_shift($check_column);
if($check_column == 0) {
$wpdb->query(
"ALTER TABLE $table_name
ADD COLUMN `some_name` VARCHAR(55) NOT NULL
");
}
答案 4 :(得分:1)
$myCustomer = $wpdb->get_row("SELECT * FROM wp_customer_say");
//Add column if not present.
if(!isset($myCustomer->say_state)){
$wpdb->query("ALTER TABLE wp_customer_say ADD say_state INT(1) NOT NULL DEFAULT '' ");
如果您的数据库中没有记录,则此代码将失败。仅在数据库中至少保存了一条记录的情况下有效。
答案 5 :(得分:0)
我非常喜欢Rikesh's option(甚至赞成!),但我认为为了防止可能发生变化的硬编码信息,例如来自$table_prefix
文件的wp-config.php
,此选项更安全
// Replace `table_name` with the actual table name
$table = $table_prefix.'table_name';
// And use sprintf to pass the table name
// Alternatively, you can use $table instead of sprintf,
// if you use double quotes such as shown here
$myCustomer = $wpdb->get_row( sprintf("SELECT * FROM %s LIMIT 1", $table) );
// If you prefer not using sprintf, make sure you use double quotes
// $myCustomer = $wpdb->get_row( "SELECT * FROM $table LIMIT 1" );
// Replace "missing_field" by the column you wish to add
if(!isset($myCustomer->missing_field)) {
$wpdb->query( sprintf( "ALTER TABLE %s ADD phone2 VARCHAR(255) NOT NULL", $table) );
// Alternate example using variable
// $wpdb->query( "ALTER TABLE $table ADD phone2 VARCHAR(255) NOT NULL") );
}
答案 6 :(得分:0)
如果列不存在,将新列添加到表中的最佳正确方法。
$results = $cars->find([
'$expr' => [
'$regexMatch' => [
'input' => 'The Toyota Yaris was named car of the year in 2017.',
'regex' => '$model',
'options' => 'i' // case-insensitive
]
]
]);