Setup gescheitert wegen mysql strict mode

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Do 30. Jan 2020, 10:46

Hallo miteinander,
ein Setup für ein Update ist gescheitert, weil offenbar der Strict-Mode eingestellt war.
MySQL läuft im 'strict'-Modus
MySQL läuft im 'strict'-Modus. CONTENIDO funktioniert nicht in diesem
Modus. Bitte ändern Sie diese Datenbankeinstellung.
Diese Meldung kam ganz am Schluss und das war's dann mit dem Update von 4.9.12 auf 4.10.1
Ich kam noch nicht dazu, den strict-mode im Setup auszuschalten aber vermutlich liegt dort die pragmatische Lösung, weil es auf dem Server direkt scheints nicht geht (managed Server). Darum kann ich auch noch keine Lösung vorweisen.
Falls jemand bereits eine Lösung hat, bitte hier drunter antworten.

Zudem sollte im Setup die Möglichkeit eingebaut werden, den strict-mode auszuschalten.
Vermutlich müsste das dort geschehen, wo der erste Datenbank-Zugriff statt findet.

Grüße aus dem Regenland,
Faar
Zuletzt geändert von Faar am Mo 3. Feb 2020, 17:43, insgesamt 1-mal geändert.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 13:39

*ping* :?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von xmurrix » Mo 3. Feb 2020, 13:47

Hallo Faar,

falls es sich um ein Update handelt, kann man die vorhandene Konfiguration für die Datenbankverbindung in der "data/config/{ENVIRONMENT}/config.php", wie im folgenden Kommentar unter "Nachtrag 2" angegeben, setzen:
viewtopic.php?f=98&t=43357&p=179261&hil ... de#p179124

Ist es eine Neuinstallation, so kannst du die Konfiguration in der Datei "setup/lib/functions.mysql.php" in der Funktion doMySQLSelectDB() anpassen, bevor mit dieser eine DB-Verbindung hergestellt wird.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 13:50

Hallo Xmurrix,

danke. Ich habe eben im /setup bisher vergeblich die Ausgabe der Fehlermeldung gesucht, um wenigstens eine Spur zu finden.
Wenn die beim Update aber aus dem Core kommt kann ich lange suchen.

Ja, es ist ein Update von 4.9.12 auf 4.10.1
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 14:04

xmurrix hat geschrieben:
Mo 3. Feb 2020, 13:47
falls es sich um ein Update handelt, kann man die vorhandene Konfiguration für die Datenbankverbindung in der "data/config/{ENVIRONMENT}/config.php", wie im folgenden Kommentar unter "Nachtrag 2" angegeben, setzen:
viewtopic.php?f=98&t=43357&p=179261&hil ... de#p179124
Ich habe es so gesetzt und die Fehlermeldung kommt immer noch.
Wo wird denn dieses strict-mode überprüft?
Vielleicht checkt der Check gar nicht, dass auf MySQL40 Modus gesetzt wurde?

Edith:
Der sql_mode ist das:
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 lässt sich derzeit auch mit phpmyadmin nicht ändern.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von xmurrix » Mo 3. Feb 2020, 15:44

Es gibt eine Überprüfung des SQL-Mode, die ist in der "contenido/classes/class.systemtest.php" in der Funktion testMySQLModeStrict().
Vermutlich ist das die Ursache für die erzeugte Fehlermeldung. Das kannst du testweise manuell anpassen, so dass die Funktion true zurückliefert.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 16:02

xmurrix hat geschrieben:
Mo 3. Feb 2020, 15:44
Es gibt eine Überprüfung des SQL-Mode, die ist in der "contenido/classes/class.systemtest.php" in der Funktion testMySQLModeStrict().
Vermutlich ist das die Ursache für die erzeugte Fehlermeldung. Das kannst du testweise manuell anpassen, so dass die Funktion true zurückliefert.
In Zeile 1039 wird auf strict_trans_tables geprüft und genau das ist ja auf dem Server eingestellt.
Würde ich das auf true setzen, würde das Setup vielleicht laufen (vielleicht auch nicht) aber definitiv wären in der Datenbank Fehler, weil das Problem damit nicht gelöst würde sondern nur unsichtbar gemacht.
https://dev.mysql.com/doc/refman/5.7/en ... -important
detaillierter hier:
https://dev.mysql.com/doc/refman/5.7/en ... ode-strict

