diff --git a/wp-admin/maint/repair.php b/wp-admin/maint/repair.php new file mode 100644 index 000000000..c05b2b0d3 --- /dev/null +++ b/wp-admin/maint/repair.php @@ -0,0 +1,68 @@ + + +> + + + <?php _e('WordPress › Database Repair'); ?> + + + +

WordPress

+ +To allow use of this page to automatically repair database problems, please add the following line to your wp-config.php file. Once this line is added to your config, reload this page.

define('WP_ALLOW_REPAIR', true);"); +} elseif ( isset($_GET['repair']) ) { + $problems = array(); + check_admin_referer('repair_db'); + + // Loop over the WP tables, checking and repairing as needed. + foreach ($wpdb->tables as $table) { + if ( in_array($table, $wpdb->old_tables) ) + continue; + + $check = $wpdb->get_row("CHECK TABLE {$wpdb->prefix}$table"); + if ( 'OK' == $check->Msg_text ) { + echo "

The {$wpdb->prefix}$table table is okay.

"; + } else { + echo "

The {$wpdb->prefix}$table table is not okay. It is reporting the following error: $check->Msg_text. WordPress will attempt to repair this table…
"; + $repair = $wpdb->get_row("REPAIR TABLE {$wpb->prefix}$table"); + if ( 'OK' == $check->Msg_text ) { + echo "    Sucessfully repaired the {$wpb->prefix}$table table.
"; + } else { + echo "    Failed to repair the {$wpdb->prefix}$table table. Error: $check->Msg_text
"; + $problems["{$wpdb->prefix}$table"] = $check->Msg_text; + } + } + } + + if ( !empty($problems) ) { + printf(__('

Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance.

'), 'http://wordpress.org/support/forum/3'); + $problem_output = array(); + foreach ( $problems as $table => $problem ) + $problem_output[] = "$table: $problem"; + echo ''; + } else { + _e("

Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users.

define('WP_ALLOW_REPAIR', true);"); + } +} else { + if ( isset($_GET['referrer']) && 'is_blog_installed' == $_GET['referrer'] ) + _e('One or more database tables is unavailable. To allow WordPress to attempt to repair these tables, press the "Repair Database" button. Repairing can take awhile, so please be patient.'); + else + _e('WordPress can automatically look for some common database problems and repair them. Repairing can take awhile, so please be patient.') +?> +

+ + + \ No newline at end of file diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 9bf745248..372ee8cab 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -1771,7 +1771,31 @@ function is_blog_installed() { $installed = !empty( $installed ); wp_cache_set( 'is_blog_installed', $installed ); - return $installed; + if ( $installed ) + return true; + + $suppress = $wpdb->suppress_errors(); + $tables = $wpdb->get_col('SHOW TABLES'); + $wpdb->suppress_errors( $suppress ); + + // Loop over the WP tables. If none exist, then scratch install is allowed. + // If one or more exist, suggest table repair since we got here because the options + // table could not be accessed. + foreach ($wpdb->tables as $table) { + // If one of the WP tables exist, then we are in an insane state. + if ( in_array($wpdb->prefix . $table, $tables) ) { + // If visiting repair.php, return true and let it take over. + if ( defined('WP_REPAIRING') ) + return true; + // Die with a DB error. + $wpdb->error = __('One or more database tables are unavailable. The database may need to be repaired.'); + dead_db(); + } + } + + wp_cache_set( 'is_blog_installed', false ); + + return false; } /** diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php index b35bbee69..9527ee446 100644 --- a/wp-includes/wp-db.php +++ b/wp-includes/wp-db.php @@ -254,6 +254,16 @@ class wpdb { var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 'postmeta', 'terms', 'term_taxonomy', 'term_relationships'); + /** + * List of deprecated WordPress tables + * + * @since 2.9.0 + * @access private + * @var array + */ + var $old_tables = array('categories', 'post2cat', 'link2cat'); + + /** * Format specifiers for DB columns. Columns not listed here default to %s. Initialized in wp-settings.php. *