WordPress-Datenbank-Fehler: Table ‚blc_instances‘ doesn’t exist


Datenbank Bild

Das ERROR-Log des Webhosting-Anbieters meldet einen WordPress-Datenbank-Fehler bei einer SQL-Abfrage auf der blc_instances-Tabelle:

WordPress-Datenbank-Fehler Table 'dbXXXXXXXX-wordpress.my_blog__blc_instances' doesn't exist f\xc3\xbcr Abfrage SELECT instance_id FROM `my_blog__blc_instances` WHERE container_id = 2016 AND container_type = 'post' von do_action_ref_array('wp_scheduled_auto_draft_delete'), WP_Hook->do_action, WP_Hook->apply_filters, wp_delete_auto_drafts, wp_delete_post, do_action('delete_post'), WP_Hook->do_action, WP_Hook->apply_filters, blcPostTypeOverlord->post_deleted

Der Übeltäter ist das Plugin Broken Link Checker. Seit dem Update auf die Version 1.11.8 am 21. März 2019 tritt dieser Fehler auf. Schuld daran ist die Änderung der post_deleted()-Funktion in der blcPostTypeOverlord-Klasse in der Datei /www/wp-content/plugins/broken-link-checker/includes/any-post.php [Zeile 119]. Diese Funktion wurde komplett überarbeitet und zwar fehlerhaft.

Anzeige

In den Zeilen 138, 152 und 159 der post_deleted()-Funktion wurden die SQL-Abfragen falsch implementiert.

function post_deleted($post_id){
	global $wpdb;

	$post_id = intval( $post_id );
	//Get the container type matching the type of the deleted post
	$post = get_post( $post_id );
	if ( !$post ){
		return;
	}
	//Get the associated container object
	$post_type = get_post_type( $post );
	$post_container = blcContainerHelper::get_container( array( $post_type, $post_id ) );
		
	if ( $post_container ){
		//Delete the container
		$post_container->delete();

		// Firstly: See if we have any current instances
		$q_current_instance_ids = $wpdb->prepare( 
			'SELECT instance_id FROM `'.$wpdb->prefix.'_blc_instances` WHERE container_id = %d AND container_type = %s', 
			$post_id,
			$post_type );

		$current_instance_ids_results = $wpdb->get_results( $q_current_instance_ids, ARRAY_A );

		if( $wpdb->num_rows == 0 ) {
			// No current instances present, skip cleanup at once
			return;
		}

		$current_instance_ids = wp_list_pluck( $current_instance_ids_results, 'instance_id' );

		// Secondly: Get all link_ids used in our current instances
		$q_current_link_ids = 'SELECT DISTINCT link_id FROM `'.$wpdb->prefix.'_blc_instances` WHERE instance_id IN (\''.implode("', '", $current_instance_ids).'\')';

		$q_current_link_ids_results = $wpdb->get_results( $q_current_link_ids, ARRAY_A );

		$current_link_ids = wp_list_pluck( $q_current_link_ids_results, 'link_id' );

		// Go ahead and remove blc_instances for this container, blc_cleanup_links( $current_link_ids ) will find and remove any dangling links in the blc_links table
		$wpdb->query( 'DELETE FROM `'.$wpdb->prefix.'_blc_instances` WHERE instance_id IN (\''.implode("', '", $current_instance_ids).'\')' );

		//Clean up any dangling links
		blc_cleanup_links( $current_link_ids );
	}
}

Der Tabellenname wird definiert als

$wpdb->prefix.'_blc_instances`

Das Tabellen-Präfix in meinem Fall lautet my_blog_ und wird vor den eigentlichen Tabellennamen _blc_instances gesetzt. Zusammengefügt ergibt es my_blog__blc_instances, mit zwei Unterstrichen dazwischen. Diese Tabelle gibt es natürlich nicht in der WordPress-Datenbank. Es sind übrigens die einzigen drei Stellen im Quellcode, die den Tabellennamen auf diese Weise definieren.

Das Löschen des vorangestellten Unterstrichs aus dem _blc_instances-String beseitigt den Fehler.

...FROM `'.$wpdb->prefix.'blc_instances` WHERE...

Siehe auch:

Extra underscore in SELECT statement

Wrong table name _blc_instances


Anzeige

 

War dieser Beitrag für dich informativ? Hat er dir gefallen oder geholfen?

Dann unterstütze die Weiterentwicklung dieser Webseite mit einer kleinen Spende!

Die Spenden werden für die Lizenzen sowie neue Hard- und Software verwendet, die für weitere Projekte auf dieser Webseite eingesetzt werden. Die Werbung alleine deckt gerade mal die Server Kosten.




Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.