Ich muss schauen, ob sich der sql_mode auf dieser DB überhaupt ändern lässt.
Vielleicht ist das das Problem.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von xmurrix » Mo 3. Feb 2020, 16:17

...Würde ich das auf true setzen, würde das Setup vielleicht laufen (vielleicht auch nicht) aber definitiv wären in der Datenbank Fehler, weil das Problem damit nicht gelöst würde sondern nur unsichtbar gemacht....
Ja, deshalb ist das alleine nicht die Lösung. Das Setzen des SQL-Modes in der Konfiguration ("data/config/{ENVIRONMENT}/config.php") sorgt dafür, dass dieser auch beim Erstellen der DB-Verbindung umgestellt wird.

Die Rückgabe der Funktion testMySQLModeStrict() als true sorgt dafür, dass der Systemtest beim Setup nicht einen Fehler ausgibt.

Meines Erachtens sind da noch zwei Punkte offen:
1. Prüfen der DB Verbindung, ob auch ein gewünschter SQL-Mode gesetzt werden konnte
2. Setzen des SQL-Modes bei einer Neuinstallation

CONTENIDO auf die strikten SQL-Modes umzustellen ist nicht einfach und es wäre nicht abwärtskompatibel. Diese Änderungen sollten nicht in der 4.10'er Reihe gemacht werden, eher in 4.11 oder später.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 16:46

