Seite 1 von 1

Server Poblem strict_mode

Verfasst: Mo 22. Okt 2018, 14:08
von tagkalle
Hallo hat Jemand Erfahrung mit one.com?
Die haben kürzlich Ihre datenbank umgestellt, danach kamen die Problem.
Kann keine Voerlagen, Layout usw. mehr erstellen bzw ändern.

Als Antwort kam vom Support:
Unsere Datenbank läuft unter strict_mode und aufgrund des Shared Server Setups. Ihr CMS ist leider auch nicht auf dem neusten Stand. Das letzte Update hat vor 2 Jahren stattgefunden. Sie haben php7 eingestellt und es ist nur die letzte Contenido Version die noch mit php 7 supported war. Mein Vorschlag daher. Versuchen Sie sich einmal mit Contendio in Verbindung zu setzen und ändern Sie auf die neueste Version, bzw. bringen Sie in Erfahrung ob Contanido plant strict_mode zu unterstützen, da strict_mode standartmäßig aktiviert ist auf neueren MYSQL Versionen.
Was kann ich tun?
Danke

Re: Server Poblem strict_mode

Verfasst: Mo 22. Okt 2018, 14:45
von xmurrix
Hallo tagkalle,

der SQL-Modus einer MySQL-Datenbank lässt sich auch beim Erstellen einer Verbindung setzen, hier ein Beispiel mit CONTENIDO 4.8:
viewtopic.php?f=108&t=33065&p=158204&hi ... de#p158237

In CONTENIDO 4.9 kannst du das in contenido/classes/db/class.db.driver.mysqli.php setzen, in der Funktion connect() nach Aufbau der Verbindung, ca. in Zeile 135 mit folgendem Code:

Code: Alles auswählen

        // Das geht nicht, siehe Nachtrag und Nachtrag 2 im Beitrag!!!
        $this->query("SET GLOBAL sql_mode='MYSQL40'");
Besser wäre es natürlich, dies in der Datenbankkonfiguration zu setzen.

Mir ist in Bezug auf Umstellung der CONTENIDO Datenbank und der Sourcen auf den Strict-Modus nicht bekannt, dies würde vermutlich einiges an Änderungen mit sich ziehen, die nicht abwärtskompatibel sind.

Nachtrag:
An der Stelle kann man noch nicht mit $this->query() arbeiten, weil die Verbindungskennung noch nicht im Handler-Objekt gesetzt ist. Die Verbindungskennung ist aber in der Funktion connect() vorhanden. Man kann also nach der Prüfung der Verbindung den SQL-Modus setzen, also in Zeile 135 oder am Ende der Funktion connect(), noch vor der Zeile "return $dbHandler;" mit folgendem Code:

Code: Alles auswählen

mysqli_query($dbHandler, "SET SESSION sql_mode='MYSQL40'");
Nachtrag 2:
Eine viel sauberere Möglichkeit zum Setzen des SQL-Modus ist der Weg über die Konfiguration. Das kann man z. B. In der Konfiguration "data/config/{ENVIRONMENT}/config.php" im Bereich der Datenbank-Konfiguration wie folgt setzen:

Code: Alles auswählen

$cfg['db'] = array(
    'connection' => array(
        ...
        'options' => array(
            MYSQLI_INIT_COMMAND => "SET SESSION sql_mode='MYSQL40';"
        ),
        ...
    ),
);
Nachtrag 3:
Die Änderung in der Konfiguration "data/config/{ENVIRONMENT}/config.php" wird be einem CONTENIDO-Update überschrieben. Daher ist es besser, wenn man diese Konfiguration in der "config.local.php" setzt. Falls nicht vorhanden, eine Konfigurationsdatei "data/config/{ENVIRONMENT}/config.local.php" erstellen und folgendes reinschreiben:

Code: Alles auswählen

$cfg['db']['connection']['options'] = [
    MYSQLI_INIT_COMMAND => "SET SESSION sql_mode='';"
];
Gruß
xmurrix

Re: Server Poblem strict_mode

Verfasst: Mo 22. Okt 2018, 15:07
von tagkalle
Danke für die schnelle Antwort.
Ich werde es gleich mal ausprobieren.
Zur Interesse:
Datenbank: 5.5.5-10.3.9-MariaDB-1:10.3.9+maria~bionic
bei den Anderen: 5.5.5-10.1.30-MariaDB-1~xenial

