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

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #15 am: 11. Oktober 2013, 13:02:01
    Komando zurück!
    Genau wie bei dir

    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

    Ich habe die Datei vorher falsch gespeichert. Jetzt als ich sie mit Notepad++ aufgemacht habe, habe ich meinen Fehler gesehen
    Das heißt, bei mir den gleichen Fehler wie bei dir.

    Das mit der Länge sieht aber nicht komisch aus (kopiert direkt aus Notepad++):
    XTSOL   p_model   p_stock   p_sorting   p_shipping
    XTSOL   71398   100      1   default

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #16 am: 11. Oktober 2013, 13:29:49
    Okay, Fehler gefunden.
    Bei den "Einstellungen" in Hilfsprogramme => Import/Export werden die eingegebenen Zeichen im Hintergrund über ein Configuration-File gespeichert (gID=20).
    In /admin/configuration.php werden die Daten ($configuration['configuration_value']) beim Auslesen aus der Tabelle configuration mit einem stripslashes() versehen (*EDIT* warum eigentlich ?),
    was bewirkt, daß der Backslash bei Eingabe von \t als Trennzeichen verschwindet.
    Das kann man auf der Configuration-Seite auch sehen
    (einfach mal Konfiguration => Mein Shop aufrufen und in der Browser-Adresszeile bei gID 20 eingeben).

    Abhilfe:
    In der hier besprochenen Datei /admin/includes/classes/import.php folgendes machen:
    class xtcImport
    Code: PHP  [Auswählen]
            if (CSV_SEPERATOR == '') {
                $this->seperator = "\t";
            }
            if (CSV_SEPERATOR == '\t') {
                $this->seperator = "\t";
            }

    ändern in
    Code: PHP  [Auswählen]
            if (CSV_SEPERATOR == '') {
                $this->seperator = "\t";
            }
            if (CSV_SEPERATOR == xtc_db_prepare_input('\t')) {
                $this->seperator = "\t";
            }

    und
    class xtcExport
    Code: PHP  [Auswählen]
            if (CSV_SEPERATOR == '')
                $this->seperator = "\t";
            if (CSV_SEPERATOR == '\t')
                $this->seperator = "\t";

    ändern in
    Code: PHP  [Auswählen]
            if (CSV_SEPERATOR == '')
                $this->seperator = "\t";
            if (CSV_SEPERATOR == xtc_db_prepare_input('\t'))
                $this->seperator = "\t";

    Damit wird in der if-Abfrage der Backslash bei \t entfernt und so verglichen.
    Evtl. ist ein stripslashes() hier allerdings schneller als die xtc-Funktion.

    Nun funktioniert sowohl Export (ging vorher nämlich auch nicht) als auch Import auch mit Angabe von \t als Trennzeichen.

    Im Anhang das neue Paket.
    Es ist noch die zugehörige Sprachdatei von mir etwas erweitert worden, sodaß zum besseren Verständnis noch folgende Erklärungen im Backend in rot erscheinen:
    wird das Eingabefeld leer gelassen wird bei Export per default " benutzt !
    wird das Eingabefeld leer gelassen wird bei Export per default \t (= Tab) benutzt !

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #17 am: 11. Oktober 2013, 16:36:56
    @piru
    Da du deine Import-Dateien immer import_IRGENDWAS.csv nennst und die index.html im Dropdown  belassen möchtest, könntest du in /admin/csv_backend.php folgendes machen:
    Statt
    Code: PHP  [Auswählen]
    if (is_file(DIR_FS_CATALOG.'import/'.$file) and ($file !=".htaccess"))
                    {
                        $size=filesize(DIR_FS_CATALOG.'import/'.$file);
                        $files[]=array(
                            'id' => $file,
                            'text' => $file.' | '.xtc_format_filesize($size));
                    }

    machst du das
    Code: PHP  [Auswählen]
    [code=php]if (is_file(DIR_FS_CATALOG.'import/'.$file) and ($file !=".htaccess"))
                    {
                        $size=filesize(DIR_FS_CATALOG.'import/'.$file);
                        $files[]=array(
                            'id' => $file,
                            'text' => $file.' | '.xtc_format_filesize($size));

                            arsort($files); //added sorting, noRiddle
                    }
    [/code]

    Damit wird umgekehrt alpha-numerisch sortiert, was bedeutet, daß
    • index.html immer als erstes steht und
    • deine letzte Datei mit der höchsten Nummer oben direkt danach steht

    Vielleicht wird's so noch übersichtlicher ? ;-)

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #18 am: 12. Oktober 2013, 19:38:06
    ...
    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

    Wer die Bestellbeschreibung einbauen möchte muß außer dem von piru genannten noch in der class xtcExport das hier machen:
    Code: PHP  [Auswählen]
    $lang_data = xtc_db_fetch_array($lang_query);
                    $lang_data['products_description'] = str_replace("\n", "", $lang_data['products_description']);
                    $lang_data['products_short_description'] = str_replace("\n", "", $lang_data['products_short_description']);
                    $lang_data['products_order_description'] = str_replace("\n", "", $lang_data['products_order_description']); //added order description, noRiddle
                    $lang_data['products_description'] = str_replace("\r", "", $lang_data['products_description']);
                    $lang_data['products_short_description'] = str_replace("\r", "", $lang_data['products_short_description']);
                    $lang_data['products_order_description'] = str_replace("\r", "", $lang_data['products_order_description']); //added order description, noRiddle
                    $lang_data['products_description'] = str_replace(chr(13), "", $lang_data['products_description']);
                    $lang_data['products_short_description'] = str_replace(chr(13), "", $lang_data['products_short_description']);
                    $lang_data['products_order_description'] = str_replace(chr(13), "", $lang_data['products_order_description']); //added order description, noRiddle
                    $line .= $this->encode(stripslashes($lang_data['products_name']));
                    $line .= $this->encode(stripslashes($lang_data['products_description']));
                    $line .= $this->encode(stripslashes($lang_data['products_short_description']));
                    $line .= $this->encode(stripslashes($lang_data['products_order_description'])); //added order description, noRiddle
                    $line .= $this->encode(stripslashes($lang_data['products_meta_title']));
                    $line .= $this->encode(stripslashes($lang_data['products_meta_description']));
                    $line .= $this->encode(stripslashes($lang_data['products_meta_keywords']));
                    $line .= $this->encode(stripslashes($lang_data['products_keywords']));
                    $line .= $this->encode($lang_data['products_url']);

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #19 am: 14. Oktober 2013, 11:42:13
    Damit wird umgekehrt alpha-numerisch sortiert, was bedeutet, daß
    • index.html immer als erstes steht und
    • deine letzte Datei mit der höchsten Nummer oben direkt danach steht

    Vielleicht wird's so noch übersichtlicher ? ;-)

    Si, perfekt!  :thumbs: Danke!

    Gruß piru

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #20 am: 05. November 2013, 11:42:13
    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.

    Hallo,
    was könnte das (schlecht) verursachen? Wenn ich selber meine CSV-Datei erstelle, habe ich kein Risiko die addslashes zu entfernen? Ich frage so doof weil ich nicht verstehe wofür überhaut da sind...

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #21 am: 05. November 2013, 12:02:43
    Buenos dias piru.
    addslashes() "escaped" den String der damit versehen wurde.
    Das heißt macht gefährliche Zeichen unschädlich, wobei gefährliche Zeichen solche sind mit deren Hilfe man als Außenstehender SQL-Hacks durchführen könnte.

    Nein, theoretisch wäre es nicht schlimm das zu entfernen wenn du deine CSVs selbst erstellst.
    Es gibt aber zwei Gründe es nicht zu tun:
    • Muß es für alle passen in der Software und es gibt genügend User die ihre CSVs von Herstellern bekommen, evtl. auch weniger vertrauenswürdigen (z.B. aus China, ohne Chinesen jetzt pauschal zu beschuldigen)
      und
    • sollte alles was in die DB geschrieben wird gesichert sein weil es theoretisch auch sein könnte, daß z.B. die Import-Funktion gehackt würde und mit der Absicherung dann nicht so ohne weiteres Schaden angerichtet werden könnte.

    Ich hatte doch eine überarbeitete Import-Klasse hier eingestellt welche die shop-eigenen Funktionen benutzt wie xtc_db_input() und xtc_db_prepare_input(), die muß doch laufen.

    Hier im Anhang nochmal eine neue Version inkl. der Bestellbeschreibung.
    Es wird, auch mit Rücksprache mit web28 empfohlen keine Texterkennungszeichen zu verwenden und als Trennzeichen den TAB.
    Im Backend muß bei "Einstellungen" dafür nichts eingetragen werden da dann per default TABs benutzt werden.

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #22 am: 05. November 2013, 12:12:44
    Buenos días noRiddle,

    ich benutze sowieso deine import.php Datei, ich wollte nur verstehen warum, jetzt hast du es mir super erklärt, danke  :pro:

    Bei der Einstellungen benutze ich aber als Texterkennungszeichen " und als Trennzeichen ;
    Sollte ich das in der Zukunft ändern oder es ist nur eine Empfehlung wegen etwas anderes?

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #23 am: 05. November 2013, 12:42:50
    Es gibt ohne Texterkennungszeichen am wenigsten Probleme wenn das verwendete Zeichen auch in den importierten Texten vorkommt, was ja bei " meist der Fall ist.
    So muß man auch bei der Erstellung der CSVs auf nichts achten
    (man kann ja z.B. mit OpenOffice auch ohne Texterkennunsgzeichen in CSV exportieren, mit MS Excel dürfte es genauso sein).

    Das gleiche gilt im Prinzip auch für das Trennzeichen TAB (also nichts eintragen weil per default TAB (= \t) benutzt wird).

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #24 am: 14. November 2013, 12:58:56
    Hallo noRiddle,

    es gibt ein (kleines) Problem.
    Die EAN Code wird nicht richtig importiert, egal welche EAN Code in der Tabelle steht, wird 2147483647 in dem Feld importiert.
    In deiner Datei import.php, Zeile 390, steht:
    Code: PHP  [Auswählen]
    $products_array = array_merge($products_array, array ('products_ean' => (int)$dataArray['p_ean']));
    Wenn ich wie in der original Datei wie folgt ändere:
    Code: PHP  [Auswählen]
    $products_array = array_merge($products_array, array ('products_ean' => $dataArray['p_ean']));
    funktioniert wieder.

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #25 am: 14. November 2013, 15:11:20
    Upps, danke für den Hinweis.
    Vor lauter Schützen des Inputs ist mir das wohl durchgegangen.

    Wer den Eintrag trotzdem schützen möchte kann das so amchen:
    Code: PHP  [Auswählen]
    $products_array = array_merge($products_array, array ('products_ean' => (preg_match('#[0-9a-z]#i') ? $dataArray['p_ean'] : '')));

    Damit wären Zahlen und Buchstaben (unabhängig ob Groß-oder Kleinbuchstaben) erlaubt.
    Man kann das Suchmuster noch erweitern mit Unter- und Bindestrichen oder was sonst so an Zeichen benötigt wird.
    Z.B.:
    Code: PHP  [Auswählen]
    $products_array = array_merge($products_array, array ('products_ean' => (preg_match('#[0-9a-z-_]#i') ? $dataArray['p_ean'] : '')));

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #26 am: 14. November 2013, 15:20:23
    Ich habe es getestet aber kommt einen Fehler (oder habe ich etwas falsch gemacht?):

    Zitat
    Warning: preg_match() expects at least 2 parameters, 1 given in /homepages/30/d119xxxxx/htdocs/shoptest/admin/includes/classes/import.php on line 390

    Code: PHP  [Auswählen]
    if ($this->FileSheme['p_ean'] == 'Y')
                    $products_array = array_merge($products_array, array ('products_ean' => (preg_match('#[0-9a-z]#i') ? $dataArray['p_ean'] : '')));

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #27 am: 14. November 2013, 15:53:42
    Uiuiui, bin anscheinend noch nicht wach  :oops:
    So muß es aussehen.
    Code: PHP  [Auswählen]
        $products_array = array_merge($products_array, array ('products_ean' => (preg_match('#[0-9a-z]#i', $dataArray['p_ean']) ? $dataArray['p_ean'] : '')));

    Sorry.

    Gruß,
    noRiddle

    piru

    • Fördermitglied
    • Beiträge: 1.263
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #28 am: 14. November 2013, 16:01:31
    Uiuiui, bin anscheinend noch nicht wach  :oops:

    Das ist kein Wunder, wenn du noch um 3:30 Uhr morgens am PC sitzt  ;-)

    Jetzt funktioniert perfekt, muchas gracias!

    Gruß piru

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: Sonderzeichen im Import per CSV
    Antwort #29 am: 14. November 2013, 16:09:45
    Das ist kein Wunder, wenn du noch um 3:30 Uhr morgens am PC sitzt  ;-)

    Nöö, ich hatte schon geschlafen und bin aufgewacht..., war allerdings im Bürostuhl der Schlaf  :hust:
    :-D

    Gruß,
    noRiddle
    28 Antworten
    12936 Aufrufe
    26. November 2010, 19:57:29 von JeLe0310
    2 Antworten
    2386 Aufrufe
    02. Februar 2016, 16:06:17 von ssdshop
    9 Antworten
    6920 Aufrufe
    23. Januar 2010, 10:14:42 von holger