chishopchishop MitgliedKommentare: 1 Danke erhalten: 0 Mitglied seit: November 2016 bearbeitet November 2016

Hallo zusammen,

 

ich habe gerade einen lokalen Test-Shop aufgesetzt, um das Migrations-Plugin auszuprobieren. Shopware gefällt mir soweit gut, macht alles einen tollen Eindruck, aber ich muss die Daten irgendwie automatisiert rüber kriegen. Beim Import der Kundendaten hat er ein Problem:

 

Beim Importieren der Kunden ist ein Fehler aufgetreten

Code : 42000
Line : 234
File : ......shopware529/engine/Library/Zend/Db/Statement/Pdo.php

Error : SQLSTATE[42000]: Syntax error or access violation: 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 '@gmx.de)' at line 2

Trace : 
#0 shopware529/engine/Library/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array) 
#1 shopware529/engine/Library/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array) 
#2 shopware529/engine/Library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO s_c...', Array) #
#3 shopware529/engine/Library/Enlight/Components/Db/Adapter/Pdo/Mysql.php(96): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO s_c...', Array) 
#4 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/CustomerImporter.php(787): Enlight_Components_Db_Adapter_Pdo_Mysql->query('INSERT INTO s_c...') 
#5 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/CustomerImporter.php(293): Shopware\SwagMigration\Components\DbServices\Import\CustomerImporter->newsletterSubscribe(Array) 
#6 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/DbServices/Import/Import.php(229): Shopware\SwagMigration\Components\DbServices\Import\CustomerImporter->import(Array) 
#7 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/Migration/Import/Resource/Customer.php(165): Shopware\SwagMigration\Components\DbServices\Import\Import->customer(Array) 
#8 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Components/Migration/Import/Resource/Customer.php(77): Shopware\SwagMigration\Components\Migration\Import\Resource\Customer->migrateCustomer(Array, Object(Shopware\SwagMigration\Components\DbServices\Import\Import), '...') 
#9 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Controllers/Backend/SwagMigration.php(465): Shopware\SwagMigration\Components\Migration\Import\Resource\Customer->run() 
#10 shopware529/engine/Shopware/Plugins/Community/Backend/SwagMigration/Controllers/Backend/SwagMigration.php(502): Shopware_Controllers_Backend_SwagMigration->runImport('import_customer...') 
#11 shopware529/engine/Library/Enlight/Controller/Action.php(159): Shopware_Controllers_Backend_SwagMigration->importAction() 
#12 shopware529/engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch('importAction') 
#13 shopware529/engine/Library/Enlight/Controller/Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp)) 
#14 shopware529/engine/Shopware/Kernel.php(177): Enlight_Controller_Front->dispatch() 
#15 shopware529/vendor/symfony/http-kernel/HttpCache/HttpCache.php(487): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) 
#16 shopware529/engine/Shopware/Components/HttpCache/AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL) 
#17 shopware529/vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true) 
#18 shopware529/engine/Shopware/Components/HttpCache/AppCache.php(103): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true) 
#19 shopware529/shopware.php(113): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request)) 
#20 {main}

OK

 

Weiß jemand woran das liegen könnte? Wir haben ca. sechs tausend Kundendatensätze mit teilweise doppelten Datensätzen, weil sich manche Kunden über die Jahre mehrfach registriert haben. Welche Probleme könnte es noch geben und wie kann ich das lösen?

 

Danke!

 

 

Antworten

  • chishopchishop MitgliedKommentare: 1 Danke erhalten: 0 bearbeitet November 2016 Mitglied seit: November 2016

    Interessanterweise läuft der Import durch eine Anpassung in der Datei "CustomerImporter.php" in der im Trace referenzierten Funktion "newsletterSubscribe" (Zeile 787) durch:

    if (empty($result)) {
        #$sql = "INSERT INTO s_campaigns_mailaddresses (customer, groupID, email)
        #        VALUES (1, {$customer['newslettergroupID']}, {$customer['email']});";
        $sql = 'INSERT INTO s_campaigns_mailaddresses (customer, groupID, email)
                VALUES (1, ' . $customer['newslettergroupID']. ', '' . $customer['email'] . '');';
        $this->db->query($sql);

    (Änderung: Ergänzung von extra ' um die Email Adresse als Variablenzugriff für die Generierung des SQL)

     

    Kann aber nicht sagen, ob wirklich alles durchlief, es kam keine Erfolgsmeldung, sondern ein Hinweis, dass der Import ohne entsprechende Antwort fertiggestellt wurde. Man soll aber die max_execution_time erhöhen.

     

     

  • Stephan_GrassStephan_Grass MitgliedKommentare: 26 Danke erhalten: 2 bearbeitet Februar 2017 Mitglied seit: Februar 2017

    In der Function newsletterSubscribe in CustomerImporter.php muss

    $sql = "INSERT INTO s_campaigns_mailaddresses (customer, groupID, email)
        	VALUES (1, {$customer['newslettergroupID']}, {$customer['email']});";

    durch

    
    $sql = 'INSERT INTO s_campaigns_mailaddresses (customer, groupID, email)
            VALUES (1, ' . $customer['newslettergroupID'] . ',"' . $customer['email'] . '");';

    ersetzt werden!!

     

     

  • wnboeswnboes MitgliedKommentare: 7 Danke erhalten: 0 Mitglied seit: Februar 2017

    Generell finde ich SQL mit Quoting besser:

    /**
     * @param array $customer
     * @return array
     */
    private function newsletterSubscribe(array $customer)
    {
        if (!isset($customer['newsletter'])) {
            return $customer;
        }
    
        if (empty($customer['newsletter'])) {
            $sql = 'DELETE FROM s_campaigns_mailaddresses
                    WHERE email = ?';
            $this->db->query($sql, [$customer['email']]);
        } else {
            $customer['newslettergroupID'] = $this->getNewsletterGroupId($customer['newslettergroupID']);
    
            $sql = 'SELECT id
                    FROM s_campaigns_mailaddresses
                    WHERE email = ?';
            $result = $this->db->fetchOne($sql, [$customer['email']]);
            if (empty($result)) {
                $sql = "INSERT INTO s_campaigns_mailaddresses (customer, groupID, email)
                        VALUES (?, ?, ?);";
                $this->db->query($sql, [1, $customer['newslettergroupID'], $customer['email']]);
            }
        }
    
        return $customer;
    }

    https://xkcd.com/327/

Anmelden oder Registrieren, um zu kommentieren.