Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 25. Juni 2020 08:41

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

[GELÖST] Uploads-Modul und MySQL 8

Hallo zusammen,

seit langer Zeit habe ich mal wieder "Stress" mit Host Europe. Hier wurde auf MySQL 8 aktualisiert (sehr kurzfristig, aber das ist ein anderes Thema).
Nun funktioniert eine Seite, die das Uploads-Modul von CG nutzt, nicht mehr.

Sobald die hochgeladenen Dateien einer Kategorie angezeigt werden sollten, erscheint folgende Fehlermeldung:

[== PHP ==]
Fatal error: Uncaught Error: Call to a member function MoveNext() on null in 
/is/htdocs/SERVER-NAME/modules/Uploads/action.default.php:406 Stack trace: #0 
/is/htdocs/SERVER-NAME/lib/classes/class.CMSModule.php(1403): include() #1 
/is/htdocs/SERVER-NAME/modules/CGExtensions/CGExtensions.module.php(623): CMSModule->DoAction('default', 'cntnt01', Array, '11') #2 
/is/htdocs/SERVER-NAME/modules/Uploads/Uploads.module.php(496): CGExtensions->DoAction('default', 'cntnt01', Array, '11') #3 
/is/htdocs/SERVER-NAME/lib/classes/class.CMSModule.php(1479): Uploads->DoAction('default', 'cntnt01', Array, '11') #4 
/is/htdocs/SERVER-NAME/lib/page.functions.php(549): CMSModule->DoActionBase('default', 'cntnt01', Array, '11', Object(Smarty_CMS)) #5 
/is/htdocs/SERVER-NAME/index.php(156): preproc in /is/htdocs/SERVER-NAME/modules/Uploads/action.default.php on line 406

Ich hatte die Hoffnung, dass das mit CMSms2 und dem Uploads-Modul in der neuesten Version behoben wäre (zuvor lief die Seite auf CMSms 1.12.2 mit nem Uploads-Modul von ca. 2016).

Aber was nun? Ich konnte die gewünschte Funktionalität bisher nur über dieses Modul umsetzen:
- FEU-tauglich
- angezeigte Dateien je nach FEU-Gruppe einblenden

Hmmm ... und nu? smile
Hat jemand adhoc eine Idee? Entweder, um den o.g. Fehler zu beheben oder evtl. mit anderen Modulen?
Meine Recherchen haben mir als PHP-/MySQL-Legastheniker leider nicht weitergeholfen ...

Vielen Dank schon mal smile

Beitrag geändert von jeff1980 (25. Juni 2020 09:02)

Offline

#2 10. September 2020 09:43

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

jeff1980 schrieb:

seit langer Zeit habe ich mal wieder "Stress" mit Host Europe. Hier wurde auf MySQL 8 aktualisiert

Da hat sich einiges geändert

https://severalnines.com/database-blog/ … hould-know

Liegt erst mal nahe, dass es am Datenbank Layer liegen könnte roll ... aber kannst du die DB Engine nicht wieder zurück setzen? all-inkl.com bietet mir das an, bis PHP 7.0

jeff1980 schrieb:

das Uploads-Modul von CG

Oder das ist der Fehler tongue lol ... wäre ja nichts neues.

jeff1980 schrieb:

Ich hatte die Hoffnung, dass das mit CMSms2 und dem Uploads-Modul in der neuesten Version behoben wäre

Auch der neue Datenbank Layer ist unterm Strich AdoDB lite ...

jeff1980 schrieb:

Hat jemand adhoc eine Idee? Entweder, um den o.g. Fehler zu beheben oder evtl. mit anderen Modulen?

Wenn es tatsächlich am DB Layer liegt, hätte ich vermutlich als nächstes die große AdoDB Version getestet. Zumindest ist die deutlich besser gepflegt. Sollte mit der 1.12.2 funktionieren. Hatte ich nach meiner Erinnerung im Forum irgendwann mal beschrieben...

Offline

#3 10. September 2020 09:56

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: [GELÖST] Uploads-Modul und MySQL 8

Hi Cyberman,
schön, von Dir zu lesen  smile

Hab das hier völlig aus den Augen verloren.
Mittlerweile habe ich eine Lösung (oder einen Workaround) gefunden.
In der Datei action_default.php vom Uploads-Modul habe ich die Zeilen 332 ff. angepasst:

