Добавить новый столбец в базу данных wordpress

Я пытаюсь обновить свой плагин. Поэтому я должен обновить 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, это работает один раз и добавляет столбец, но еще одно обновление. Я получаю эту ошибку.

Это mycode

 $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 

Помоги пожалуйста. Спасибо. Извините плохой английский.

Используйте этот запрос. Я использую только 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"); } 

Вы можете проверить имя столбца в 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"); } 

Просто хотел добавить, что есть немного лучший способ сделать это, чем ответить @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 перед каждым последующим случаем.

С помощью этой настройки вы можете вслепую обновить без необходимости лишнего запроса, чтобы узнать, существуют ли столбцы или таблицы в первую очередь – и меньше запросов всегда хорошо … особенно, если ваш код обновления plugins_loaded помощью plugins_loaded hook.

Он также намного чище, показывает четкий путь обновления и только выполняет необходимые обновления, поэтому он более эффективен.