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