Die Datenbank ist ein wichtiger Bestandteil jedes Shops, denn in ihr werden fast alle Informationen abgespeichert. Soweit so gut, aber wie genau benutze ich meine Datenbank jetzt?
Diese oder ähnliche Fragen habt Ihr Euch das ein oder andere Mal bestimmt auch gestellt. Um nun etwas Licht ins Dunkel zu bringen, zeige ich Euch, wie Ihr mit der Datenbank Eures Shops arbeiten könnt. Im Folgenden wäre es nützlich, wenn Ihr bereits etwas Erfahrung mit PHP und SQL habt.
Fangen wir mit einem leichten, aber auch sehr wichtigem Thema an. Für diesen Schritt benötigt Ihr lediglich einen SSH-Zugang, mit dem Ihr Euch jetzt mit Eurem Server verbindet. Nun exportiert Ihr die Datenbank mit diesem Befehl:
mysqldump -u username -h host_address -p database_name > Name_des_Backups.sql
'username', 'host_address' und 'database_name' ersetzt Ihr dabei mit dem Benutzer, dem Host und dem Namen der Datenbank. Bei mir sieht das so aus:
mysqldump -u c1w8db2 -h localhost -p c1w8db2 > db_backup_25_03_2018.sql
Wenn Ihr diesen Befehl ausführt, müsst Ihr nur noch Eurer Passwort eingeben und bestätigen. Danach wird das Backup erstellt. Die Backup-Datei sollte möglichst nicht in dem root-Verzeichnis Eures Shops liegen, da unter Umständen Dritte Euer Backup herunterladen könnten und somit Eure Kundendaten erhalten würden.
Stellt Euch vor, Ihr hättet das Passwort des Datenbank-Benutzers geändert oder möchtet eine andere Datenbank für Euren Shopware Shop benutzen und wollt nun die Zugangsdaten zur Datenbank in Eurem Shop ändern. Dazu braucht Ihr ein FTP-Programm und FTP-Zugangsdaten. Falls Ihr die gerade nicht parat habt, könnt Ihr auch alternativ Eure SSH-Daten benutzen.
Nachdem Ihr Euch über das FTP-Programm mit Eurem Server verbunden habt, geht Ihr in das root-Verzeichnis Eures Shops und öffnet dort die config.php.
Hier finden wir folgenden Abschnitt:
'db' =>
array (
'host' => 'localhost',
'port' => '3306',
'username' => 'c1w8db1',
'password' => 'jmhZQ1!1',
'dbname' => 'c1w8db1',
)
In dem Array 'db' könnt Ihr z. B. den Benutzernamen, das Passwort oder den Datenbanknamen anpassen und die Datei speichern.
Shopware arbeitet mit dem PDO-Objekt (PHP Data Objects). Das klingt zwar erstmal kompliziert, bedeutet aber eigentlich nur, dass dieses Objekt als Schnittstelle für Datenzugriffe in Eurem Plugin verwendet werden kann.
Im folgenden Beispiel benutzten wir die DBAL-Connection, die mit dem PDO-Objekt arbeitet. Schauen wir uns einfach mal folgendes Beispiel an:
Zunächst holen wir uns das Objekt der DBAL-Connection.
$connection = $this->container->get('dbal_connection');
Über diese können wir dann folgenden Code ausführen.
$sql = 'SELECT name FROM s_articles WHERE id=1';
$result = $connection->query($sql)->fetch();
echo $result['name'];
// Ergebnis ist bei mir 'VENOM VARIO S'
Zunächst speichern wir einen SQL-Query in der Variable $sql, welcher uns den Namen des Artikels mit der id 1 liefert. Danach führen wir über die DBAL-Connection die Methode 'query' aus und übergeben $sql als Parameter. Abschließend speichern wir die Ergebnisse über die Methode 'fetch' in der Variable $result.
Klar! Hierfür schauen wir uns die sogenannten Prepared Statements an. Diese sind im Grunde vorgefertigte queries, in der wir dann seperat Variabeln einfügen können. Bauen wir das obige Beispiel doch mal mit statements auf:
$sql = 'SELECT name FROM s_articles WHERE id= :articleId';
$statement = $connection->prepare($sql);
$statement->execute(['articleId' => 1]);
$result = $stmt->fetch();
echo $result['name'];
// Ergebnis ist bei mir 'VENOM VARIO S'
Folgendes haben wir nun verändert: In dem SQL-Query steht anstelle der 1 jetzt ein :articleId, welcher der Platzhalter für die execute-Methode ist. Den Platzhalter könnt Ihr so nennen, wie Ihr wollt, achtet allerdings auf den Doppelpunkt vor dem Namen.
Die Instanz des Statement-Objektes rufen wir über die DBAL-Connection mit der Methode 'prepare' auf und übergeben als Argument den SQL-Query. Das ganze speichern wir in der Variable $statement.
Jetzt kommt der Teil in dem die Magie passiert: Wir führen das statement mit der execute-Methode aus und übergeben als Parameter ein Array. In diesem ist unserem Platzhalter aus dem SQL-Query als Schlüssel ein Wert hinterlegt.
Über die fetch-Methode können wir dann wie gewohnt das Ergebnis in der $result-Variable speichern. Um auf die Überschrift zurückzukommen, kann man nun anstelle der 1 eine Variable hinterlegen, in der die id gespeichert ist:
$statement->execute(['articleId' => $articleId]);
Da Du bisher gut aufgepasst hast, ist Dir sicherlich aufgefallen, dass das Ändern der Daten ziemlich ähnlich wie das Lesen der Daten funktioniert. Wir müssen nämlich nur den SQL-Querry anpassen:
$sql = 'UPDATE s_articles SET name = :articleName WHERE id= :articleId';
$statement = $connection->prepare($sql);
$statement->execute([
'articleName' => 'Der beste Artikelnamme der Welt',
'articleId' => 1
]);
Mit diesem Update-Querry ändern wir den Artikelnamen des Artikels mit der id 1 zu 'Der beste Artikelnamme der Welt'. Wenn wir uns den Artikel danach z. B. im Frontend anschauen, sehen wir, dass der Artikelname wie erwartet geändert wurde.
Wenn Ihr mit komplexeren Abfragen arbeitet, macht es in einigen Fällen Sinn den Query-Builder zu benutzen.
$connection = $this->container->get('dbal_connection');
$builder = $connection->createQueryBuilder();
$builder
->select('details.ordernumber')
->from('s_articles', 'articles')
->innerJoin(
'articles',
's_articles_details',
'details',
'details.articleID = articles.id'
)
->where('articles.name = "VENOM VARIO S"');
$result = $builder->execute()->fetch();
echo $result['ordernumber'];
// Ergebnis ist bei mir 'SW10001';
Der Query-Builder sieht auf den ersten Blick vielleicht etwas furchteinflößend aus, ich verspreche Euch aber, dass er mehr Angst vor Euch hat, als Ihr vor ihm ;)
In der Variable $builder speichern wir die Instanz des Builders, die wir über die Methode 'createQueryBulder' aufrufen. Der SQL-Query wird dann stückweise aufgebaut, indem man mehrere Methoden über der Instanz aufruft. Übersetzt passiert folgendes: Hol mir die Artikelnummer des Artikels mit dem Namen ''VENOM VARIO S". In der $result Variable führen wir den Query-Builder aus und speichern und das Ergebnis.
Alles zum Query-Builder könnt Ihr Euch hier nochmal durchlesen.
Unsere Standorte
Zentrale
Technologiepark 23
33100 Paderborn
Leipzig
Bernhardstraße 34
04315 Leipzig
Kontakt
E-Mail: support@8mylez.com
Telefon: +49 (0) 5251 284 710
Shopware Dienstleistungen
Über 8mylez
✓ 38 Mitarbeiter
✓ Shopware Gold Partner
✓ 40.000+ Plugin Downloads
✓ 160+ betreute Shops
✓ Full-Service Shopware Agentur
✓ 70 Shopware Videos auf Youtube
✓ Alle Shopware Zertifizierungen
Social
Alexander Fabian
vielen Dank für die Einführung in die Datenbank von Shopware.
Mein Interesse gilt einem individuellen Daten Export für unsere Spedition.
Die Spedition hat leider keine Shopware Anbindung. Nur einen CSV Import.
Da ich über die integrierte Shopware import/export kein Erfolg hatte, habe ich mir gedacht das ich mir eine eigene Abfrage über php erstelle.
Da ich bisher nur Abfragen aus einer Tabelle erstellt habe (auf einem lokalen Server) stoße ich jetzt an ein paar grenzen.
Mein Gedanke wäre Anhand der Bestellnummer alle geforderten Daten für die Spedition zu exportieren.
Vielleicht wäre der Grundgedanke mal ein Input für ein neues Tutorial.
VG
Alexander
Daniel Wolf
vielen Dank für Deinen Input :)
Wir behalten den Vorschlag für das nächste Tutorial im Hinterkopf!
Herzliche Grüße
Daniel
Was denkst du?