Fehler in der Kategorie-Tabelle beseitigen

Es kann durch einen Fehler im automatischen Kategorie-Import vorkommen das Level bzw. Children-Count der Kategorien nicht stimmen. Das äußert sich dadurch das im Magento-Admin neu angelegte Kategorien einfach verschwinden oder das bei Kategorien urplötzlich kein Plus-Zeichen zum Aufklappen mehr auftaucht und das obwohl man sich sicher ist das Unterkategorien bestehen.

Mit folgendem SQL lassen sich die Level der Kategorien sowie deren Kinder wieder korrekt reparieren:

Level der Kategorien neu setzen:

UPDATE catalog_category_entity
SET `level` = (LENGTH(path) - LENGTH(REPLACE( path, '/', '' ))+0)

Anzahl der Unterkategorien (Kinder) setzen

CREATE TEMPORARY TABLE `catalog_category_entity_tmp` as
SELECT m.`entity_id`,
(LENGTH(m.`path`) - LENGTH(REPLACE( m.`path`, '/', '' ))+1) as `level`,
COUNT(c.`entity_id`) as `children_count`
FROM catalog_category_entity as m
LEFT JOIN `catalog_category_entity` as c ON c.`parent_id` = m.`entity_id`
GROUP BY m.`entity_id`;

UPDATE `catalog_category_entity` m, `catalog_category_entity_tmp` c
SET
m.`children_count`=c.`children_count`,
m.`level`=c.`level`
WHERE m.`entity_id`=c.`entity_id`;

Benutzung natürlich auf eigene Gefahr :)

Update: Das SQL habe ich mit dem Kommentar von André Willing ergänzt. Danke für das Mitdenken an ihn.



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Walter Steinbach am

Der obige Code ist leider falsch.

CREATE TEMPORARY TABLE catalog_category_entity_tmp AS SELECT m.entity_id, (LENGTH(m.path) - LENGTH(REPLACE(m.path, '/', '' )) + 1) AS level, COUNT(c.entity_id) AS children_count FROM catalog_category_entity AS m LEFT JOIN catalog_category_entity AS c ON c.parent_id = m.entity_id GROUP BY m.entity_id;

UPDATE catalog_category_entity AS m, catalog_category_entity_tmp AS c SET m.children_count=c.children_count, m.level=c.level WHERE m.entity_id = c.entity_id;

Walter Steinbach am

Hallo, scheint super zu laufen. Ich musste auch das SQL bereinigen, wegen. Sonderzeichen. Hier der saubere Code:

CREATE TEMPORARY TABLE catalog_category_entity_tmp AS SELECT m.entity_id, (LENGTH - LENGTH) + 1) AS level, COUNT AS children_count FROM catalog_category_entity AS m LEFT JOIN catalog_category_entity AS c ON c.parent_id = m.entity_id GROUP BY m.entity_id;

UPDATE catalog_category_entity AS m, catalog_category_entity_tmp AS c SET m.children_count=c.children_count, m.level=c.level WHERE m.entity_id = c.entity_id;

Tobias Vogt am

Hey Mirido,

