Installation von CONTENIDO 4.10 unter MySQL mit striktem SQL-Modus

Einleitung

Neuere Versionen von MySQL werden immer strikter, seit MySQL 5.6 ist z. B. der strikte SQL-Modus (STRICT_TRANS_TABLES) standardmäßig aktiviert. Viele Hoster stellen auf neue Versionen von MySQL Datenbanken um, was dazu führen kann, dass manche Web-Anwendungen damit Probleme bekommen.

Das CONTENIDO CMS ist in der aktuellen Version 4.10.1 noch nicht in der Lage, mit einer MySQL-Datenbank zu arbeiten, die bestimmte SQL-Modi hat. Dazu gehören, soweit bisher bekannt, folgende Modi:

  • ONLY_FULL_GROUP_BY
  • STRICT_TRANS_TABLES
  • STRICT_ALL_TABLES
  • NO_ZERO_IN_DATE
  • NO_ZERO_DATE

Seitens CONTENIDO gibt es einige Tickets, die dieses Thema behandeln. Da die Änderungen weitgreifend sind und auch die Zahl der aktiven Entwickler sehr gering ist, wird sich die Bearbeitung der Tickets noch etwas in die Länge ziehen.

Nun vermehren sich die Fälle, in denen CONTENIDO Benutzer Probleme bei der Installation oder Aktualisierung ihrer CONTENIDO Webseiten bekommen.

Für alle, die ganz dringend eine Lösung für das Problem benötigen und keine Zeit für die Abarbeitung des Tickets haben oder gar auf die neue CONTENIDO Version warten wollen, gibt es hier eine Anleitung, mit der man das mit ein paar Anpassungen lösen kann.

Die in dieser Anleitung beschriebenen Schritte sorgen dafür, dass beim Erstellen einer Datenbankverbindung der SQL-Modus entsprechend gesetzt wird, so dass die in CONTENIDO generierten SQL-Anweisungen keine Fehler erzeugen.


Änderungen vor dem Ausführen des Setups

Damit das CONTENIDO Setup auch mit einer strikten MySQL-Datenbank funktioniert, müssen vor dem Ausführen des Setups einige Anpassungen vorgenommen werden.

1. Öffnet die Datei "setup/lib/startup.php" und ändert die Konfiguration der Datenbank in wie folgt:

$cfg['db'] = array(
    'connection' => array(
        'host' => (isset($_SESSION['dbhost'])) ? $_SESSION['dbhost'] : '',
        'database' => (isset($_SESSION['dbname'])) ? $_SESSION['dbname'] : '',
        'user' => (isset($_SESSION['dbuser'])) ? $_SESSION['dbuser'] : '',
        'password' => (isset($_SESSION['dbpass'])) ? $_SESSION['dbpass'] : '',
        'charset' => (isset($_SESSION['dbcharset'])) ? $_SESSION['dbcharset'] : ''
        'options' => array(
            MYSQLI_INIT_COMMAND => "SET SESSION sql_mode='';"
        ),
    ),
    'haltBehavior' => 'report',
    'haltMsgPrefix' => (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] . ' ' : '',
    'enableProfiling' => false,
);

2. Öffnet die Datei "contenido/classes/class.systemtest.php" und ändert die Funktion testMySQLModeStrict() in wie folgt:

public function testMySQLModeStrict($host, $username, $password) {
    // host, user and password
    $dbCfg = array(
        'connection' => array(
            'host' => $host,
            'user' => $username,
            'password' => $password
            'options' => array(
                MYSQLI_INIT_COMMAND => "SET SESSION sql_mode='';"
            ),
        ),
    );

    $db = new cDb($dbCfg);
    $db->query('SELECT LOWER(@@SESSION.sql_mode) AS sql_mode');
    if ($db->nextRecord()) {
        if (cString::findFirstPos($db->f('sql_mode'), 'strict_trans_tables') !== false || 
            cString::findFirstPos($db->f('sql_mode'), 'strict_all_tables') !== false) {
            return false;
        }
    }
    return true;
}

Danach wird das Setup und die Prüfung des SQL-Modus im Systemtest beim Erstellen der Datenbankverbindung den SQL-Modus wie gewünscht setzen und die Prüfung des SQL-Modus im Systemtest wird grünes Licht dafür geben.


Änderungen nach dem Ausführen des Setups

Ist das Setup erfolgreich durchgelaufen, muss man noch eine weitere Anpassung machen, bevor man das CONTENIDO Backend oder das Frontend aufruft.

1. Erstellt nach dem Setup, falls nicht vorhanden, eine Konfigurationsdatei "data/config/{ENVIRONMENT}/config.local.php" und schreibt folgendes rein:

<?php
$cfg['db']['connection']['options'] = [
    MYSQLI_INIT_COMMAND => "SET SESSION sql_mode='';"
];

Diese Anpassung sorgt dafür, dass das CONTENIDO Backend und Frontend auch nach dem Setup mit der MySQL-Datenbank funktioniert, da die Einstellung in der config.local.php dafür sorgt, dass der SQL-Modus beim Erstellen der Datenbankverbindung gesetzt wird.