TYPO3: MySQL Modus zur Gruppierung

Wenn TYPO3 mit nicht standardisierten MySQL Modes betrieben wird, kann es zu schwerwiegenden Fehlern kommen. Ein Fall zur Gruppierung soll näher beleuchtet werden.

Ein Fehler im TYPO3-Backendmodul "Info" (web_info) hat gezeigt, wie wichtig es ist, die Datenbank in den richtigen Modis zu steuern.

Problemstellung

Bei der Auswahl der Unterfunktion "Seitenbaumübersicht", mit ausgewählten Unterebenen, kam es zu einem Fehler, der die gesamte Verwendung des Info-Module behinderte.

SELECT COUNT(`uid`) FROM `pages` WHERE (`pid` = ?) AND (`sys_language_uid` = ?) AND ( 1=1) AND ((`pages`.`deleted` = 0) AND ((`pages`.`t3ver_wsid` = 0) AND (`pages`.`t3ver_oid` = 0))) ORDER BY `sorting` ASC
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Fehlersuche

Benutzereinstellungen

Die Einstellungen für Modulansichten & Co. werden für Backenduser im Datenbankfeld uc als Blob gespeichert. Der Fehler trat nur bei aktiver Auswahl von Unterebenen auf. Also war die Hoffnung, dass ein Zurücksetzen der Einstellungen den Fehler beheben könnte.

Um alle Einstellungen zurückzusetzen muss in den "Benutzereinstellungen" der Knopf "Konfiguration zurücksetzen und temporäre Daten löschen" gedrückt werden.

Damit ließ sich das Info-Modul dann wieder öffnen, jedoch nur bis erneut Unterebenen ausgewählt wurden.

Quellcode analysieren

Das besagte Modul und seine Logik befinden sich in der Datei typo3/sysext/info/Classes/Controller/PageInformationController.php (). Dort wird, wenn eine Unterebene ausgewählt ist, eine Datenbankabfrage erzeugt, die schaut wieviele Unterseiten vorhanden sind. In der Liste der Unterseiten wird dann eine Grafik für die Darstellung im Seitenbaum gezeigt. Mehr ist es nicht.

Der problematische Teil ìst folgende Datenbankabfrage:

$rowCount = $queryBuilder->count('uid')->execute()->fetchColumn(0);

Die Datenbank will die Funktion COUNT ohne fehldende Gruppierung GROUP BY partout nicht ausführen und resultiert im Fehler #1140.

Ein Eingriff in diesen Teil des TYPO3-Codes ist immer schwierig, da am Kern einer Anwendung nie herumgeschraubt werden sollte! Eine Lösung wäre jedoch eine zusätzliche Gruppierung, welche die Datenbank zufrieden stellt:

$rowCount = $queryBuilder->count('uid')->groupBy('sys_language_uid')->execute()->fetchColumn(0);

Mit dieser Anpassung verschwand der Fehler. Aber anscheinend ist das Problem nicht weit verbreitet. Die Filterblase blieb zu dem Problem leer. Also musste der Grund dafür tiefer zu finden sein.

MySQL Mode

Zum eigentlichen Fehler #1140 aus der Datenbank findet man Hinweise auf den MySQL Modus ONLY_FULL_GROUP_BY. Wenn dieser aktiv ist, dann verweigert MySQL mögliche unvollständige Gruppierungsfunktionen (MySQL Dokumentation). Und das ist im TYPO3-Quellcode offensichtlich der Fall!

Die Datenbank verrät mit SHOW VARIABLES LIKE 'SQL_MODE'; welche Modis verwendet werden. In der Liste taucht auch ONLY_FULL_GROUP_BY auf.

Nachdem der Modus deaktiviert wurde, konnte das Info-Modul im TYPO3-Backend auch ohne die Anpassungen im Core aufgerufen werden.