Neu Funktion checkSeo ist fehlerhaft

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
8.448
2.573
Berlin
Firma
css-umsetzung
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.881
529
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.
 

css-umsetzung

Offizieller Servicepartner
SPBanner
6. Juli 2011
8.448
2.573
Berlin
Firma
css-umsetzung

hula1499

Sehr aktives Mitglied
22. Juni 2011
5.389
1.315
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.389
1.315
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
8.448
2.573
Berlin
Firma
css-umsetzung
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
8.448
2.573
Berlin
Firma
css-umsetzung
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.998
53
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
8.448
2.573
Berlin
Firma
css-umsetzung
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.998
53
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
348
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

Sehr aktives Mitglied
17. Mai 2018
370
51
Ich habe den Code eingefügt und auch einen Komplettabgleich durchgeführt.
Jedoch bleibt das Problem weiterhin bestehen.
 
Ähnliche Themen
Titel Forum Antworten Datum
Wareneingang Hinweisfeld (immer noch) ohne Funktion JTL-Wawi 2.0 0
Neu KI Funktion / KI Übersetzung Funktioniert nicht mehr User helfen Usern - Fragen zu JTL-Wawi 1
Neu Sumup Solo Trinkgeld funktion? JTL-POS - Fragen zu Hardware 0
Plattformabgleich Shop löschen - Wo ist das in der MySQL DB? JTL-Wawi 2.0 4
Neu seit Umstellung auf DHL 4.0 ist auf DHL Aufkleber grauer Schleier im Hintergrund JTL-ShippingLabels - Fehler und Bugs 0
Aufgeblähte DB bereinigen (dbo.POS_Bon) - Welches Vorgehen ist empfehlenswert? JTL-Wawi 1.10 2
Neu Google Shopping: g:product_type mit Attribut befüllen ist immer DE, obwohl mehrsprachig angelegt Plugins für JTL-Shop 0
Update auf Shop 5.5.0 von 5.4.1 ist der Shop nicht mehr erreichbar Upgrade JTL-Shop4 auf JTL-Shop5 4
Neu Schlüssel ist im angegebenen Status nicht gültig Einrichtung / Updates von JTL-POS 2
Tabelle tfirma in der Shop-Datenbank ist leer Einrichtung JTL-Shop5 3
Neu Wo ist JTL-Debug geblieben? Shopvariablen beim Shop-/Templateentwicklung sichtbar machen? Plugins für JTL-Shop 10
Neu JTL, was ist eigentlich los mit euch? JTL-Wawi - Fehler und Bugs 5
Stable ist raus JTL-Wawi 2.0 119
Neu Artikelbild verknüpfen verknüpft nur alle Bilder, wenn kein Bild 1 da ist JTL-Ameise - Fehler und Bugs 0
Neu Wo verändere ich die Variable #firma.name# die in Mail-Vorlagen zu finden ist? Allgemeine Fragen zu JTL-Shop 2
Neu von JTL-Wawi-Version 1.10.16.0 ist kein Update...möglich Installation von JTL-Wawi 2
Automatische Berechnung der Artikelmenge wenn Verkaufseinheit qm ist JTL-Wawi 1.10 4
Neu JTL WAWI V1.11.6.0 Stornorechnung, Stornotext wird nicht gespeichert und ist nicht abrufbar JTL-Wawi - Fehler und Bugs 0
Neu Paypal Checkout Plugin - Ist vorhanden aber nichts funktioniert Plugins für JTL-Shop 9
Webinar am 04.02.26: Es geht um euer Backup: Vertrauen ist gut. Restore ist besser! Messen, Stammtische und interessante Events 1
Neu Connector zu WooCommerce ist im Worker gesperrt trotz Lizenz Technische Fragen zu den JTL-Connectoren 5
Neu Falsches Vorschaubild wird angezeigt, obwohl das richtige Bild in JTL hinterlegt ist User helfen Usern - Fragen zu JTL-Wawi 0

Ähnliche Themen