php 添加新列到wordpress数据库

mefy6pfw  于 2023-03-07  发布在  PHP
关注(0)|答案(8)|浏览(119)

我试图更新我的插件。所以我必须升级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

帮帮忙。谢谢。抱歉,英语不好。

lvjbypge

lvjbypge1#

使用这个查询。我只使用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");
}
7ajki6be

7ajki6be2#

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

0md85ypi3#

如果列不存在,向表中添加新列的最佳和正确方法。

/*@ Add status column if not exist */
global $wpdb;
$dbname = $wpdb->dbname;

$marks_table_name = $wpdb->prefix . "wpsp_mark";

 $is_status_col = $wpdb->get_results(  "SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS`    WHERE `table_name` = '{$marks_table_name}' AND `TABLE_SCHEMA` = '{$dbname}' AND `COLUMN_NAME` = 'status'"  );

if( empty($is_status_col) ):
    $add_status_column = "ALTER TABLE `{$marks_table_name}` ADD `status` VARCHAR(50) NULL DEFAULT NULL AFTER `attendance`; ";

    $wpdb->query( $add_status_column );
endif;
yvfmudvl

yvfmudvl4#

只是想补充一点,有一个稍微好一点的方法来做这件事比@阿曼迪普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()函数中,您只需确保在每个后续case之前递增$current_version
通过这种设置,您可以盲目地进行更新,而不必先进行不必要的查询来确定列或表是否存在--而且查询次数少总是一件好事......特别是当您的更新代码在plugins_loaded钩子上触发时。
它也更干净,显示了清晰的升级路径,并且只执行必要的更新-因此效率更高。

6jygbczu

6jygbczu5#

我真的很喜欢Rikesh's option(甚至投票赞成!),但我认为为了防止硬编码信息可能发生变化,如wp-config.php文件中的$table_prefix,此选项是一个更安全的选择。

// 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") );
}
xtupzzrd

xtupzzrd6#

编写了一个很好的解决方案,它在所有情况下都有效

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

eoxn13cs7#

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

如果数据库中没有记录,这段代码将失败。只有在数据库中至少保存了一条记录时才有效。

ff29svar

ff29svar8#

在这个帖子里有很多人说他们有最好的答案,或者他们想出了一个更好的解决方案。
WordPress有一个内置的函数:可能添加列()https://developer.wordpress.org/reference/functions/maybe_add_column/

global $wpdb;
$table_name = $wpdb->prefix . 'wp_customer_say';
$column_name = 'say_state';
$create_ddl = "ALTER TABLE $table_name ADD $column_name INT(1) NOT NULL DEFAULT 1;";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
maybe_add_column($table_name, $column_name, $create_ddl);

相关问题