Was hat diese Fehlermeldung zu bedeuten

Gesperrt
lunsen_de
Beiträge: 302
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Was hat diese Fehlermeldung zu bedeuten

Beitrag von lunsen_de »

Hallo, in der Errorlog eines 4.8.15 Systems, welches schon seit fast einem Jahr ohne Probleme läuft, taucht seit etwa 3 Tagen eine Meldung permanent auf und lässt die Errorlog gewaltig anschwellen.

Code: Alles auswählen

17-Jun-2012 13:27:55] /deutsch/finanzen/jobben/jobmarkt/praktikant-studienrichtung-bauingenieurwesen-in-erfurt-gesucht.html next_record called with no query pending in Module ID 156.
[17-Jun-2012 13:27:55] /deutsch/finanzen/jobben/jobmarkt/praktikant-studienrichtung-bauingenieurwesen-in-erfurt-gesucht.html MySQL error : 
SELECT
        al.idartlang, al.idart, al.idlang as lang, al.urlname, cl.idcatlang, cl.idcat,
        cl.urlpath, ca.idcatart
FROM
        con_art_lang AS al, con_cat_lang AS cl, con_cat_art AS ca
WHERE
        al.idart = ca.idart AND
        ca.idcat = cl.idcat AND
        al.idlang = cl.idlang AND
        ( (cl.idcat = 338 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 405 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(al.idart = 917 AND al.idlang = 1) OR 
(cl.idcat = 494 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 1 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 320 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 321 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 389 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 391 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 393 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 395 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 401 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 403 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 390 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 421 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 417 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 418 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 419 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 420 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 527 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(al.idart = 1772 AND al.idlang = 1) OR 
(al.idart = 1768 AND al.idlang = 1) OR 
(al.idart = 1766 AND al.idlang = 1) OR 
(al.idart = 1765 AND al.idlang = 1) OR 
(al.idart = 1718 AND al.idlang = 1) OR 
(cl.idcat = 386 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 387 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 407 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 519 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 409 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 410 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 411 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 412 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 413 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 388 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 397 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 529 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 414 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 398 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 531 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 415 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 416 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 392 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 423 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 424 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 425 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 426 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 427 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 394 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 429 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 430 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 431 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 432 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 433 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 396 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 434 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 435 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 436 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 402 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 441 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 437 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 438 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 439 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 440 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 533 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 404 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 442 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 443 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 526 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 444 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 537 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 530 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 445 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 525 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 536 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 384 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 385 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) OR 
(cl.idcat = 376 AND cl.idlang = 1 AND cl.startidartlang = al.idartlang) )
Dieser Eintrag taucht mehrfach in unterschiedlicher Länge und zu unterschiedlichen Artikeln auf.

Das Modul nutze ich nur als Druckbefehl (übersetzbar, da die Seite zweisprachig ist).

Moduloutput:

Code: Alles auswählen

<?php 
echo '<a href="javascript:window.print()" title="'.mi18n("Drucken").'" class="hilfsnavigatfooter"><img src="images/stw_print.gif" border="0" alt="'.mi18n("Drucken").'" />'.mi18n("Drucken").'</a>';
?>
Alles lief wie gesagt ohne Probleme und das Modul geht auch. Ich kann den Fehler nicht reproduzieren.
Ist das Serverproblem/Ausfall etc. zu bestimmten Zeiten oder was kann das sein?

Ich hoffe auf Hilfe/Erläuterung.

Gruß lunsen_de
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von Spider IT »

Hallo lunsen_de,

du schaust im verkehrten Modul nach, da ist keine SQL-Anweisung drin.
Wenn du im Backend auf die Modulliste (links) zeigst, wird unten im Browser der Link angezeigt (z.B. javascript:conMultiLink('right_top','main.php?area=mod&frame=3&action=&idmod=85&contenido=d806e7ee248b8e5e0e0cbab1bb7f7682','right_bottom','main.php?area=mod_edit&frame=4&action=&idmod=85&contenido=d806e7ee248b8e5e0e0cbab1bb7f7682');).
In diesem Link kannst du die idmod finden, die muss mit der "Module ID" in der ersten Zeile der Fehlermeldung übereinstimmen.

Gruß
René
lunsen_de
Beiträge: 302
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von lunsen_de »

Hallo,

genau bei diesem Modul steht:

javascript:conMultiLink('right_top','main.php?area=mod&frame=3&action=&idmod=156&contenido=b3e0db4e76c7773712dbe68d67440e20','right_bottom','main.php?area=mod_edit&frame=4&action=&idmod=156&contenido=b3e0db4e76c7773712dbe68d67440e20');

Sollte also das Modul aus der Fehlermeldung sein, oder?

Kann der Fehler mit etwas anderem, als dem Modul zusammenhängen?

Gruß lunsen_de
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von xmurrix »

Hallo lunsen_de,

die SQL-Anweisung wird vom AMR-Plugin generiert, und vermutlich zeigt die Fehlermeldung auf den letzten verarbeiteten Modul im Template.

Anscheinend gibt es in deiner CONTENIDO-Installation inkonsistente Daten, d. h. in Tabellen con_art_lang oder con_cat_lang oder con_cat_art gibt es Einträge mit Fremdschlüsseln, zu denen es keine Einträge in referenzierenden Tabellen gibt. Das ist aber eine reine Vermutung...

Das AMR-Plugin baut die SQL-Anweisung in Form von INNER-JOINS und geht davon aus, dass die Abfrage mindestens ein Ergebnis liefern muss. Wenn die referenzielle Integrität der Tabellen nicht gewährleistet ist, liefern SQL-Anweisungen mit INNER-JOINS keine Ergebnisse.

Mit einer zusätzlichen Überprüfung im AMR-Plugin kannst du verhindern, dass der Fehler generiert wird.
Öffne die Datei ontenido/plugins/mod_rewrite/classes/class.modrewriteurlstack.php und ersetze am unteren Teil der Funktion _chunkSetPrettyUrlParts() den Code

Code: Alles auswählen

        $this->_oDb->query($sql);
        while ($this->_oDb->next_record()) {
            $aRS = $this->_oDb->Record;

            // loop thru fields array
            foreach ($aFields as $field) {
                if (isset($aRS[$field])) {
                    // reduce existing field
                    unset($aRS[$field]);
                }
                $rsStackID = $this->_makeStackId($aRS);
                if (isset($aStack[$rsStackID])) {
                    // matching stack entry found, add urlpath and urlname to the new stack
                    $aNewStack[$rsStackID]['urlpath'] = $aRS['urlpath'];
                    $aNewStack[$rsStackID]['urlname'] = $aRS['urlname'];
                    break;
                }
            }
        }
gegen

Code: Alles auswählen

        if ($this->_oDb->query($sql)) {
            while ($this->_oDb->next_record()) {
                $aRS = $this->_oDb->Record;

                // loop thru fields array
                foreach ($aFields as $field) {
                    if (isset($aRS[$field])) {
                        // reduce existing field
                        unset($aRS[$field]);
                    }
                    $rsStackID = $this->_makeStackId($aRS);
                    if (isset($aStack[$rsStackID])) {
                        // matching stack entry found, add urlpath and urlname to the new stack
                        $aNewStack[$rsStackID]['urlpath'] = $aRS['urlpath'];
                        $aNewStack[$rsStackID]['urlname'] = $aRS['urlname'];
                        break;
                    }
                }
            }
        }
Damit sollte es funktionieren, also die Fehlermeldung sollte nicht mehr auftauchen. Habe es aber nicht getestet.

Wenn es klappt, löst es aber immer noch nicht das vermutete Problem mit deiner Datenbank. So, wie ich das sehe, wird in deinem Fall eine SQL-Anweisung generiert, um alle vorhandenen URLs auf Clean-URLs umzuwandeln. Wenn diese SQL-Anweisung kein Ergebnis liefert, dann werden wohl keine der URLs in Clean-URLs umgewandelt. Schlimmstenfalls zeigen dann alle Links zum Root-Verzeichnis.

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.
lunsen_de
Beiträge: 302
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von lunsen_de »

Hallo, danke für die Info. Den Code werde ich testen.

Aber Alles verstanden habe ich nicht:

1. Kann ich die inkonsistenten Einträge suchen, wenn ja, wie?
2. Was passiert da, wenn jemand eine Seite aufrufen will bekommt er Nichts angezeigt und der Fehler(meldung) wird generiert?
3. Was meinst du mit schlimstenfalls und alle Links, wird das schlimmer, nehmen die Probleme zu, geht die Datenbank kaputt?
4. Liegt das am Server auf dem die Datenbank läuft, also vielleicht wechseln?

Gestern abend wurden in der Errorlog folgendes generiert:

Code: Alles auswählen

[19-Jun-2012 20:05:41] /menu-oben/wohnen/wohnanlagen/standort-jena.html next_record called with no query pending.
[19-Jun-2012 20:05:42] / MySQL error : 
SELECT
        al.idartlang, al.idart, al.idlang as lang, al.urlname, cl.idcatlang, cl.idcat,
        cl.urlpath, ca.idcatart
FROM
        con_art_lang AS al, con_cat_lang AS cl, con_cat_art AS ca
WHERE
        al.idart = ca.idart AND
        ca.idcat = cl.idcat AND
        al.idlang = cl.idlang AND
        ( (al.idart = 36 AND al.idlang = deleted) )
[19-Jun-2012 20:05:42] / next_record called with no query pending.
[19-Jun-2012 20:05:42] / MySQL error : 
SELECT
        al.idartlang, al.idart, al.idlang as lang, al.urlname, cl.idcatlang, cl.idcat,
        cl.urlpath, ca.idcatart
FROM
        con_art_lang AS al, con_cat_lang AS cl, con_cat_art AS ca
WHERE
        al.idart = ca.idart AND
        ca.idcat = cl.idcat AND
        al.idlang = cl.idlang AND
        ( (al.idart = 36 AND al.idlang = deleted) OR 
(ca.idcatart = 85 AND ca.idart = al.idart AND al.idlang = deleted) )
.....
Zur Info: eine Kategorie namens /menu-oben/ gibt es nicht. Und die idart=36 ist doch eigentlich die Fehlerseite.

Ich hoffe auf weitere Infos und teste dann ersteinmal den Code.

Gruß lunsen_de
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von xmurrix »

1. Kann ich die inkonsistenten Einträge suchen, wenn ja, wie?
Du kannst folgende SQL-Anweisung als Vorlage nehmen, um fehlende Datensätze zu finden:

Code: Alles auswählen

SELECT * FROM con_art_lang WHERE con_art_lang.idlang = 1 AND con_art_lang.idart NOT IN (SELECT idart FROM con_art);
Die Anweisung listet alle Einträge aus der Tabelle "con_art_lang" zu denen es kein Eintrag in der Tabelle "con_art" gibt.
Du kannst auch die Tabellen umgehren.

Code: Alles auswählen

SELECT * FROM con_art WHERE con_art.idart NOT IN (SELECT idart FROM con_art_lang WHERE con_art_lang.idlang = 1);
2. Was passiert da, wenn jemand eine Seite aufrufen will bekommt er Nichts angezeigt und der Fehler(meldung) wird generiert?
PHP Fehler sollten nicht auf der Seite ausgegeben werden, CONTENIDO achtet darauf, dass das error_reporting() korrekt gesetzt wird.
Schau dir mal den Wert in contenido/includes/config.misc.php für error_reporting() an.
3. Was meinst du mit schlimstenfalls und alle Links, wird das schlimmer, nehmen die Probleme zu, geht die Datenbank kaputt?
Wenn der Fehler in der SQL-Anweisung des AMR-Plugins auftritt, dann werden vermutlich alle gefundenen Links umgewandelt in "/", d. h. alle Links gehen auf das Rootverzeichnis (Startseite).
Ob es nun schlimmer wird oder nicht und ob die Datenbank kaputt geht, kann ich dir nicht sagen.
4. Liegt das am Server auf dem die Datenbank läuft, also vielleicht wechseln?
Nein, ich denke nicht, dass das am Server liegt. Andererseits, es wäre schon möglich, dass der Datenbankserver zwischen mehreren INSERT Befehlen sich verabschiedet, so dass das Anlegen eines Artikels einer Kategorie nicht abgeschlossen werden kann. Theoretisch kann das passieren, in der Praxis ist das aber sehr unwahrscheinlich.
Generiertst du etwa dynamisch irgendwelche Kategorien/Artikel in Modulen? Falls ja, Prüfe mal den Modulcode, ob da auch immer ein Eintrag in con_art und in con_art_lang oder con_cat und in con_cat_lang erstellt wird.
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.
lunsen_de
Beiträge: 302
Registriert: Mo 17. Okt 2005, 20:26
Wohnort: Weimar
Kontaktdaten:

Re: Was hat diese Fehlermeldung zu bedeuten

Beitrag von lunsen_de »

Hallo, ich habe deine Angaben abgearbeitet:

1. inkonsistenten Einträge

Code: Alles auswählen

SELECT * FROM con_art_lang WHERE con_art_lang.idlang = 1 AND con_art_lang.idart NOT IN (SELECT idart FROM con_art);
Keine Ergebnisse

Code: Alles auswählen

SELECT * FROM con_art_lang WHERE con_art_lang.idlang = 2 AND con_art_lang.idart NOT IN (SELECT idart FROM con_art);
Keine Ergebnisse

Code: Alles auswählen

SELECT * FROM con_art WHERE con_art.idart NOT IN (SELECT idart FROM con_art_lang WHERE con_art_lang.idlang = 1);
2 Ergebnisse

Code: Alles auswählen

SELECT * FROM con_art WHERE con_art.idart NOT IN (SELECT idart FROM con_art_lang WHERE con_art_lang.idlang = 2);
ca. 200 Ergebnisse

Aber alle idart, die gefunden werden sind Artikel, die nur in einer Sprache existieren. Also im Beispiel der 2 Ergebnisse sind das 2 Artikel, die nur in der englischen Sprache existieren (2. Sprache) und scheinbar im Deutschen (1. Sprache) gelöscht wurden.
Bei den 200 Ergebnissen sind das Artikel, die in Deutsch da sind und noch nicht nach Englisch synchronisiert wurden.

Habe ich mit deinem Code Alles richtig gemacht? Denn das mit den idarts in den Sprachen scheint mir doch logisch und ok!?

2. In der config.misc.php steht error_reporting (E_ALL ^E_NOTICE ^E_DEPRECATED);
Ist sicher Standard, also ich habe daran nichts verändert.

PS: ich denke nicht, dass Artikel oder Kategorien dynamisch durch Module generiert werden. Leider hat eine andere Firma ein Plugin installiert, bei dem ich nicht sagen kann, ob da soetwas integriert ist.

Gruß lunsen_de
Gesperrt