xmurrix hat geschrieben:
Mo 3. Feb 2020, 16:17
Meines Erachtens sind da noch zwei Punkte offen:
1. Prüfen der DB Verbindung, ob auch ein gewünschter SQL-Mode gesetzt werden konnte
Dazu könnte man bei dem Test auch den sql_mode abfragen und mitgeben, z.B. als Array (false, $sql_mode).
Dann kann man true/false weiterhin abfragen, hat aber zusätzlich noch die Information dabei, die beim Setup angezeigt werden könnte.
Dann kann, zumindest ein erfahrener User, sehen, was auf dem Server eingestellt ist und selbst vergleichen.
Es machen ja nicht als Modes Probleme sondern eben dieser strict_trans_tables.
2. Setzen des SQL-Modes bei einer Neuinstallation
Ja, und da möchte ich noch ganz uneigennützig auf meinen Text hinweisen: viewtopic.php?f=98&t=43357&p=179261&hil ... de#p179267
Dort setze ich den sql_mode in der config.php in eine Konstante, die damit Global in Contenido verfügbar ist und kann dann in alle Funktionen diesen abfragen. Im Gegensatz zu Deiner Lösung, die nur bei der db-connect greift.
Man kann die Konstante vorher setzen und dann in Deiner Lösung in dem Nachtrag 2 ( viewtopic.php?f=98&t=43357&p=179261&hil ... de#p179124 ) lediglich die Konstante einfügen und deinen Klammerausdruck somit belassen.
Den Text in der Konstante können Laien leichter selbst verändern als so einen Klammerausdruck einbauen.

Ja, und sollten die Modi richtig in der Konstante per default richtig eingetragen sein, könnte man damit auch gleich beim Test die Modi vergleichen.
Ich suche nämlich noch nach der SQL-Anweisung, wie man strict_trans_tables explizit ausschaltet und die anderen Modi unberührt lässt.
Aber so wie ich es in der MySQL Dokumentation lese, kann man nur Modi setzen aber nicht einzelne ausschalten.
Weiß da jemand mehr darüber?
CONTENIDO auf die strikten SQL-Modes umzustellen ist nicht einfach und es wäre nicht abwärtskompatibel. Diese Änderungen sollten nicht in der 4.10'er Reihe gemacht werden, eher in 4.11 oder später.
Es ist ja auch nicht nur ein Contenido Problem, das haben alle, die früh mit Datenbank angefangen haben und viel alter Code überarbeitet werden müsste. Wie sieht es eigentlich bei Laravell aus?

Um das zu testen, müsste man auf traditional setzen, damit es einen Error gibt und dieser auch angezeigt wird. So könnte man sich Stück für Stück durcharbeiten. Wobei ich eine böse Ahnung hätte, wie viel Aufwand das machen könnte.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 17:06

Ok, kleiner Test ob sich der sql_mode setzen lässt, geht zumindest in phpMyAdmin so:
SQL-Anweisung:

Code: Alles auswählen

SET sql_mode = 'MYSQL40';
SHOW VARIABLES LIKE 'sql_mode';
Ergebnis:

Code: Alles auswählen

sql_mode = MYSQL40,HIGH_NOT_PRECEDENCE
Der Grund warum ich das so mache, ist der, dass der Mode hier nur zur Laufzeit gesetzt wird, aber nicht der Server grundsätzlich umgestellt wird.
Gibt man erst einzeln eine Anweisung ein und fragt danach erst den Mode ab, erhält man immer die Default Einstellung.
Um aber in der gleichen Sitzung (Session) den Mode zu erfassen, muss man den auch in die gleiche Sitzung packen, so wie hier mit Semikolon (und neue Zeile) getrennt.

Wie oben in meinem Fall lässt sich also der sql_mode ändern.
Warum läuft dann das Setup nicht durch?
Habe ich noch irgendwo einen Denkfehler?
Oder ist der sql_mode Test in der contenido/classes/class.systemtest.php ab Zeile 1026 falsch?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von xmurrix » Mo 3. Feb 2020, 17:13

...Es ist ja auch nicht nur ein Contenido Problem, das haben alle, die früh mit Datenbank angefangen haben und viel alter Code überarbeitet werden müsste. Wie sieht es eigentlich bei Laravell aus?...
Bei Laravel kann man in der DB-Konfiguration (config/database.php) angeben, ob man die MySQL-Verbindung im strict-Modus will oder nicht. Man kann auch den SQL-Modus konfigurieren. Das Letztere erreicht man in CONTENIDO z. B. mit der DB-Konfiguration (Stichwort "MYSQLI_INIT_COMMAND").

Andere CMS oder Blog-Systeme prüfen den SQL-Modus und ändern es gegebenenfalls. Man kommt nicht drum herum, den SQL-Modus zu prüfen und zu ändern, damit eine CONTENIDO Installation auf einer neueren MySQL-DB läuft.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mo 3. Feb 2020, 17:27

Ich habe vermutlich einen Fehler in der Funktion testMysqlModeStrict gefunden
xmurrix hat geschrieben:
Mo 3. Feb 2020, 17:13
Man kommt nicht drum herum, den SQL-Modus zu prüfen und zu ändern, damit eine CONTENIDO Installation auf einer neueren MySQL-DB läuft.
Ja, und da liegt der Fehler, weil in Zeile 1037 wird der globale sql_mode geprüft und nicht derjenige der Session.
http://www.sqlines.com/mysql/sql_mode

Ich habe daraufhin mit phpmyadmin zwei Tests gemacht und tatsächlich bekomme ich zwei verschiedene Ergebnisse.

Mit dieser SELECT Abfrage änderte sich nichts, der strict_mode wurde noch angezeigt.

Code: Alles auswählen

SET sql_mode = 'MYSQL40';
SELECT @@GLOBAL.sql_mode;
Aber mit dieser SELECT Abfrage wurde mir MYSQL40 Modus angezeigt.

Code: Alles auswählen

SET sql_mode = 'MYSQL40';
SELECT @@sql_mode;
Kurzum: In Zeile 1037 der public function testMySQLModeStrict müsste nur das @@GLOBAL.sql_mode in @@sql_mode geändert werden.

Edit: Ich habe das geändert und trotzdem läuft das Setup nicht durch, bringt genau die gleiche Fehlermeldung.
Wenn ich mit SELECT LOWER(@@sql_mode) AS sql_mode; in phpmyadmin abfrage, ist kein strict_trans_tables oder strict_all_tables mehr drin, trotzdem will die Funktion immer noch ebendieses beim Setup gefunden haben.
Wie gebe ich in der Funktion den Inhalt von "sql_mode" aus, so dass ich es sehen kann?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Setup gescheitert wegen mysql strict mode

Beitrag von Faar » Mi 19. Feb 2020, 13:13

Achso, was fehlt: Es lief dann problemlos, weil der Serverinhaber den Strict Mode auf dem Server ausgeschaltet hatte.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten