Neu Funktion checkSeo ist fehlerhaft

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.701
1.612
Berlin
Heute bekam ich ein Problem auf den Tisch, wo es darum geht das eine Kategorie URL ständig ein _1 angehängt bekommt wenn diese eine Änderung hat oder es einen Komplettabgleich gibt obwohl dieses nicht erforderlich ist.

Die Ausgangssituation ist folgende:
der Shop ist mehrsprachig, die cSeo Url ist in allen Sprachen gleich, so das der Shop die Url vermutlich mal durchnummeriert hat.
1559060531126.png

Die obere URL ist die deutsche Sprache, wenn ich jetzt einen Abgleich mache und in der Kategorie etwas geändert habe, dann löscht der Shop diese Einträge kKategorie=120 ja aus der Datenbank und erstellt diese Einträge dann neu.
Das bedeutet jetzt, das wenn checkSeo() kommt, er theoretisch, Hula-Hoop nicht finden sollte und die gewünschte Url so wie gewünscht zurückgeben sollte.

Das passiert aber nicht, es wird wenn die Kategorie geupdated wird, immer Hula_Hoop_1 zurückgegeben.
Ich glaube das die Funktion checkSeo überarbeitet werden müsste.

Zum einen ist der unterstrich ein x-beliebiges Zeichen, wodurch wenn ich nach 'Hula-Hoop_%' suche auch Treffer gefunden werden die Hula-Hoop-Turnschuh, Hula-Hoop-Turnschuh_7 usw. heißen.
Ein Unterstrich müsste also eigentlich escaped werden um sicher zu gehen das es als Unterstrich behandelt wird. (Stand MySQL 5.7) https://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

Zum anderen frage ich mich, warum diese Schleife zur Namensfindung grundsätzlich aufgerufen wird, das kostet doch unnötig Performance, warum gibt es nicht zuerst eine Abfrage ob es genau diese Url schon gibt.

Die Funktion führt also bei einem Komplettabgleich mit 300 Kategorien, 300 mal ( je Sprache) diese SQL Abfrage aus :

Code:
SET @IKEY := 0;
select oseo.newSeo
            FROM (
                SELECT CONCAT('Hula-Hoop', '_', @IKEY:=@IKEY+1) newSeo, @IKEY nOrder
                FROM tseo AS iseo
                WHERE iseo.cSeo LIKE 'Hula-Hoop%'
                    AND iseo.cSeo RLIKE '^Hula-Hoop(_[0-9]+)?$'
            ) AS oseo
            WHERE oseo.newSeo NOT IN (
                SELECT iseo.cSeo
                FROM tseo AS iseo
                WHERE iseo.cSeo LIKE 'Hula-Hoop_%'
                    AND iseo.cSeo RLIKE '^Hula-Hoop_[0-9]+$'
            )
            ORDER BY oseo.nOrder
LIMIT 1

Aus meiner Sicht wäre ein vorheriges direktes Prüfen der Url bestimmt nicht so fehleranfällig und würde den SQL Server weniger stressen.
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Hallo,
Zum einen ist der unterstrich ein x-beliebiges Zeichen, wodurch wenn ich nach 'Hula-Hoop_%' suche auch Treffer gefunden werden die Hula-Hoop-Turnschuh, Hula-Hoop-Turnschuh_7 usw. heißen.
für das einzelne LIKE ist das korrekt. Die Where-Klausel besitzt aber eine über AND-verknüpfte zweite Bedingung mittels RegEx. Diese RegEx-Prüfung ist die eigentliche Bedingung und behandelt einen Unterstrich auch als solchen. Das zusätzliche (eigentlich redundante) LIKE dient nur dazu, die Performance der Abfrage zu verbessern und quasi eine "Vorauswahl" über den Index auf cSEO zu treffen. Das RLIKE alleine würde an der Stelle keinen Index benutzen.
Trotzdem hast du natürlich recht, dass man das hier schon korrekt einschränken könnte, indem der Unterstrich escaped wird.
 

hula1499

Sehr aktives Mitglied
22. Juni 2011
5.172
1.078
In der WaWi ist als Metaeintrag /Url Pfad Hula Hoop vergeben.
Daraus macht, auch die Vorschau, richtig Hula-Hoop
 

