Die Fehlerseite die WordPress anzeigt, wenn keine Verbindung mit der Datenbank besteht, ist ziemlich hässlich. Und nicht nur das: Je nach Einsatzgebiet der Software kann es auch unprofessionell aussehen, wenn der Besucher eine Seite mit für ihn verwirrenden Erklärungen und WordPress-Logo vorgesetzt bekommt.
Leider bietet WordPress derzeit keine offizielle Möglichkeit, die Seite mit einem Template individuell zu gestalten. Auch die Nutzung eines Plugins fällt weg, da für die Plugin-Abfrage die Datenbankverbindung benötigt wird. Mit einem kleinen Hack kommt man aber doch zur eigenen Fehlerseite, inklusive einer Benachrichtigung per eMail an den Administrator.
Schritt 1: Funktion einbauen (Hack)
Öffne die Datei wp-db.php im Ordner wp-includes und suche die Funktion bail (bei WordPress Version 2.1.3 beginnt diese ab Zeile 357). Diese Funktion wird bei einem Problem mit der Datenbankverbindung aufgerufen und sorgt dafür, dass die Standard WordPress-Fehlerseite angezeigt wird. Um WordPress nun beizubringen, eine spezielle Fehlerseite anzuzeigen, muss direkt nach der Zeile
function bail($message) { // Just wraps errors in a nice header and footer
der folgende Code eingesetzt werden:
/* custom error page
shows a custom error page and emails error message */
include('wp-content/themes/default/db-error.php');
mail('info@test.com', 'Wordpress Datenbank-Fehler',
html_entity_decode(strip_tags($message)));
die;
/* end custom error page */
Das Ergebnis sieht dann so aus:
Der Code im Einzelnen:
include('wp-content/themes/default/db-error.php');
Bindet die individuell gestaltete Fehlerseite ein. Natürlich muss der Dateipfad an das benutzte Theme angepasst werden.
mail('info@test.com', WordPress Datenbank-Fehler', html_entity_decode(strip_tags($error)));
Die Fehlermeldung (bzw. der WordPress-eigene Text) wird per eMail an den Administrator geschickt. Hier muss die eMailadresse entsprechend angepasst werden. Wer auf die eMail-Benachrichtigung verzichten will, kann diese Zeile auch ganz einfach löschen.
die;
die;
beendet die weitere Ausführung von Code und verhindert damit die Ausgabe der Standard-Fehlermeldung.
Die Alternative
Für alle, die auf Nummer sicher gehen und die Originaldatei nicht verändern wollen, gibt es auch eine Alternativmöglichkeit. Dazu muss die Datei wp-db.php ins Verzeichnis wp-content kopiert und in db.php umbenannt werden. Danach wird der Hack in die db.php eingefügt. WordPress prüft nämlich ständig, ob im Verzeichnis wp-content eine Datei namens db.php existiert und zieht diese der „originalen“ wp-db.php vor. Da die db.php bei einem Update von WordPress nicht überschrieben wird, funktioniert die individuelle Datenbank-Fehlerseite weiterhin. Allerdings können so auch Probleme entstehen: Wird nämlich im Rahmen des WordPress Updates die Datei wp-db.php aktualisiert, nutzt man durch die vorhandene db.php weiterhin den „alten“ Code.
Schritt 2: Individuelle Fehlerseite erstellen
Erstelle eine neue Datei namens db-error.php und speichere die Datei im Theme-Ordner von WordPress (der Pfad und der Name der Datei muss mit dem Pfad aus Schritt 1 übereinstimmen). Nun steht der Gestaltung der eigenen Fehlerseite eigentlich nichts mehr im Wege. Wichtig ist allerdings, dass kein WordPress-Code benutzt wird, denn ohne Datenbankverbindung funktionieren nur die wenigsten Template-Tags.
Um die neue Fehlerseite im Look des aktuell benutzten WordPress-Themes zu gestalten, ist es wohl am einfachsten, den Quelltext einer Seite des eigenen Blogs (z.B. die Einzelansicht eines Posts) in die Datei db-error.php zu kopieren und ungewünschten Code zu entfernen bzw. die individuelle Fehlermeldung einzufügen.
Schritt 3: Der grosse Test
Zum Testen des Hacks muss die Verbindung zur Datenbank kurz unterbrochen werden. Dazu wird in der Datei wp-config.php im Root-Verzeichnis von WordPress der Name der Datenbank temporär geändert. Damit wird WordPress der Zugriff auf die Datenbank verunmöglicht, so dass das Blog nun die neue Fehlerseite anzeigt und ein eMail an den Administrator verschickt. Aber nur nicht vergessen, den Namen der Datenbank in wp-config.php wieder auf den Originalnamen zu ändern 😉
Die Dateien zum Download
Wer es einfacher haben will, kann eine angepasste wp-db.php (WordPress Version 2.1.3) sowie eine auf dem Kubrick-Standardtheme aufbauende Musterdatei von db-error.php hier als ZIP-Datei downloaden:
Und noch dies…
Der Hack zur eigenen Datenbank-Fehlerseite funktioniert mit WordPress Version 1.5.1.3 und höher. Bei einem Update auf eine neuere WordPress-Version muss der Hack allerdings erneut in die wp-db.php eingefügt werden, da die Datei bei ziemlich jedem Update durch eine neuere Version ersetzt wird.
Zu hoffen bleibt, dass WordPress in einer späteren Version standardmässig das Einbinden eines individuellen Datenbankfehler-Templates unterstützt. Erste Wünsche (mit einem ähnlichen Code und ohne eMailbenachrichtigung) wurden bereits ans WordPress-Team herangetragen. Schwierig zu realisieren wäre das ja nicht, wie dieser Hack zeigt. Die Credits dafür gehören jedoch Melvin Rivera, von dessen Post über den Hack ich mich zu grossen Teilen inspirieren liess.
[Update] 01.01.2008
Seit der Version 2.3.2 beherrscht WordPress die Einbindung einer eigenen Datenbank-Fehlerseite auch selbst, so dass obiger Hack nicht mehr notwendig ist. Weitere Informationen dazu in meinem Beitrag „Eigene Fehlerseite bei Datenbank-Problemen„.
wow…du bist ja richtig gut!
vielleicht hast du ev. sogar ne lösung für mein problem hier:
http://www.sinnliches.ch/erotica
“
WordPress Datenbank-Fehler: [Can’t find file: ‚wp_comments.MYI‘ (errno: 2)]
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = ‚0‘
WordPress Datenbank-Fehler: [Can’t find file: ‚wp_comments.MYI‘ (errno: 2)]
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_approved = ’spam‘
“
Ich weiss nicht mehr was tun, bzw hab schon alles getan was man tun kann, irgendwas stimmt da nicht!
@bluetime: Hoppla, wusste ja gar nicht, dass Du Dich mit solch erotischen Sachen befasst 😉
Die Lösung Deines Problems ist wahrscheinlich ganz einfach: Mit grosser Wahrscheinlichkeit ist die die Tabelle wp_comments in der entsprechenden Datenbank defekt. Um dies zu reparieren, muss in phpmyAdmin (oder wie die mySQL-DB-Administration bei Dir auch immer heisst) die Tabelle wp_comments markiert und dann „Repair table“ durchgeführt werden. Danach sollte es wieder funktionieren…
lach tom, diese seite gibts seits bluetime gibt!
danke für den tipp…ich versuchs grad mal
ääähm tom…ich hab gerade deine email gesucht und nirgends gefunden:-)
dürft ich die haben um dich was zu fragen?
Sie steht im Impressum. Inkl. Kontaktformular.
kennt sich meister tom auch mit serendipity aus ??
@bluetime: Unterdessen hast Du die eMail ja 😉
@STiGMaTa_ch: Danke für die Hilfe. Schön wenn sich die Leser untereinander helfen, wenn ich mal grad nicht online bin 😉
@BigBo: Oupps, nein nicht wirklich…
Habe dasselbe Problem mit meiner WordPress Datenbank, nur lässt sich in meinem PhpMyAdmin die Tabelle nicht reparieren, da sie als „in Benutzung“ – „in use“ gekennzeichnet wird.
Beim Versuch die Tabelle zu reparieren meldet PhpMyAdmin
error: Can’t find file: ‚wp_comments.MYI‘ (errno: 2)
Wer konnte dies schon lösen?
blogging tom kann das:-))
deutet darauf hin, dass der mySQL-Server die entsprechende Datei nicht finden kann. Wenn eine Reparatur nicht funktioniert (bzw. nicht nutzt), dann gibts eigentlich nur noch zwei Möglichkeiten:
1. hoffen, dass man (oder der Hoster) ein Backup der Tabelle wp_comments hat und diese entsprechend einspielt, oder
2. die Tabelle wp_comments löschen und eine neue, leere wp_comments erstellen (gemäss Datenbankschema von WordPress). Das hat allerdings den schweren Nachteil, dass alle bisherigen Kommentare verloren sind.
@bluetime: Danke für die Blumen 🙂
bitte tom…immerhin haste meinen blog geflickt:-)
und den kuss dafür auch nicht abgeholt…tsts
Es hat sich gelöst 🙂
Da war heute nacht ein Unterbruch, der wohl zur gleichen Zeit stattgefunden hat, wie eine Spamattacke. Supportanruf und Schwupp ein wenig später back-up und alles behoben.
Danke für die Antworten 🙂
Moinmoin,
ich hab ein ähnliches – aber auch anders gelagertes Problem:
Wie kann ich die Fehlermeldung bei den Eingaben für einen Kommentar abfangen, ohne die functions.php anzurühren.
Ich komm zwar mit WordPress ganz gut klar, bin aber nicht der PHP-Freak…
Einen guten Rutsch
wünscht
Frank
Du kannst doch eine 404.php erstellen und diese dann automatisch anspringen lassen, wenn eine Datei nicht exisiert, Dazu muss Du Dich nur mit mod_rewrite Apache Modul beschäftigen. Dort gibt es ein Flag, das misst ob eine Datei nicht da ist, und dann springt es wohin Du willst.