das ist ein Sonderzeichen-Problem in unserem Blog sorry. Am besten mal Schrittweise die Zeichen alle durchgehen und kontrollieren. Nach path`, müssten z.B. normale einfache Anführungszeichen stehen.

Habe mir aber notiert das im nächsten Jahr mal anzuschauen!

Tobi

mirido am

Hallo, ich habe das selbe Problem mit Magento 1.5 undbekomme auch immer den Fehler:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '– LENGTH(REPLACE( m.path, ‘/’, â€

Was genau ist da falsch im Code? Ich bin leider nicht sehr gut mit SQL... Danke

Tobias Vogt am

Danke Benjamin für den Hinweis :)

Benjamin Wunderlich am

Hallo Tobias,

wir haben obige Queries in einem Magento 1.3 Shop ausgeführt. Nach einem Update auf Magento 1.5 hatten wir dann Probleme mit den URL-Rewrites, die falsch oder gar nicht angelegt wurden. Wir konnten die Ursache in den Levels der Kategorien lokalisieren. Das Problem konnte gelöst werden, indem wir die obigen Queries erneut ausgeführt haben, aber das +1 für die Levels entfernt haben. Ich weiß nicht, ob das an dem Update liegt, ob Magento 1.5 das irgendwie anders verwaltet oder ob die Queries mit +1 schon falsch sind. Das ursprüngliche Problem (fehlende Ausklappfunktion) wurde mit den Queries in 1.3 behoben und es gab auch keine URL-Rewrite-Probleme. Die kamen erst ab 1.5.

Die Probleme waren konkret:

Die Produkt-Kategorien wurden (willkürlich) mit dem Präfix "default-category" (URL-Key der Root-Kategorie) ausgestattet, was zu einem 404-Fehler führte. Bei neu angelegten Produkten wurden keine URL-Rewrites eingefügt, sodass die URLs nicht suchmaschinenfreundlich, sondern nach dem Schema catalog/product/view/id/4881 waren.

Ich gehe davon aus, dass sich die Levels nicht zwischen 1.3 und 1.5 verändert haben, oder?

Tobias Vogt am

Danke für den Hinweis Benjamin. Wordpress scheint irgendwelche Zeichen zu ersetzen - ich gucke mal ob ich die böse Funktion finde ;)

Benjamin Wunderlich am

OK, meine läuft auch nicht, liegt am Kopieren aus dem Browser heraus.

Benjamin Wunderlich am

Hallo Tobias,

vielen Dank für die Queries, die haben mir sehr geholfen und mein Problem gelöst. Ich habe dieselbe Fehlermeldung wie mag-magento bekommen. Ich konnte zwar die problematischen Zeichen nicht direkt ausfindig machen, habe die erste Query dann aber einmal abgetippt und dann lief es:

CREATE TEMPORARY TABLE catalog_category_entity_tmp AS SELECT m.entity_id, (LENGTH(m.path) - LENGTH(REPLACE(m.path, '/', ''))+1) AS level, COUNT(c.entity_id) AS children_count FROM catalog_category_entity AS m LEFT JOIN catalog_category_entity AS c ON c.parent_id = m.entity_id GROUP BY m.entity_id;

UPDATE catalog_category_entity m, catalog_category_entity_tmp c SET m.children_count=c.children_count, m.level=c.level WHERE m.entity_id=c.entity_id;

Benjamin

Tobias Vogt am

Hey mag-magento,

das sieht so als als würde dir dein Browser ein paar Sonderzeichen dazu basteln. Ich habe mal versucht die noch einmal zu bereinigen. Ansonsten musst du das SQL erst in einen Editor kopieren und Stück für Stück, mit ein wenig SQL-Know-How, bereinigen. Dann sollte es laufen :)

Tobi

mag-magento am

Hallo,

ich bekomme eine fehlermeldung bei der zweiten SQL Anweisung:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '– LENGTH(REPLACE( m.path, ‘/’, â€

Den Code habe ich aus dem Browser rauskopiert.

Tobias Vogt am

Danke sehr!

André Willing am

So sollte es mit dem Update der Anzahl der Unterkategorien klappen. Im Beispiel fehlte die Tabelle "catalog_category_entity_tmp":

CREATE TEMPORARY TABLE catalog_category_entity_tmp as SELECT m.entity_id, (LENGTH(m.path) - LENGTH(REPLACE( m.path, '/', '' ))+1) as level, COUNT(c.entity_id) as children_count FROM catalog_category_entity as m LEFT JOIN catalog_category_entity as c ON c.parent_id = m.entity_id GROUP BY m.entity_id;

UPDATE catalog_category_entity m, catalog_category_entity_tmp c SET m.children_count=c.children_count, m.level=c.level WHERE m.entity_id=c.entity_id;

Dein Kommentar