hula1499

Sehr aktives Mitglied
22. Juni 2011
5.172
1.078
Ok, woran liegts, am "_" der anderen Sprachen?

Wäre eine Lösung, unter Bezugnahme aufn geposteten Screenshot, die:
_6
_9
_ES
auf -6/-9/-ES zu ändern um den Bug zu umgehen?
Ein Ändern von
_6 auf _sechs und _9 auf _neun brachte den selben Fehler, das falsche Umschreiben von Hula-Hoop auf Hula-Hoop_1 bei jedem Kat update.
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.701
1.612
Berlin
Sag ich ja, ist genau das was ich gemacht habe nur eben ohne Container, den gibt es in 4.06 ja noch nicht

Code:
        $exists = \Shop::Container()->getDB()->select('tseo', 'cSeo', $url);
        if ($exists === null) {
            return $url;
        }
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.701
1.612
Berlin
in dbEs/seo.php gibt es die Funktion checkSeo

in dieser muss dann dieser zusätzliche Code eingefügt werden:

Code:
    if(Shop::DB()->select('tseo', 'cSeo', $cSeo)===null) {
            return $cSeo;
        }

so das es dann so aussieht:

Code:
/**
 * @param string $cSeo
 * @return string
 */
function checkSeo($cSeo)
{
    if (!$cSeo) {
        return '';
    }
    
    if(Shop::DB()->select('tseo', 'cSeo', $cSeo)===null) {
            return $cSeo;
        }

    Shop::DB()->query("SET @IKEY := 0", 10);
    $obj = Shop::DB()->query(
......hier geht es weiter

Das ist jetzt aber nicht noch mal getestet, das habe ich gerade onthefly zusammengebaut
 

Dustin

Sehr aktives Mitglied
14. Mai 2008
2.948
44
Enger
HI @css-umsetzung
danke für die schnelle Hilfe. So sieht meine function aus.

PHP:
function checkSeo($cSeo)
{
    if (!$cSeo)
    {
        return '';
    }

        if(Shop::DB()->select('tseo', 'cSeo', $cSeo)===null) {
            return $cSeo;
        }

    Shop::DB()->query('SET @IKEY := 0', 10);
    $obj = Shop::DB()->query(
        "SELECT oseo.newSeo
            FROM (
                SELECT CONCAT('{$cSeo}', '_', @IKEY:=@IKEY+1) newSeo, @IKEY nOrder
                FROM tseo AS iseo
                WHERE iseo.cSeo LIKE '{$cSeo}%'
                    AND iseo.cSeo RLIKE '^{$cSeo}(_[0-9]+)?$'
            ) AS oseo
            WHERE oseo.newSeo NOT IN (
                SELECT iseo.cSeo
                FROM tseo AS iseo
                WHERE iseo.cSeo LIKE '{$cSeo}_%'
                    AND iseo.cSeo RLIKE '^{$cSeo}_[0-9]+$'
            )
            ORDER BY oseo.nOrder
            LIMIT 1", 1
    );

    return isset($obj->newSeo) ? $obj->newSeo : $cSeo;
}

Leider hat es keinen Effekt. Muss der Cache oder sonstiges geleert werden oder nochmals ein KOmplettabgleich?
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
6.701
1.612
Berlin
Das kommt erst zum tragen wenn der jeweilige Artikel oder die Kategorie neu übertragen wird.
Also von alleine passiert da nichts.

Du musst also in der betreffenden Kategorie oder in dem Artikel etwas ändern damit der neu übertragen wird.
 

Dustin

Sehr aktives Mitglied
14. Mai 2008
2.948
44
Enger
Super danke dir, habe es gerade getestet mit einer Kategorie.

Es scheint zu funktionieren. Mache jetzt nochmal nen Komplettabgleich.

Aber schon traurig das solch ein Bug nicht mal gerade behoben wird.
 

peterwill

Gut bekanntes Mitglied
29. Oktober 2007
347
18
JTL wird sicher für das Problem kurzfristig eine Lösung anbieten !!!!;)
bei uns geht die Lösung von css leider nicht und ich habe auch keine Lust weil etwas nicht geht ewig im code rumzufummeln....
 

alex9019

Gut bekanntes Mitglied
17. Mai 2018
309
20
Ich habe den Code eingefügt und auch einen Komplettabgleich durchgeführt.
Jedoch bleibt das Problem weiterhin bestehen.
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Wawi 1.9.4.0 Ausgabe ohne Funktion JTL-Wawi - Fehler und Bugs 1
Neu "Funktion" Weiterlesen Templates für JTL-Shop 5
Neu Wunschzettel Funktion auch bei Vaterartikeln möglich? Templates für JTL-Shop 0
Neu Slice-Funktion in PDF Vorlagen nutzen User helfen Usern - Fragen zu JTL-Wawi 2
Neu Sitemap ist HTML - Sitemap kann gelesen werden, enthält aber Fehler / Google Web Master Tool Allgemeine Fragen zu JTL-Shop 3
Neu Bei Hermes ist Sendungsnummer gleichzeitig die Retourennummer. Otto.de - Anbindung (SCX) 3
Neu Cloud oder inHouse, dass ist die Frage Installation von JTL-Wawi 16
Neu JTL Shop 5 Daten - In "leere" JTL Wawi Datenbank importieren - Ist das möglich? User helfen Usern - Fragen zu JTL-Wawi 8
Neu Rechnungsdatum ist gleich Lieferdatum wird nicht erkannt User helfen Usern - Fragen zu JTL-Wawi 1
Neu Onlineshop ist offline Allgemeine Fragen zu JTL-Shop 3
Neu Bestand bei Stücklistenartikel ist falsch JTL-Wawi - Fehler und Bugs 2
Neu Folgendes fehlt seit Mai 23 auf der Rechnung: "Versanddatum: Ist gleich dem Rechnungsdatum." Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 4
Neu Update von Wawi 17.15.4. auf 18.12.0 geht nicht, weil Primary voll ist JTL-Wawi - Fehler und Bugs 4
Gelöst Packtisch+ 1.8.112 : Rechnung wird bei Teillieferung erzeugt, obwohl als Ausführungsbedingung "Nur bei der letzten Teillieferung" ausgewählt ist. JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 2
Neu Prüfung ob Wert vorhanden ist einbauen Gelöste Themen in diesem Bereich 4
Neu Wie gut ist die Datenbanksynchronisation? JTL-Wawi - Ideen, Lob und Kritik 4
Neu Schweiz: Die Gewichtsangabe ist kleiner als im CN23-Formular > kein Versand möglich JTL-ShippingLabels - Fehler und Bugs 13
Beantwortet WF Mail wenn Amazon Artikel nicht verknüpft ist JTL-Workflows - Ideen, Lob und Kritik 1
Neu ist das Hinzufügen eines zusätzlichen Hinweis bei Artikeln, mit bestimmtem Merkmal, die auf die Einkaufsliste wandern möglich ? User helfen Usern - Fragen zu JTL-Wawi 0
Rechnung drucken/mailen, ist das wirklich euer Ernst?? JTL-Wawi 1.8 4
Neu Ist es möglich per Ameise Kunden zu löschen? Arbeitsabläufe in JTL-Wawi 2
Lieferanten EK wird nicht auf Artikelebene kopiert? EK ist überall 0 beim Artikel. JTL-Wawi 1.8 8
Bug? Worker 2.0 - Shop Abgleich "Quicksync" ist kein Quicksync mehr - Paketgröße wird ignoriert JTL-Wawi 1.8 10
Neu Stückliste ist nicht verfügbar, obwohl all Komponenten verfügbar sind JTL-Shop - Fehler und Bugs 2
V1.8.11: "Versand" / "Lieferscheine versendet" - Wo ist das Suchfeld für Sendungsnummer geblieben? JTL-Wawi 1.8 2
Sortierung von Variationen ist immer wieder Durcheinander JTL-Wawi 1.6 1
Neu Lieferstatus anzeigen "Nur, wenn Lagerbestand 0 ist" Allgemeine Fragen zu JTL-Shop 0
Neu Packhinweis, wenn Paketgewicht unplausibel ist Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 4

Ähnliche Themen