Joomla 5.4 / EasyBlog 6.0.18: „Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()“

Nach einem Joomla-Update ließen sich auf einer meiner Webseiten einzelne EasyBlog-Beiträge nicht mehr öffnen. Statt des Artikels erschien:

Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()

Die EasyBlog-Übersichten und die auf der Startseite eingebundenen „Latest Blogs“-Module funktionierten weiterhin. Erst beim Aufruf eines einzelnen Blogbeitrags trat der Fehler auf.

Hier dokumentiere ich Ursache und Lösung, weil sich der eigentliche Fehler erst nach einem Vergleich der installierten EasyBlog-Dateien mit dem offiziellen Installationspaket zeigte.

System

Zum Zeitpunkt des Fehlers:

EasyBlog selbst zeigte im Backend korrekt die Version 6.0.18 an.

Die Fehlermeldung

Die Meldung

Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()

deutet zunächst auf alten Datenbankcode hin.

In verschiedenen EasyBlog-Dateien fanden sich noch Aufrufe wie:

$db->nameQuote(...)

Beim normalen Joomla-Datenbanktreiber steht diese alte Methode unter Joomla 5.4 nicht mehr zur Verfügung. Die aktuelle Methode heißt:

$db->quoteName(...)

Ein globales Suchen und Ersetzen von nameQuote() durch quoteName() ist trotzdem keine gute Lösung, weil EasyBlog teilweise eine eigene Datenbank-Kompatibilitätsschicht verwendet.

Entscheidend ist also auch, welches Datenbankobjekt an der jeweiligen Stelle verwendet wird.

Auffälliger Code

Bei der Fehlersuche fanden sich beispielsweise Konstruktionen wie:

$db = $this->getDBO();

$query = 'SELECT ... ' . $db->nameQuote(...);

$this->getDBO() liefert hier den normalen Joomla-Datenbanktreiber.

Andere EasyBlog-Bereiche verwenden dagegen:

$db = EB::db();

EasyBlog besitzt dafür eine eigene Kompatibilitätsschicht.

Damit stellte sich die Frage, warum in einer Installation, die bereits als EasyBlog 6.0.18 ausgewiesen wurde, unterschiedliche Code-Stände vorhanden waren.

Der entscheidende Test: Vergleich mit dem offiziellen EasyBlog-Paket

Ich hatte das originale Installationspaket von EasyBlog 6.0.18 noch vorliegen.

Daraufhin wurden die installierten Dateien per SHA256 mit den entsprechenden Dateien aus diesem offiziellen Paket verglichen.

Dabei zeigten sich sechs Abweichungen im Verzeichnis:

administrator/components/com_easyblog/tables/

Betroffen waren:

oauth.php
meta.php
feedburner.php
tag.php
adsense.php
teamblog.php

Andere Dateien aus demselben Verzeichnis entsprachen dagegen exakt dem offiziellen 6.0.18-Paket.

Damit war die eigentliche Ursache gefunden:

Die Installation meldete zwar EasyBlog 6.0.18, der Dateibestand entsprach aber nicht vollständig dem offiziellen EasyBlog-6.0.18-Paket.

Es handelte sich also nicht einfach um eine generelle Inkompatibilität von EasyBlog 6.0.18 mit Joomla 5.4, sondern um einen gemischten bzw. unvollständig aktualisierten Dateibestand.

Die Lösung

Zunächst wurden die vorhandenen sechs Dateien gesichert.

Beispielsweise:

mkdir -p /root/easyblog-backup

cp -a \
administrator/components/com_easyblog/tables/oauth.php \
administrator/components/com_easyblog/tables/meta.php \
administrator/components/com_easyblog/tables/feedburner.php \
administrator/components/com_easyblog/tables/tag.php \
administrator/components/com_easyblog/tables/adsense.php \
administrator/components/com_easyblog/tables/teamblog.php \
/root/easyblog-backup/

Anschließend wurden genau diese sechs Dateien durch die entsprechenden Originaldateien aus dem offiziellen EasyBlog-6.0.18-Paket ersetzt.