[== php ==]
// query assembly
        if( count($joins) ) $sql .= ' INNER JOIN '.implode(' INNER JOIN ',$joins);
        if( count($where) ) $sql .= ' WHERE '.implode(' AND ',$where);
        //$sql .= ' GROUP BY U.upload_id '.$orderby;
	$sql .= ' '.$orderby;
        // get the total number of rows
        // $matches = $db->GetOne($query1, $qparms);

Damit funktioniert alles wie es soll und ich habe bisher keine Fehler/Nachteile festgestellt.

cyberman schrieb:

Wenn es tatsächlich am DB Layer liegt, hätte ich vermutlich als nächstes die große AdoDB Version getestet. Zumindest ist die deutlich besser gepflegt. Sollte mit der 1.12.2 funktionieren. Hatte ich nach meiner Erinnerung im Forum irgendwann mal beschrieben...

Stimmt, wäre grundsätzlich ein Gedanke, habe ich glaube ich selbst schon mal anhand der Anleitung hier gemacht.

cyberman schrieb:

Oder das ist der Fehler tongue lol ... wäre ja nichts neues.

Oh ja - und unabhängig davon bin echt mal gespannt, wo die Reise mit CMSms so hingeht. Mittlerweile hat sich mein Schwerpunkt (glücklicherweise) verlagert - in eine ganz andere Branche smile
Und für die Brot-und-Butter-Seiten, die ich hin und wieder noch mache, reicht CMSms2 mit wenigen Nicht-CG-Modulen in der Regel völlig aus.

Offline

#4 10. September 2020 11:13

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

Also doch nicht der DB Layer... hatte nur kurz drauf geschaut.

jeff1980 schrieb:

Hab das hier völlig aus den Augen verloren.

Hab deine Frage nur im RSS Feed gesehen, hat mich irgendwie angefixt cool .

jeff1980 schrieb:

In der Datei action_default.php vom Uploads-Modul habe ich die Zeilen 332 ff. angepasst:

[== php ==]
        //$sql .= ' GROUP BY U.upload_id '.$orderby;

Ich glaub, damit hast du genau den Finger drauf gehabt. Aber für die Fehlermeldung kann CG ausnahmsweise mal nichts cool .

https://severalnines.com/database-blog/moving-mysql-57-mysql-80-what-you-should-know##docs-internal-guid-4d457343-7fff-c00c-09d0-aec38abb3d14 schrieb:

What Was Removed in MySQL 8.0?
The deprecated ASC or DESC qualifiers for GROUP BY clauses are removed. Queries that previously relied on GROUP BY sorting may produce results that differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

Wundert mich allerdings, dass es da nicht schon anderer Stelle gekracht hat.

jeff1980 schrieb:

Stimmt, wäre grundsätzlich ein Gedanke, habe ich glaube ich selbst schon mal anhand der Anleitung hier gemacht.

Hatte schon überlegt, dies für den Fork wieder generell zurückzudrehen roll

jeff1980 schrieb:

Mittlerweile hat sich mein Schwerpunkt (glücklicherweise) verlagert - in eine ganz andere Branche

Kenn ich nur zu gut.

Bin momentan auch eher in meiner Werkstatt zu finden (Kart/Quad) als am Computer. Wobei - aktuell hat mich der 3D Druck fest im Griff  tongue ...

Offline

#5 10. September 2020 12:10

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

cyberman schrieb:

Wundert mich allerdings, dass es da nicht schon anderer Stelle gekracht hat.

War neugierig und hab gleich mal geschaut - GROUP BY wird je 1x in der Ereignisverwaltung, im News Modul und Such Modul verwendet (1.12.2)

Offline

#6 10. September 2020 12:37

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: [GELÖST] Uploads-Modul und MySQL 8

cyberman schrieb:

Also doch nicht der DB Layer... hatte nur kurz drauf geschaut.
jeff1980 schrieb:
Hab das hier völlig aus den Augen verloren.
Hab deine Frage nur im RSS Feed gesehen, hat mich irgendwie angefixt cool .
jeff1980 schrieb:
In der Datei action_default.php vom Uploads-Modul habe ich die Zeilen 332 ff. angepasst:
Hier klicken, um den Code zum Kopieren zu markieren
[== php ==]
        //$sql .= ' GROUP BY U.upload_id '.$orderby;