Re: Server Poblem strict_mode

Verfasst: Do 25. Okt 2018, 15:05
von tagkalle
Hallo Murrix,
istallieren konnte ich es.
Datenbank ist auch gefüllt.
Kannnur leider keine Layouts, Module und Vorlagen erstellen bzw bearbeiten.
Sowie Artikel und Kategorien
Dateiupload auch nicht da sind aber die Bilder im Ordner, werden nur nicht angezeigt.
????

In der errolog steht:
[2018-10-25 14:03:12] Warning: "Database failure: 1364 (Field 'user_id' doesn't have a default value) - /contenido/main.php?area=mod_edit&frame=4&action=mod_new&contenido=qr2k3bqa9si2rnhckcstokqku0ktq8gv INSERT INTO `con_actionlog` (`idlog`) VALUES ('')
" at reportHalt() [class.db.driver.handler.php(1005)]
reportHalt() called in file class.db.driver.handler.php(977)
halt() called in file class.db.driver.handler.php(700)
query() called in file class.item.collection.php(1103)
createNewItem() called in file class.action.log.php(57)
create() called in file class.backend.php(282)
log() called in file main.php(182)

[25-Oct-2018 14:03:12 UTC] PHP Warning: Database failure: 1364 (Field 'user_id' doesn't have a default value) - /contenido/main.php?area=mod_edit&frame=4&action=mod_new&contenido=qr2k3bqa9si2rnhckcstokqku0ktq8gv INSERT INTO `con_actionlog` (`idlog`) VALUES ('')
in /...../httpd.www/contenido/includes/functions.general.php on line 1428
[2018-10-25 14:03:12] Warning: "Database failure: 1364 (Field 'name' doesn't have a default value) - /contenido/main.php?area=mod_edit&frame=4&action=mod_new&contenido=qr2k3bqa9si2rnhckcstokqku0ktq8gv INSERT INTO `con_mod` (`idmod`) VALUES ('')
" at reportHalt() [class.db.driver.handler.php(1005)]
reportHalt() called in file class.db.driver.handler.php(977)
halt() called in file class.db.driver.handler.php(700)
query() called in file class.item.collection.php(1103)
createNewItem() called in file class.module.php(76)
create() called in file include.mod_edit_form.php(116)
include_once() called in file main.php(202)

[25-Oct-2018 14:03:12 UTC] PHP Warning: Database failure: 1364 (Field 'name' doesn't have a default value) - /contenido/main.php?area=mod_edit&frame=4&action=mod_new&contenido=qr2k3bqa9si2rnhckcstokqku0ktq8gv INSERT INTO `con_mod` (`idmod`) VALUES ('')
in /....../httpd.www/contenido/includes/functions.general.php on line 1428
[25-Oct-2018 14:03:12 UTC] PHP Warning: mkdir(): No such file or directory in /...../httpd.www/contenido/classes/module/class.module.handler.php on line 859

Re: Server Poblem strict_mode

Verfasst: Do 25. Okt 2018, 17:36
von xmurrix
Hallo tagkalle,

es kann sein, dass du den SQL-Modus nichtg global setzen kannst, dann versuche in der in der contenido/classes/db/class.db.driver.mysqli.php anstatt

Code: Alles auswählen

    $this->query("SET GLOBAL sql_mode='MYSQL40'");
folgendes

Code: Alles auswählen

    $this->query("SET SESSION sql_mode='MYSQL40'");
Prüfen kannst du das z. B. in einer Modulausgabe folgendermaßen:

Code: Alles auswählen

$db = new cDB();
$db->query('SELECT @@GLOBAL.sql_mode');
$db->nextRecord();
echo '<pre>GLOBAL.sql_mode: ' . $db->f('@@GLOBAL.sql_mode') . '</pre>';
$db->query('SELECT @@SESSION.sql_mode');
$db->nextRecord();
echo '<pre>SESSION.sql_mode: ' . $db->f('@@SESSION.sql_mode') . '</pre>';

Vielleicht lässt sich der SQL-Mode überhaupt nicht setzen, dann wäre es zu überlegen, ob man die Struktur der Datenbanktabellen und den Sourcecode des CMS anpasst oder den Provider wechselt.

Die Fehler aus dem Auszug der errorlog kommen vermutlich aus dem SQL-Modus "STRICT_TRANS_TABLES", ist diese Option aktiviert, müssen beim Anlegen von Datensätzen immer Werte aller Felder angegeben werden.

Gruß
xmurrix

Re: Server Poblem strict_mode

Verfasst: Do 13. Dez 2018, 16:11
von Faar
xmurrix hat geschrieben:
Do 25. Okt 2018, 17:36

Code: Alles auswählen

    $this->query("SET SESSION sql_mode='MYSQL40'");
"As of MySQL 5.7.22, MYSQL40 is deprecated. It will be removed in a future version of MySQL. "
:(

Re: Server Poblem strict_mode

Verfasst: Do 13. Dez 2018, 23:14
von xmurrix
Faar hat geschrieben:
Do 13. Dez 2018, 16:11
..."As of MySQL 5.7.22, MYSQL40 is deprecated. It will be removed in a future version of MySQL. "
:(...
Da dies erst auf deprecated gesetzt wird, haben wir noch etwas Luft, um den Core des CMS entsprechend darauf anzupassen. Unter MySQL 5.7.x wird man diesen Modus noch weiterhin verwenden können.
Es wird noch etwas dauern, bis die Provider auf MySQL 8.x wechseln.

Gruß
xmurrix

Re: Server Poblem strict_mode

Verfasst: Fr 14. Dez 2018, 20:46
von Faar
Ich habe eine Lösung, die auch bei PHP 7.2.13 und MySQL 5.7.24 funktioniert.
Denn bei mir hatte $this->query("SET SESSION sql_mode='MYSQL40'"); nicht funktioniert.

In der Datei contenido/classes/db/class.db.driver.mysqli.php sucht man nach der Methode/Funktion connect() und am Ende dieser Funktion, kurz vor der schließenden Klammer, wird return $dbHandler; zurückgegeben.
Das befindet sich bei mir in Zeile 148.

Und genau vor diesem return kann man folgendes setzen:

Code: Alles auswählen

if ($dbHandler) { mysqli_query($dbHandler, "SET SESSION sql_mode='MYSQL40'"); }
Das hat den Nachteil, dass es keinem Update stand hält und zudem MYSQL40 als veraltet gilt und bald rausfallen wird aus MySQL.
Daraufhin habe ich in der config.php in /data/production eine Konstante definiert, die dann auch hier in dieser Klasse existiert.
Zudem ist damit sicher, dass die Konstante vor dem Aufruf von connect() definiert wird, weil in der config auch die Datenbank-Zugangsdaten stehen.
Diese Konstante habe ich ganz unten hin gesetzt, wo auch schon die utf-8 Konstante definiert wird.

Code: Alles auswählen

define("SQL_MODE", 'MYSQL40');
Natürlich sollte man das noch mit Kommentar versehen (warum, wieso, weshalb) und am Besten auch noch der eigene Code, der in der DB-Klasse steht.
Und der sieht zusammen mit dem return so aus:

Code: Alles auswählen

        if ($dbHandler && defined('SQL_MODE')) { mysqli_query($dbHandler, "SET SESSION sql_mode='".SQL_MODE."'"); } // comment
        return $dbHandler;
Da beim Update dieser Code vor dem return vermutlich wieder weg sein wird, sollte man den auch als Kommentar zu der Konstantendefinition schreiben, dass man weiß, wofür die Konstante ist und wo man den Code wieder einsetzen muss, nach einem Update.

Man kann dann, wenn es nötig wird, das 'MYSQL40' durch andere sql_mode Anweisungen in der config.php ersetzen.
Um zu wissen, welche Modi gesetzt sind, kann man in phpMyAdmin einfach SHOW benützen, als SQL-Anweisung.

Code: Alles auswählen

SHOW VARIABLES LIKE 'sql_mode';
In meinem Fall war folgendes eingestellt:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Und eben jenes ONLY_FULL_GROUP_BY war das Problem. Vielleicht auch noch andere, aber das weiß ich nicht.
Wer Lust und Laune hat, hier sind die Modi aufgelistet:
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Was 1 freu. :|

P.S. Dank an xmurrix