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: import.php und Sonderzeichen

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    am: 31. Juli 2010, 14:27:47
    Moin,

    da es beim Import bzw. beim Update von Produkten immer Probleme mit den Sonderzeichen gibt, wollte ich mich der Angelegenheit mal annehmen um den Artikelimport etwas mehr zu automatisieren.

    Problemstellung:

    Sonderzeichen wie " (Anführungszeichen, die z.B. bei der Maßeinheit Zoll benötigt werden) und ' (Hochkommas, z.B. in englischen Produktbeschreibungen "Peter's"), wird beim Import ein Backslash vorangestellt.

    Das sieht dann so aus:

    Peter\'s oder \"Testartikel\"

    Natürlich kann man das verhindern, wenn man in der Import-Datei vorab alle Sonderzeichen durch die entsprechenden entities (Html-Zeichen) ersetzt, aber das ist ein Arbeitsschritt, denn ich mir gerne sparen würde.
    Alternativ kann man nach dem Import die Sonderzeichen auch direkt in der Datenbank ändern, aber auch dass ist in meinen Augen keine vernünftige Lösung.

    Lösungsansatz:
    Vorab habe ich mich für ein anderes, kostenloses Importmodul entschieden: Modul Erweiterter Im/Export 2.0 von Estelco

    Dieses Modul bietet optional die Möglichkeit Kategorien und Zuordnungen zu ex- und importieren.
    Leider besteht bzgl. der Sonderzeichen kein Unterschied zur standard import.php.

    In der /admin/inludes/classes/import.php müßten, php Kenntnise vorausgesetzt (... die ich leider nicht habe), wohl die Sonderzeichen umgewandelt werden, bzw. die Backslashes mit dem Befehl stripslashes entfernt werden.

    Leider habe ich es auch nach vielen Versuchen nicht geschaft einen funktionsfähigen Code zu erzeugen.

    Sofern sich damit jemand auskennt, würde ich mich über ein wenig Unterstützung freuen.



    Linkback: https://www.modified-shop.org/forum/index.php?topic=7024.0
    Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie modernen Templates für die modified eCommerce Shopsoftware

    zub

    • Schreiberling
    • Beiträge: 401
    import.php und Sonderzeichen
    Antwort #1 am: 31. Juli 2010, 18:11:18
    @ 0815
    schau Dir doch mal in der /admin/includes/modules/export/ z.B.: die idealo.php
    ab ca. Zeile 628

    eventuell findest Du da einen Lösungsansatz

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #2 am: 02. August 2010, 07:47:41
    Hab' mir die "idealo.php" mal angesehen und dann folgenden Code für die "import.php" erstellt:

    Code: PHP  [Auswählen]
                                    $lang_data['products_description'] = str_replace("\t","",$lang_data['products_description']);
                    $lang_data['products_short_description'] = str_replace("\t","",$lang_data['products_short_description']);
                    $lang_data['products_name'] = str_replace("\t","",$lang_data['products_name']);
    Leider wird den Anführungszeichen nach wie vor ein backslash vorangestellt!?

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #3 am: 02. August 2010, 08:57:55
    Habe eben noch diesen Beitrag gefunden, aber auch daran scheint es nicht zu liegen: Wieso wird aus " plötzlich \" und wie geht das wieder weg?

    und folgende Codezeile funktioniert leider auch nicht:

    Code: PHP  [Auswählen]
    $lang_data['products_description'] = stripslashes($lang_data['products_description']);

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #4 am: 02. August 2010, 11:59:06
    Na toll!

    Hier gab es wohl eine Lösung: Anführungszeichen beim Import

    Zitat
    Das ist ein Fehler im import-Modul. Angehängt eine modifizierte import.php (als zip-Archiv) aus dem Supportforum ...

    Hat hier aus dem Forum ggf. jemand Zugriff auf das kostenpflichtige xt:Commerce Support-Forum?

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #5 am: 02. August 2010, 12:14:59
    Juhu!

    Ich glaub', ich hab's endlich gefunden.

    in der /admin/includes/classes/import.php suchen nach:

    Code: PHP  [Auswählen]
    if ($touchCat) $this->insertCategory($dataArray, $mode, $products_id);
            for ($i_insert = 0; $i_insert <sizeof($this->languages); $i_insert ++) {
                $prod_desc_array = array ('products_id' => $products_id, 'language_id' => $this->languages[$i_insert]['id']);

                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']])));
                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']])));
    und ersetzen durch:

    Code: PHP  [Auswählen]
    if ($touchCat) $this->insertCategory($dataArray, $mode, $products_id);
            for ($i_insert = 0; $i_insert <sizeof($this->languages); $i_insert ++) {
                $prod_desc_array = array ('products_id' => $products_id, 'language_id' => $this->languages[$i_insert]['id']);

                if ($this->FileSheme['p_name.'.$this->languages[$i_insert]['code']] == 'Y')
                $prod_desc_array = array_merge($prod_desc_array, array ('products_name' => stripslashes($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' => stripslashes($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' => stripslashes($dataArray['p_shortdesc.'.$this->languages[$i_insert]['code']])));
    Also addslashes in stripslashes ändern.

    Danach kann man dann in der Artikelbeschreibung, der Kurzbeschreibung, sowie im Titel Sonderzeichen wie z.B. Anführungszeichen, Hochkommas, ©, etc. verwenden.

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    import.php und Sonderzeichen
    Antwort #6 am: 02. August 2010, 12:25:53
    Danke für den Bugfix. ;-)

    Grüße

    Torsten

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #7 am: 02. August 2010, 12:37:57
    Gern :-)

    ... aber bitte auch mal testen, nicht, dass die Änderung an einer anderen Stelle zu Problemen führt.

    Ich konnte zwar bisher noch keine Nachteile feststellen, aber man weiß ja nie. ;-)

    web28

    • modified Team
    • Beiträge: 9.404
    import.php und Sonderzeichen
    Antwort #8 am: 02. August 2010, 16:21:49
    @0815:

    Beide Import Tools beachten leider nicht diese Dinge:

    magic_quotes_gpc On

    Die PHP-Direktive magic_quotes_gpc hat standardmäßig den Wert on, so dass grundsätzlich die Funktion addslashes() auf alle GET-, POST- und COOKIE-Daten angewendet wird.

    magic_quotes_runtime On

    Falls magic_quotes_runtime aktiviert ist, werden die meisten Funktionen die Daten von einer beliebigen externen Quelle zurückgeben, inklusive Datenbanken und Textdateien, die in den Daten enthaltenen Anführungszeichen mit einem Backslash geschützt zurückgeben.

    Beim Import muss also bei magic_quotes_runtime =on erst stripslashes angewendet werden und dann mysql_real_escape_string (besser als addslashes)
    Bei magic_quotes_runtime =OFF nur mysql_real_escape_string

    Poste bitte mal Deine Servereinstellung für magic_quotes_runtime

    Gruss Web28

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #9 am: 02. August 2010, 16:36:04
    Angaben aus der php.ini
    Zitat
    ; Magic quotes for incoming GET/POST/Cookie data.
    magic_quotes_gpc = On

    ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
    magic_quotes_runtime = Off

    ; Use Sybase-style magic quotes (escape ' with '' instead of \').
    magic_quotes_sybase = Off
    Hatte auch versuchsweise den Wert für magic_quotes_gpc auf off, das hatte alerdings keine Veränderung gebracht.

    web28

    • modified Team
    • Beiträge: 9.404
    import.php und Sonderzeichen
    Antwort #10 am: 02. August 2010, 16:57:00
    Auf jeden Fall werden bei Dir die Hochkommata escaped, sonst würde es beim Import auch eine Fehlermeldung geben.
    Mit addslashes werden sie dann doppelt maskiert.

    Was steht denn bei den Einträgen unter Server Info im Admin?

    Bei meinem Testshop auf XAMPP ist:
    Zitat
    magic_quotes_gpc = On
    magic_quotes_runtime = Off
    mit diesen Einstellungen muss ich beim Import escapen.

    Gruss Web28

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #11 am: 02. August 2010, 18:07:48
    Server-info:
    Zitat
    magic_quotes_gpc On
    magic_quotes_runtime Off
    magic_quotes_sybase Off
    Also mit den von mir genannten Änderungen in der import.php läuft jetzt alles einwandfrei.

    Ich kann nun wie gesagt an allen Stellen (Titel, Beschreibung und Kurzbeschreibung) folgende Sonderzeichen verwenden:
    Zitat
    ; Semikolon
    © copyright
    ® registered
    " Anführungszeichen
    ' Hochkomma (shift+Raute)
    ...
    Diese Zeichen werden ohne vorangestellten Backslash in die Datenbank geschrieben und sowohl im Back- als auch im Frontend einwandfrei angezeigt.

    Bei den Importeinstellungen lasse ich das Eingabefeld für das Texterkennungszeichen einfach leer und als Trennzeichen verwende ich | (Pipe).

    Fehlermeldungen erhalte ich keine und alles läuft wie gewünscht. :-)

    web28

    • modified Team
    • Beiträge: 9.404
    import.php und Sonderzeichen
    Antwort #12 am: 02. August 2010, 18:56:11
    Ok, mit addslashes wird tatsächlich doppelt escaped, da in xtc_db_perform xtc_db_input aufgerufen wird, und hier wird dann letztendlich mit addslashes escaped.

    Deine Änderung mit stripslashes ist also falsch, es reicht aus addslashes zu entfernen. ;)

    Es gibt noch ein paar Stellen, wo addslashes falsch ist (aber nicht alle!)

    Gruss Web28

    0815

    • Viel Schreiber
    • Beiträge: 905
    import.php und Sonderzeichen
    Antwort #13 am: 02. August 2010, 20:29:56
    [...] Deine Änderung mit stripslashes ist also falsch, [...]

    Es funktioniert auch mit meiner falschen Lösung, aber ich würd's natürlich gerne richtig machen.

    Kannst Du vielleicht 'ne kurze Anleitung zur Verfügung stellen und die entsprechenden Stellen nennen?

    ... ich hab' leider so gut wie gar keine Ahnung von php.

    web28

    • modified Team
    • Beiträge: 9.404
    import.php und Sonderzeichen
    Antwort #14 am: 03. August 2010, 08:49:48
    Teste bitte mit dieser Datei

    29 Antworten
    15521 Aufrufe
    14. November 2013, 16:09:45 von noRiddle (revilonetz)
    2 Antworten
    2386 Aufrufe
    02. Februar 2016, 16:06:17 von ssdshop
    9 Antworten
    6930 Aufrufe
    23. Januar 2010, 10:14:42 von holger
               
    anything