Ich glaub, damit hast du genau den Finger drauf gehabt. Aber für die Fehlermeldung kann CG ausnahmsweise mal nichts cool .
https://severalnines.com/database-blog/ … c38abb3d14 schrieb:
What Was Removed in MySQL 8.0?
The deprecated ASC or DESC qualifiers for GROUP BY clauses are removed. Queries that previously relied on GROUP BY sorting may produce results that differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.
Wundert mich allerdings, dass es da nicht schon anderer Stelle gekracht hat.

Weiß schon gar nicht mehr, wie ich da drauf gekommen bin ... trial and error, wie immer bei mir smile

cyberman schrieb:
cyberman schrieb:

Wundert mich allerdings, dass es da nicht schon anderer Stelle gekracht hat.

War neugierig und hab gleich mal geschaut - GROUP BY wird je 1x in der Ereignisverwaltung, im News Modul und Such Modul verwendet (1.12.2)

Die beiden Module nutze ich quasi nie smile Und wenn die Ereignisverwaltung nichts im Frontend zerschießt, dürfte es bei meinen Projekten auch nicht auffallen  cool

cyberman schrieb:

Bin momentan auch eher in meiner Werkstatt zu finden (Kart/Quad) als am Computer. Wobei - aktuell hat mich der 3D Druck fest im Griff  tongue ...

Kart und Quad klingen auch spannend, früher wollte ich unbedingt in diese Richtung - Werkstatt und/oder Entwicklung, KFZ aber am liebsten Richtung Rennsport, habe schon Praktika in diese Richtung gemacht, aber ist dann doch alles anders gekommen.
Bei mir geht's gerade wieder ein wenig back to the roots, und das ist die Musik. Die hat mich zum Webdesign gebracht (für die eigene Band, dann für fremde Bands usw. ... wie es eben so ist ...). Jetzt baue ich gerade parallel eine kleine Werkstatt für Instrumente auf. Ist schön, an etwas zu arbeiten, dass teilweise älter ist als ich und mich wahrscheinlich auch überleben wird smile
Aber die Mischung macht's  wink

Offline

#7 14. September 2020 13:08

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.401

Re: [GELÖST] Uploads-Modul und MySQL 8

@cyberman: ♪ ... jaaa er lebt noch! ♫ lol

War neugierig und hab gleich mal geschaut - GROUP BY wird je 1x in der Ereignisverwaltung, im News Modul und Such Modul verwendet (1.12.2)

Es liegt nicht pauschal an GROUP BY.
Ich hab das gerade mal versucht unter PHP 7.4.3 und MySQL 8.0.21 zu rekonstruieren. (CMSms 2.2.14 und Uploads 1.26.2)
Keine Probleme.
Es gibt da auch noch einige MySQL Einstellungen wie z.B. ONLY_FULL_GROUP_BY, die dazu führen können, dass mit dem Query vom Uploads-Modul nichts gefunden wird.
Hat bei mir allerdings nicht zu einem Fatal Error geführt, sondern einfach nur dazu, dass nichts gefunden wurde.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12.2 unter PHP 7:
cmsms-1.12.2-php7.2-diff.tar.gz (nur die geänderten Dateien)
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)

Offline

#8 15. September 2020 14:34

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.401

Re: [GELÖST] Uploads-Modul und MySQL 8

Nachtrag: Okay, ich konnte es doch nachstellen.
Ist ein Fehler im Modul. Genauer gesagt im Query.
Hat mit der Umstellung auf MySQL 8 nur marginal zu tun.

Der Fehler tritt erst auf, sobald man beim Uploads-Modul benutzerdefinierte Felder verwendet und in den MySQL-Einstellungen ONLY_FULL_GROUP_BY aktiviert ist - was in MySQL 8.0 Standard ist.

Warum nur bei benutzerdefinierten Feldern?
Weil ein paar Zeilen Code nur dann ausgeführt werden, wenn es diese Felder gibt.
Und dort kommt es dann zum Fehler.

