Migration von Prestashop - Probleme beim Kundenimport - SQL syntax near '@gmx.de)'

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!

 

 

1 „Gefällt mir“

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.

 

 

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!!

 

 

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/