Danach wurden die neuen Live-Dateien erneut per SHA256 gegen das Originalpaket geprüft.

Alle sechs Dateien ergaben:

OK

Zusätzlich wurde jede Datei mit PHP auf Syntaxfehler geprüft:

/opt/plesk/php/8.2/bin/php -l DATEI.php

Bei allen sechs Dateien lautete das Ergebnis:

No syntax errors detected

Ergebnis

Unmittelbar nach dem Austausch ließen sich die EasyBlog-Beiträge wieder normal öffnen.

Der Fehler

Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()

war verschwunden.

Auch sämtliche auf der Startseite über das EasyBlog-LatestBlogs-Modul verlinkten Beiträge funktionierten wieder.

An der Datenbank musste für die eigentliche Reparatur nichts verändert werden.

Was während der Diagnose nicht geholfen hat

Vor der eigentlichen Ursache wurden unter anderem folgende Möglichkeiten untersucht:

Diese Schritte halfen bei der Eingrenzung, behoben das Problem aber nicht dauerhaft.

Nebenbefund: EasyBlog-Routing

Während der Fehlersuche fiel auf, dass EasyBlog für dieselbe Kategorie mehrere technische Menüeinträge zur Verfügung hatte.

Dadurch wurden je nach aktiviertem Menüpunkt URLs wie

/easyblog-aktuelles-template/artikelname

oder

/mzffm-aktuelles/artikelname

erzeugt.

Das war jedoch nicht die Ursache des nameQuote()-Fehlers. Das Ändern des Menüeintrags änderte lediglich die URL, während der PHP-Fehler bestehen blieb.

Warum ich nicht einfach nameQuote() global ersetzt habe

Ein pauschales

nameQuote() → quoteName()

über die gesamte EasyBlog-Installation hätte zwar einzelne Fehlerstellen beseitigen können, aber nicht die eigentliche Ursache gelöst.

Da EasyBlog teilweise eigene Datenbank-Wrapper verwendet, kann derselbe Methodenaufruf je nach Kontext unterschiedlich problematisch sein.

Der zuverlässigere Ansatz war:

  1. installierte EasyBlog-Version feststellen,
  2. originales Installationspaket derselben Version heranziehen,
  3. Dateien vergleichen,
  4. abweichende Dateien sichern,
  5. diese durch die offiziellen Originaldateien ersetzen,
  6. Prüfsummen und PHP-Syntax kontrollieren.

Empfehlung bei ähnlichen Fehlern

Wenn unter Joomla 5.4 mit EasyBlog die Meldung

Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()

erscheint, würde ich nicht zuerst massenhaft PHP-Code ändern.

Stattdessen sollte geprüft werden, ob der tatsächliche Dateibestand wirklich vollständig der angezeigten EasyBlog-Version entspricht.

Eine Versionsnummer in der Joomla-Erweiterungsverwaltung garantiert offenbar nicht zwangsläufig, dass jede einzelne Datei tatsächlich aus diesem Versionsstand stammt.

Kurzfassung

Fehler

Call to undefined method Joomla\Database\Mysqli\MysqliDriver::nameQuote()

Umgebung

Joomla 5.4.8
EasyBlog 6.0.18
PHP 8.2

Ursache

EasyBlog meldete Version 6.0.18, mehrere installierte PHP-Dateien wichen jedoch vom offiziellen EasyBlog-6.0.18-Paket ab.

Lösung

Die abweichenden Dateien wurden identifiziert, gesichert und durch die entsprechenden Originaldateien aus dem offiziellen EasyBlog-6.0.18-Paket ersetzt.

Ergebnis

Die EasyBlog-Beiträge funktionieren wieder und der nameQuote()-Fehler ist verschwunden.


Hinweis: Die EasyBlog-Originaldateien stelle ich bewusst nicht zum Download bereit. EasyBlog ist kommerzielle Software. Für diese Reparatur wird ein legitimes Installationspaket der jeweils verwendeten Version benötigt.