Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Sonderzeichen im Import per CSV

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Sonderzeichen im Import per CSV
    am: 07. Oktober 2013, 12:38:21
    Hallo Community.
    Ich habe mich bislang noch nie mit den Export/Import-Funktionen des Shops beschäftigt.
    Nun habe ich ein wenig rumgetestet und stoße auf folgendes Problem.
    Shopversion: 1.06 rev4642
    Texterkennungszeichen: "
    Seperator: ;

    Wenn man nun im Artikelnamen und/oder in der Artikelbeschreibung Anführungsstriche benutzt (egal ob einfache oder doppelte), z.B. für Zollangaben oder auch als Hervorhebung (z.B. "Spezial"),
    werden diese escaped.
    Wie kann ich das verhindern ?

    Klar, daß die Backslashes von diesem Code in der /admin/includes/classes/import.php kommen:
    Code: PHP  [Auswählen]
    if ($this->FileSheme['p_name.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_name' => addslashes($dataArray['p_name.'.$this->languages[$i_insert]['code']])));
                            if ($this->FileSheme['p_desc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_description' => addslashes($dataArray['p_desc.'.$this->languages[$i_insert]['code']])));

    Mir fällt jedoch nicht ein wie ich das ändern kann ohne die Sicherheit zu gefährden, z.B. bei von Drittanbietern (Lieferanten) angebotenen CSVs, die ja einem Unbedarften theoretisch Schadcode in die CSV einschleusen könnten.

    Wer kann mich erhellen ?

    Merci.

    Gruß,
    noRiddle

    Linkback: https://www.modified-shop.org/forum/index.php?topic=27919.0

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #1 am: 07. Oktober 2013, 12:42:12
    Mich würde auch interessieren... Ich muss immer nach dem Import die Beschreibungen bearbeiten bzw. ich lösche vor dem Import alle Anführungsstriche und ich gebe sie manuell nach dem Import wieder ein.

    Gruß piru

    astaller

    • Fördermitglied
    • Beiträge: 686
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #2 am: 07. Oktober 2013, 14:10:11
    Hallöchen,

    ich habe das bei mir so gelöst (ca. Zeile 420):

    Code: PHP  [Auswählen]
                            if ($this->FileSheme['p_name.'.$this->languages[$i_insert]['code']] == 'Y')
    /* ORIGINAL - Sonderzeichen
                            $prod_desc_array = array_merge($prod_desc_array, array ('products_name' => addslashes($dataArray['p_name.'.$this->languages[$i_insert]['code']])));
                            if ($this->FileSheme['p_desc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_description' => addslashes($dataArray['p_desc.'.$this->languages[$i_insert]['code']])));
                            if ($this->FileSheme['p_shortdesc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_short_description' => addslashes($dataArray['p_shortdesc.'.$this->languages[$i_insert]['code']])));
    */

    // START STAMAGRAF - Sonderzeichen
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_name' => $dataArray['p_name.'.$this->languages[$i_insert]['code']]));
                            if ($this->FileSheme['p_desc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_description' => $dataArray['p_desc.'.$this->languages[$i_insert]['code']]));
                            if ($this->FileSheme['p_shortdesc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_short_description' => $dataArray['p_shortdesc.'.$this->languages[$i_insert]['code']]));
    // ENDE STAMAGRAF - Sonderzeichen
     

    PS: Weiß leider nicht mehr woher ich das habe...
    Ich glaube ich hab mir das bei dem Modul "Modul Erweiterter Im/Export 2.0" abgeschaut...

    MfG
    Achim S.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #3 am: 07. Oktober 2013, 14:18:30
    Soweit waren wir schon, du hast ja lediglich das addslashes entfernt.
    Das kann man auch sicherlich machen wenn man weiß was man tut,
    sprich, die CSV-Dateien kennt und dem Lieferanten der sie evtl. anbietet traut.
    Was aber ist eine allgemeine Lösung, auch für unbedarfte User ?

    Gruß,
    noRiddle

    web28

    • modified Team
    • Beiträge: 9.404
    Re: Sonderzeichen im Import per CSV
    Antwort #4 am: 07. Oktober 2013, 19:39:16
    Der Impoprt sollte grundsätzlich so funktionieren.

    1: xtc_db_prepare_input anwenden
    2. Daten mit xtc_db_perform in die Datenbank speichern

    Falls 2. nicht benutzt wird auf die Daten xtc_db_input anwenden. (xtc_db_input wird in xtc_db_perform immer angewendet).

    So wird das an zig Stellen im Shop gemacht und es wird normalerweise alles richtig in die Datenbank geschrieben.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #5 am: 07. Oktober 2013, 19:56:01
    Ja nu, das ist die Original- import.php von der ich hier spreche, daran ist nichts verändert worden.
    Du klingst als hätte hier jemand die Datei auf dumme Weise verändert.

    Was xtc_db_input() macht ist ja ebenfalls escapen mittels mysql_real_escape_string().
    Frage ist, wie (und wo) es wieder ausgegeben wird.

    Werde mir das mal genauer anschauen, ein Tipp wäre trotzdem nicht schlecht, nicht nur für mich.

    Danke.

    Gruß,
    noRiddle

    *NACHTRAG*
    Ich ahne Böses..., magic_quotes_gpc = ON ...., das könnte es sein, mal sehen...,
    nur seltsam, daß es dann bei anderen Daten nicht passiert, nur beim Import...

    web28

    • modified Team
    • Beiträge: 9.404
    Re: Sonderzeichen im Import per CSV
    Antwort #6 am: 07. Oktober 2013, 20:28:09
    Zitat
    Du klingst als hätte hier jemand die Datei auf dumme Weise verändert.

    Ich wollte nur zum Ausdruck bringen, das sich in dieser Datei einige Ungereimtheiten befinden!

    Tausche mal addslashes gegen xtc_db_prepare_input (Zeile 416 ff)

    Und bei den WHERE und 'update' gegen xtc_db_input

    magic_quotes ist bei fast allen modernen Server auf OFF

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #7 am: 08. Oktober 2013, 00:57:04
    Okay, verstehe.
    Es gab erste Erfolge ;-).

    Wenn Ihr nichts dagegen habt, oder es gar schon gemacht habt, würde ich die Datei fixen und anständig formatiert hier zur Verfügung stellen.
    Ist das okay mit euch ?

    Gruß,
    noRiddle

    web28

    • modified Team
    • Beiträge: 9.404
    Re: Sonderzeichen im Import per CSV
    Antwort #8 am: 08. Oktober 2013, 11:19:12
    :pro:

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #9 am: 08. Oktober 2013, 17:21:01
    Okay, hier mal der "Versuch" einer gefixten und formatierten /admin/includes/classes/import.php.
    Bitte testen und Feedback geben.
    Meine Tests verliefen bislang positiv.

    Da man beim Import mittels p_groupAcc.0 nicht auch die Gruppenrechte für Admins setzen konnte und das immer im Nachhinein manuell machen mußte, habe ich das gefixt.
    Es ist nun möglich im CSV-Pattern folgende Felder dazuzunehmen (p_groupAcc.0 ging vorher nicht):
    p_groupAcc.0, p_groupAcc.1, p_groupAcc.2, p_groupAcc.3, usw.,
    je nachdem wieviele Kundengruppen man hat.
    Die Werte sind 1 für Artikel sehen erlaubt und 0 oder leer für nicht erlaubt.

    Alle Änderungen sind bislang noch mit noRiddle kommentiert.

    Es wird empfohlen als Texterkennungszeichen " zu nehmen
    und als Trennzeichen ;
    Das natürlich so auch im Backend einstellen.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #10 am: 10. Oktober 2013, 23:06:25
    So liebe Leute,
    nach Rücksprache mit web28 habe ich die letzten kleinen Fixes gemacht.

    Außer diversen Fixes Sonderzeichen betreffend (" in Kategoriename, Produktname, meta-tags)
    können nun nicht nur alle Group Permissions für die Produkte gesetzt werden (siehe vorhergehender Post),
    sie werden auch im Falle eines Exports mit exportiert.

    Schema ist dafür (Beispiel mit Trennzeichen: ; und Texterkennungszeichen: "):
    "XTSOL";"p_model";"p_stock";"p_sorting";"p_shipping";"p_tpl";"p_manufacturer";"p_fsk18";"p_priceNoTax";"p_priceNoTax.1";"p_priceNoTax.2";"p_priceNoTax.3";"p_groupAcc.0";"p_groupAcc.1";"p_groupAcc.2";"p_groupAcc.3";"p_tax";"p_status";"p_weight";"p_ean";"p_disc";"p_opttpl";"p_vpe";"p_vpe_status";"p_vpe_value";"p_image.1";"p_image.2";"p_image.3";"p_image.4";"p_image.5";"p_image";"p_name.de";"p_desc.de";"p_shortdesc.de";"p_meta_title.de";"p_meta_desc.de";"p_meta_key.de";"p_keywords.de";"p_url.de";"p_name.en";"p_desc.en";"p_shortdesc.en";"p_meta_title.en";"p_meta_desc.en";"p_meta_key.en";"p_keywords.en";"p_url.en";"p_cat.0";"p_cat.1";"p_cat.2";"p_cat.3";"p_cat.4";"p_cat.5"(für mehr Kundengruppen entsprechend erweitern => p_groupAcc.X)

    Ich hatte noch vor auch die Group Permissions für die Kategorien sowie die Kategorienamen sprachabhängig einzubauen,
    ich muß aber gestehen, das war mir jetzt zu aufwendig.
    Ich würde dafür die ganze Klasse umschreiben, so wie's jetzt ist, brech ich mir einen ab ;-).

    Außerdem empfehle ich noch in /admin/csv_backend.php folgendes einzubauen:
    Das suchen
    Code: PHP  [Auswählen]
                    if (is_file(DIR_FS_CATALOG.'import/'.$file) and ($file !=".htaccess"))

    und hiermit ersetzen
    Code: PHP  [Auswählen]
                    if (is_file(DIR_FS_CATALOG.'import/'.$file) and ($file !=".htaccess") and ($file != "index.html")) //added index.html to exclusion, noRiddle

    So wird die index.html im Dropdown in Hilfsprogramme => Import/Export nicht mehr mit zur Auswahl angezeigt, das nervte nämlich. ;-)

    Bitte testen.
    Piru, du hattest doch auch Probleme mit ", teste bitte mal.

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #11 am: 11. Oktober 2013, 11:09:04
    Also @noRiddle,

    hat super funktioniert. Vor allem hat mir immer sowas gestört:
    Wenn ich in der Beschreibung zB. das habe
    Code: PHP  [Auswählen]
    <span style="color: rgb(183, 7, 28);">
    Kommt das raus:
    Code: PHP  [Auswählen]
    <span style="\&quot;color:">

    Mit der tolle Erweiterung (danke dafür!!!) importiert sich alles wie sein soll. Getestet Anführungsstriche einfache und doppelte.

    Die Änderung in /admin/csv_backend.php funktioniert auch gut, ich persönlich mache ich sie nicht, weil ich immer die index.html sehen möchte. Das ist aber nur wegen einer persönliche Erfahrung, ich lösche die alte imports aus dem Ordner import nicht immer, und da alle meine Imports heißen import_aus135.csv (ändert sich nur die Nummer), sehe ich lieber zu erst index.html, das sagt zu mir: aha, du musst jetzt denken und gucken welche die richtige Datei du importierst.

    Man könnte deine Änderungen noch etwas erweitern und die Datei für 1.06 schon anpassen, damit auch das Feld "Bestellbeschreibung" mitimportiert wird.

    In deiner Datei:
    Zeile 125 nach
    Code: PHP  [Auswählen]
    'p_shortdesc.'.$this->languages[$i]['code'] => '',
    folgendes:
    Code: PHP  [Auswählen]
    'p_orderdesc.'.$this->languages[$i]['code'] => '',

    Zeile 510 nach
    Code: PHP  [Auswählen]
    if ($this->FileSheme['p_shortdesc.'.$this->languages[$i_insert]['code']] == 'Y')
                    //$prod_desc_array = array_merge($prod_desc_array, array ('products_short_description' => addslashes($dataArray['p_shortdesc.'.$this->languages[$i_insert]['code']])));
                    $prod_desc_array = array_merge($prod_desc_array, array ('products_short_description' => xtc_db_prepare_input($dataArray['p_shortdesc.'.$this->languages[$i_insert]['code']])));
    folgendes
    Code: PHP  [Auswählen]
    if ($this->FileSheme['p_orderdesc.'.$this->languages[$i_insert]['code']] == 'Y')
                                    $prod_desc_array = array_merge($prod_desc_array, array ('products_order_description' => xtc_db_prepare_input($dataArray['p_orderdesc.'.$this->languages[$i_insert]['code']])));

    Zeile 906 nach
    Code: PHP  [Auswählen]
    $this->encode('p_shortdesc.'.$this->languages[$i]['code']);
    folgendes
    Code: PHP  [Auswählen]
    $line .= $this->encode('p_orderdesc.'.$this->languages[$i]['code']);

    Danke nochmal noRiddle!  :thumbs:

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #12 am: 11. Oktober 2013, 11:22:45
    Hallo piru.
    Ersteinmal, muchissimas gracias por poner lo a preuba ;-).

    Gute Idee mit der Bestellbeschreibung.

    Habe aber noch ein Problem, vielleicht kannst du das mal testen.
    Es könnte daran liegen, daß ich mit OpenOffice meine Test-CSV zum Import erstellt habe.  :mhhh:

    Fall: Trennzeichen Semikolon
    Alles funktioniert perfekt

    Fall: Trennzeichen TAB
    • wenn ich als Trennzeichen nichts eingebe funktioniert der Import
    • wenn ich \t eingebe funktioniert der Import nicht

    In der Klasse wird jedoch definiert
    Code: PHP  [Auswählen]
    if (CSV_SEPERATOR == '') {
        $this->seperator = "\t";
    }
     if (CSV_SEPERATOR == '\t') {
        $this->seperator = "\t";
    }

    Finde den Haken nicht :-(

    *NACHTRAG*
    Error-Ausgabe: ERROR: no Modelnumber, line: dataset:
    In notepad++ sieht der Tab nach XTSOL auch seltsam aus, er ist kürzer als die anderen...

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #13 am: 11. Oktober 2013, 11:52:44
    Ich erstelle meine datei.csv auch mit OpenOffice.

    ich habe gestested, aber in gegenteil zu dir, bei mir funktionieren beide nicht (gleiche Fehlermeldung: ERROR: no Modelnumber, line: dataset:
    Fall: Trennzeichen TAB
    • wenn ich \t eingebe funktioniert der Import nicht
    • wenn ich als Trennzeichen nichts eingebe funktioniert der Import auch nicht

    Ich glaube hier würde das gleiche Problem geschildert

    Gruß piru
    (claro, hago las pruebas con mucho gusto)  ;-)

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.984
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #14 am: 11. Oktober 2013, 11:59:16
    Seltsam...
    Ich versuche mal den Fehler zu finden, man das sch... File ärgert mich jetzt aber langsam...

    Sieht denn bei dir wenn du das File z.B. in notepad++ öffnest (oder einem anderen Editor) der erste Tab hinter XTSOL auch kürzer aus ?

    Gruß,
    noRiddle
    Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
    28 Antworten
    12935 Aufrufe
    26. November 2010, 19:57:29 von JeLe0310
    2 Antworten
    2385 Aufrufe
    02. Februar 2016, 16:06:17 von ssdshop
    9 Antworten
    6916 Aufrufe
    23. Januar 2010, 10:14:42 von holger
               
    anything