2014-01-24 391 views
3

我試圖更新我的插件。所以我必須升級mysql_table。但是當嘗試新的列時,程序會得到異常。向wordpress數據庫添加新列

這是我目前的表:

$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); 

現在我添加科拉姆更多的一個表。我嘗試更改表,這工作一次,並添加一列,但更多的刷新我得到這個錯誤。

這是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 

請幫忙。謝謝。 對不起,壞的英語。

+0

這是因爲你的數據庫做它的設計目的......持久性 – AmazingDreams

回答

6

使用此查詢。我只使用快速查詢的mysql-standred的GET字段的名稱,這將解決您的問題:

$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"); 
} 
+0

我以前試過這個,但是並不適合我:( –

+0

請問你能否提供查詢,以便我可以檢查你的查詢中有什麼問題? – Addy

+1

正確回答這個問題。其他答案,如果表爲空會得到錯誤。 –

5

您可以檢查使用以下方式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"); 
} 
+0

Ahaaa是這對我有效。謝謝:) –

+0

我喜歡這個版本。 – atwellpub

+2

不錯的工作,效果很好。我已經在此基礎上添加了[我自己的答案](https://stackoverflow.com/a/48691322/2748327)。基本上只是工作確保我們不硬編碼我們不需要的任何東西。 +1 – davewoodhall

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鉤。

它也更清潔,顯示清晰的升級路徑,並且只執行必要的更新 - 因此效率更高。

0

我真的很喜歡Rikesh's option(甚至upvoted!),但我想,以防止可能發生變化硬編碼信息,如$table_prefixwp-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")); 
}