Wie arbeite ich mit meiner Shopware Datenbank?

Wie arbeite ich mit meiner Shopware Datenbank?

Daniel Wolf 25. März 2018 2

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?


Einführung

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.


Datenbank-Backup anlegen

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.


Zugriff auf die Datenbank ändern

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.


Daten aus der Datenbank lesen

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'


Schön und gut, aber was genau macht dieser Code eigentlich?

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.


Kann ich in dem SQL-Query auch Variabeln einbinden?

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.


So führst Du Satements aus

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]);


Wie kann ich nun Daten aus der Datenbank ändern?

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.


Für alle, die es bisher viel zu leicht fanden

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 furcht­ein­flö­ßend aus, ich verspreche Euch aber, dass er mehr Angst vor Euch hat, als Ihr vor ihm ;)


Wie funktioniert der Query-Builder?

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.


2 Kommentare

  • Hallo Daniel,

    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
  • Hey Alexander,

    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?

Beliebt

Was du über die Shopware 5 Theme Struktur wissen musst und wie du ein eigenes Template erstellst
Social Media Icon mit Link im Footer
Shopware Theme: Eigenes Listing Layout erstellen
Logo Größe mit Less für Shopware 5 anpassen
Die größten Fehler bei der Entwicklung eines Shopware 5 Themes

Sicher Dir die besten Shopware 6
Tipps & Tricks

Trag Dich ein und Du erhältst unser Shopware 6 Whitepaper kostenlos!
Trag dich für unseren Newsletter an, im Anschluss erhältst Du das Whitepaper. 

Mit dem Abschicken Deiner Daten akzeptierst Du unsere Datenschutzerklärung.

Entdecke unsere ebooks

Unsere Standorte

Zentrale 

Technologiepark 23
33100 Paderborn


Leipzig
Bernhardstraße 34
04315 Leipzig

Kontakt

Ü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


Unsere Partner
© 2023 by 8mylez GmbH //  Impressum + Datenschutz