函数文档

maybe_drop_column()

💡 云策文档标注

概述

maybe_drop_column() 函数用于从数据库表中删除指定列(如果存在)。它通过检查列是否存在并执行 SQL 删除语句来实现,返回操作成功或列不存在的状态。

关键要点

  • 函数接受三个参数:$table_name(表名)、$column_name(列名)和 $drop_ddl(删除列的 SQL 语句)。
  • 返回值:成功删除或列不存在时返回 true,失败时返回 false。
  • 使用 $wpdb->get_col() 检查列是否存在,$wpdb->query() 执行删除操作。
  • 函数在删除后再次检查列是否仍存在,以间接判断操作是否成功。

代码示例

function maybe_drop_column( $table_name, $column_name, $drop_ddl ) {
    global $wpdb;

    // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
    foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
        if ( $column === $column_name ) {

            // Found it, so try to drop it.
            // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- No applicable variables for this query.
            $wpdb->query( $drop_ddl );

            // We cannot directly tell whether this succeeded!
            // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
            foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
                if ( $column === $column_name ) {
                    return false;
                }
            }
        }
    }

    // Else didn't find it.
    return true;
}

注意事项

  • 函数使用 $wpdb 全局变量进行数据库操作,确保在 WordPress 环境中调用。
  • SQL 语句 $drop_ddl 需要正确格式化以删除列,例如 "ALTER TABLE table_name DROP COLUMN column_name"。
  • 函数通过二次检查列是否存在来间接判断删除是否成功,因为 $wpdb->query() 可能不直接返回失败状态。
  • 代码中包含 PHPCS 注释以忽略 SQL 准备检查,因为表名和列名可能无法参数化。

📄 原文内容

Drops column from database table, if it exists.

Parameters

$table_namestringrequired
Database table name.
$column_namestringrequired
Table column name.
$drop_ddlstringrequired
SQL statement to drop column.

Return

bool True on success or if the column doesn’t exist. False on failure.

Source

function maybe_drop_column( $table_name, $column_name, $drop_ddl ) {
	global $wpdb;

	// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
	foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
		if ( $column === $column_name ) {

			// Found it, so try to drop it.
			// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- No applicable variables for this query.
			$wpdb->query( $drop_ddl );

			// We cannot directly tell whether this succeeded!
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Cannot be prepared. Fetches columns for table names.
			foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) {
				if ( $column === $column_name ) {
					return false;
				}
			}
		}
	}

	// Else didn't find it.
	return true;
}

Changelog

Version Description
1.0.0 Introduced.