Warum bei ONLY_FULL_GROUP_BY ?
Weil, wenn man Ergebnisse zusammenfassen will, man dann genau angeben muss, wonach was zusammengefasst werden soll, um zu klären, was genau jetzt mit anderen ausgewählten Feldern (also die explizit im SELECT-Statement) passieren soll, wenn Ergebnisse mehrfach vorkommen. Naja, oder so ähnlich.

Wenn ONLY_FULL_GROUP_BY aktiviert ist, gibt es einen MySQL-Fehler. D.h. die Datenbank gibt kein Objekt als Resultat zurück sondern NULL. Und das führt dann zum Fatal Error bei PHP. Weil dort nicht geprüft wird, ob der Rückgabewert ein Objekt ist bzw. wird dort nur geprüft, ob man noch nicht am Ende des vermeintlichen Objekt-Resultats angekommen ist. Und solange das nicht der Fall ist, soll man das Resultat auslesen.

Siehe action.default.php Zeile 406:

# Q: What happens if $dbresult is NULL?
while( !$dbresult->EOF ) { # trivial error - unlimited notices that most of you guys would rather suppress than fixing it
	...
}
# A: Error due to timeout.

Problem an der ganzen Sache: man prüft BOOLEAN. D.h. man prüft mit Hilfe von while( !$dbresult->EOF ) ... . Solange also die Eigenschaft $dbresult->EOF den Wert FALSE ergibt, soll man das machen ...
Der Witz an der Sache: wenn $dbresult kein Objekt ist, dann ergibt das in jedem Fall FALSE! Der Zugriff auf Objekt-Eigenschaften, die nicht existieren bzw. deren Variablen keine Objekte sind, führen "nur" zu einem E_NOTICE Fehler. Ist an dieser Stelle trivial. Weil irgendeine Eigenschaft, die nicht existiert, existiert halt nicht und man erhält dafür dann einfach den Wert NULL. Kann PHP also gnädigerweise selber abfangen.

NULL ist für PHP aber gleichbedeutend mit FALSE. D.h. die while-Schleife wird immer durchlaufen. Ob ich nun ein Objekt habe oder nicht. Und sie würde, wenn es kein Objekt ist, auf ewig durchlaufen werden, weil die nötige Bedingung zum Abbruch der Schleife ($dbresult->EOF == true) ja wie gesagt niemals eintreffen kann ... wenn man nicht ein paar Zeilen später versuchen würde, auf eine Methode dieses vermeintlichen Objektes zuzugreifen. Und das endet an dieser Stelle immer in einem Fatal Error.

Siehe action.default.php Zeile 409:

# Q: What happens if $dbresult is NULL?
while( !$dbresult->EOF ) { # trivial error - one notice that most of you guys won't take serious and rather suppress than fixing it
	...
	$dbresult->MoveNext(); # non trivial ...
}
# A: Fatal error due to call to a member function MoveNext() on NULL.

Weiter unten macht man es richtig.
Siehe action.default.php Zeile 431:

# Q: What happens if $dbresult is NULL?
while ($dbresult && $row = $dbresult->FetchRow()) {
	...
}
# A: Nothing.

Laberpalaver ... LÖSUNG:

In der Datei action.default.php Zeile 400:

