Analyse - Beratung & Umsetzung von IT Projekten

Virtuemart 3 Produkt klonen error 1062 Duplicate Entry

Die Migration von Joomla 1.5 und Virtuemart 1.1.9 auf Joomla 3.5.1 und Virtuemart 3.0.16 verlief problemlos. Alle Produkte wurden mit ihren jeweiligen Eigenschaften übernommen, sodass der Online Shop schnell migriert war. Nach einer ausgiebigen Testphase ging das Projekt auch online und wird rege genutzt. Da sich einige Fehler aber erst im Livebetrieb zeigen, war ich gespannt was dort alles so zu Tage tritt.

Nach einiger Zeit kam der Shopbetreiber auf mich zu und sagte mir, dass er bei dem Klonen vereinzelter Produkte folgende Fehlermeldung bekam:
1062 Duplicate entry 'Produkt *' for key 'slug' SQL=INSERT INTO `#__virtuemart_products_de_de` (`virtuemart_product_id`,`product_name`,`product_s_desc`,`product_desc`,`metadesc`,`metakey`,`customtitle`,`slug`) VALUES ('7105','Produktdaten *','','','','Produkt-Slug*')

*an dieser Stelle stehen Ihre produktspezifischen Daten

Nach anfänglicher Ratlosigkeit, ging ich in die Recherchephase über und musste ziemlich schnell feststellen, dass einige dieses Problem haben, aber niemand so Recht eine Lösung parat hatte. Also verließ ich die üblichen Foren und trug die Fakten einmal zusammen.

 

Error Fakten:

  1. es ist ein Datenbankfehler (1062 Dublicate Entry ist eine typische SQL Fehlermeldung)
  2. der Fehler tritt nur auf wenn bestimmte Produkte geklont werden sollen
  3. der Fehler tritt nicht auf wenn ein Produkt neu erstellt wird
  4. Debug Informationen geben keinen weiteren Hinweis

 

Annahme:

Ich ging davon aus das der Produktname oder die Produktbeschreibung zu lang ist und das es bei dem Klonen eben jener Felder Probleme gibt, da sie aufgrund der Länge nicht mehr eindeutig sind. Außerdem zog ich in Betracht, das ich vor kurzem das TrustedShops Gütesiegel erfolgreich in den Virtuemart 3 Bestellprozess integriert habe. Es erschien mir zwar unwahrscheinlich, aber der Fehler und die Integration lagen dicht bei einander.

 

Annähern an das Duplicate Entry Problem:

Nachdem aus Punkt 1 ersichtlich ist es sich um MySQL Problem handelt, schaute ich mir erst einmal die entsprechenden PHP Scripte an, die beim Klonen eines Produktes ausgeführt werden. Die entsprechende INSERT OR UPDATE Sequenz gab aber wenig Aufschluss, so dass ich schnell wieder in die Recherche überging. Allerdings suchte ich diesmal etwas globaler und war nicht wirklich auf Virtuemart fixiert. Ein Post im CSVImproved Forum erregte dann meine Aufmerksamkeit. Innerhalb des Postings wurden die Abhängigkeiten der einzelnen Felder erklärt.

 

Die Lösung des Duplicate Entry Problems:

Das Problem wird weder durch den Produktnamen noch durch die Produktbeschreibungslänge generiert. Viel mehr steht hier das Datenfeld Slug im Fokus des Geschehens. Dieses Feld ist bei dem Anlegen eines Produktes ein Pflichtfeld, welches automatisch generiert wird. In diesem Feld wird, laut meinem Verständnis und ohne Gewähr, die Relation aus dem vorhandenem Virtuemart Produkt mit dem geklonten Produkt generiert und entsprechend abgelegt. Soll heißen die Kategorienverknüpfung, das erste Produkt in der Kategorie etc. pp. werden in das Slug Feld übernommen. Ein gezielter Blick in die MySQL Datenbank ergab das Ergebnis, dass das Slug Feld eine maximale Zeichenlänge von 192 Zeichen aufweist.