if( is_array($fielddefs) && count($fielddefs) ) {

ändern in :

if( $dbresult && is_array($fielddefs) && count($fielddefs) ) {

Das verhindert zunächst den fatalen Fehler. 
Nicht die beste Lösung, aber die einfachste.
Besser wäre es, vorher schon zu prüfen und die benutzerdefinierten Felder nur dann auszulesen, wenn es denn überhaupt auch Ergebnisse aus der DB gibt. Dann müsste man Zeile 398 bis 513 in eine gesonderte IF-Bedingung wrappen:

Der fatale Fehler ist aber lediglich nur ein Folgefehler. Das eigentliche Problem liegt am Query. D.h. wir erhalten jetzt an dieser Stelle statt des fatalen Fehlers immer ein leeres Resultat. D.h. wir müssen weiter oben den Query noch abändern. Entweder auf GROUP BY verzichten - was Jeff ja im Grunde gemacht hat, allerdings hat er dabei auch die Sortierreihenfolge deaktiviert - oder im GROUP BY Statement auch die Felder angeben, die im SELECT-Statement ausgewählt wurden.

Mit GROUP BY in der Datei action.default.php Zeile 335:

$sql .= ' GROUP BY U.upload_id '.$orderby;

ändern in:

$sql .= ' GROUP BY U.upload_id, C.upload_category_deletable, D.num '.$orderby;

Ohne GROUP BY aber mit ORDER BY ändern in:

Allerdings wird dieser Query auch nicht mehr lange funktionieren, weil er eine Funktion verwendet, die bereits seit einer Weile als DEPRECATED gekennzeichnet ist: SQL_CALC_FOUND_ROWS.
D.h. man müsste die komplette Datenbankabfrage umschreiben und auf zwei Queries verteilen und dann mit COUNT() arbeiten.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12.2 unter PHP 7:
cmsms-1.12.2-php7.2-diff.tar.gz (nur die geänderten Dateien)
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)

Offline

#9 21. September 2020 10:23

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

jeff1980 schrieb:

Kart und Quad klingen auch spannend, früher wollte ich unbedingt in diese Richtung - Werkstatt und/oder Entwicklung, KFZ aber am liebsten Richtung Rennsport,
...
Ist schön, an etwas zu arbeiten, dass teilweise älter ist als ich und mich wahrscheinlich auch überleben wird smile

Na klar Rennsport, was sonst big_smile - nur, dass mir momentan da mein Rücken Ärger macht (Bandscheibe angerissen). So bleibt es vorerst beim Schrauben... zumindest, wenn ich genügend Schmerzmittel intus hab monkey .

Wie du schon sagst, ist was anderes, etwas mit seinen Händen zu schaffen, als "nur" Buchstaben, Zeichen und Zahlen aneinander zu reihen cool

Offline

#10 21. September 2020 10:25

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

NaN schrieb:

@cyberman: ♪ ... jaaa er lebt noch! ♫ lol

Na klar tut er das - Unkraut vergeht nicht  angel

Offline

#11 09. Oktober 2020 08:27

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: [GELÖST] Uploads-Modul und MySQL 8

Hm, die Benachrichtigungsfunktion ist irgendwie außer Funktion smile
Dickes Danke (wenn auch verspätet, sorry) an NaN für die ausführliche Erklärung UND Lösung.
Habe ich gespeichert und werde es bei nächster Gelegenheit auch live testen.
Host Europe, wo noch viele meiner Kundenprojekte liegen, fegen gerade mal wieder durch und stellen ab 4.11. auf PHP 7.4 um. Zum Glück laufen bis jetzt alle Installationen noch (sowohl die 1.12.2 als auch die 2.x). Aber in dem Zuge werde ich mal ein bisschen Pflege hier und da betreiben. Da kommt das gerade richtig.

Offline

#12 10. Oktober 2020 19:30

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

jeff1980 schrieb:

Hm, die Benachrichtigungsfunktion ist irgendwie außer Funktion smile

Funktioniert bei mir tadellos - schau mal unter Profil > Privatsphäre > "Setze hier die Optionen für deine Abonnements"

Offline

#13 10. Oktober 2020 19:34

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: [GELÖST] Uploads-Modul und MySQL 8

Andynium schrieb:
jeff1980 schrieb:

Hm, die Benachrichtigungsfunktion ist irgendwie außer Funktion smile

Funktioniert bei mir tadellos - schau mal unter Profil > Privatsphäre > "Setze hier die Optionen für deine Abonnements"

Ohne was zu ändern kam jetzt eine Benachrichtigung. Komisch, sonst war nie was (also schon länger nicht mehr), auch nicht im Spam. Diese Mail kam jetzt auch ganz normal durch.
Egal smile Schön, dass es wieder zu klappen scheint.

Offline

#14 10. Oktober 2020 19:37

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.003
Webseite

Re: [GELÖST] Uploads-Modul und MySQL 8

jeff1980 schrieb:

Ohne was zu ändern kam jetzt eine Benachrichtigung. Komisch, sonst war nie was (also schon länger nicht mehr), auch nicht im Spam. Diese Mail kam jetzt auch ganz normal durch.
Egal smile Schön, dass es wieder zu klappen scheint.

Hab auch nix an der Software gemacht  hmm ...

Offline