Im Umkehrschluss heißt das, wenn die Kombination aus Produktanzahl und Zeichenlänge den Wert von 192 Zeichen überschreitet, kann kein eindeutiger Schlüssel generiert werden, der das eine Produkt von dem geklonten Produkt eindeutig unterscheidet.

Um das Problem zu lösen nutzte ich phpmyadmin und ging wie folgt vor:

  1. die Datenbank öffnen
  2. zu der Tabelle Ihr-Präfix_virtuemart_products_de_de navigieren
  3. bei den Optionen "Anzeigen", "Struktur", "Suchen", etc. pp. auf Struktur klicken. Es öffnet sich folgendes Bild:
    mysql db ausschnitt virtuemart products de de dublicate entry virtuemart 1062

Ich habe hier das Slug Feld von 192 Zeichen auf 330 Zeichen geändert. Dazu klickt man auf den Link "Bearbeiten" Dazu war es ebenfalls nötig vorab das product_desc Feld um 150 Zeichen zu kürzen (von 18400 auf 18250 Zeichen) und schon war das Problem behoben. Im Virtuemart 3 können nun wieder Produkte geklont und kopiert werden ohne die Duplicate Entry 1062 Fehlermeldung.

 

Fazit:

Natürlich ist das sicher nicht der beste Weg um das Problem zu beheben, denn die Möglichkeit besteht immerhin, dass auch die 330 Zeichen nicht ausreichen. Außerdem kann man das Spielchen: "Ich nehme es dem einen weg und gebe es dem anderen." nicht ewig spielen. Aber in meinem Fall ist das nicht weiter relevant, da der Kunde die volle Produktbeschreibung nicht ausnutzt. Eventuell ist dann eine Anpassung der gesamten Tabelle erforderlich, verbunden mit einer entsprechenden Änderung der Feldtypen.

Wie immer gilt auch hier, die Änderungen an einem BackUp vorab zu testen, bevor man die Livesite / MySQL Datenbank ändert.

Die Annahme das der Fehler eventuell von einem fehlerhaften TrustedShops Script ausgelöst wird oder die Integration des TrustedShops Gütesiegel falsch von statten ging, hat sich nicht bestätigt. Sowohl das Gütesiegel als auch die TrustedShops Zusammenfassung am Ende des Virtuemart 3 Bestellvorgangs funktionieren nach wie vor einwandfrei.

 

Mein Testsystem:

Joomla 3.5.1

Virtuemart 3.0.16

 

Update vom 25.06.2016:

Bis jetzt kam es zu keinerlei Störungen des Shops nach der Änderung. Produkte können immer noch geklont, die Fehlermeldung tritt nicht auf.

 

Update vom 06.04.2017:

Die Aktualisierung auf Virtuemart 3.21 klappte nicht mehr, da die beschriebenen Datenbankfelder geändert wurden. Es ging also wieder auf die Ausgangsfehlersuche. Allerdings diesmal mit erfolg. Der Fehler 1062 ist ebenso simpel und wie einfach zu lösen.

Auslöser des Problems sind zu lange Aliasse der Produktnamen. Beim Klonen eines Produktes, wird die Produkt ID an das neu erstellte Produkt im Alias ergänzt. Der Alias wächst sozusagen mit. Klont man also fleißig bereits geklonte Produkte, wird dieser länger und länger. Irgendwann ist der Zeichenvorrat von 192 Zeichen aufgebraucht und der Fehler 1062 tritt auf.

In meinem Fall habe ich die Produkte aus der Tabelle Ihr-Präfix_virtuemart_products_de_de als Excel CSV Datei exportiert und die Aliasse von Hand eingekürzt. Als nützliches Tool hat sich dabei Notepad++ mit der Suchen & Ersetzen Funktion erwiesen. Die geänderten Produktaliasse habe ich anschließend wieder importiert und die Größenänderungen der Tabellenfelder auf die ursprünglichen Werte zurück gesetzt.

Anschließend klappte das Update auf die neue Virtuemart Version ohne Probleme und auch der Fehler 1062 trat bis jetzt nicht mehr auf.

Wir benutzen Cookies.

Außerdem werden teilweise auch Cookies von Diensten Dritter eingesetzt. Mehr Informationen hier.

Ich habe verstanden