Wie arbeite ich mit meiner Shopware-Datenbank?

Wie arbeite ich mit meiner Shopware-Datenbank?

Daniel Wolf 25. März 2018 0

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


Hol dir unseren kostenlosen Shopware E-Mail-Kurs:

Lerne wie du deinen eigenen Shopware 5 
Shop erstellst und verwaltest

Noch keine Kommentare vorhanden.

Was denkst du?

8mylez Community

SHOPWARE

FORUM

shopware tutorial ebook mockup

Werde Teil einer einzigartigen Wissensdatenbank!

Zum 8mylez Shopware Forum

Das Shopware eBook für Einsteiger!

shopware tutorial ebook mockup
Ausführliche Schritt für Schritt Anleitungen, Tipps & Tricks für alle, die gerne am eigenen Shopware Shop basteln.
Jetzt kaufen

Hol dir 

wertvolle Tipps 
für deinen
Shopware Shop

Wir zeigen dir, wie du deinen
Shopware 5 Shop optimieren
kannst.


Trage einfach deine
E-Mail Adresse ein:

Beliebt

Was du über die Shopware 5 Theme Struktur wissen musst und wie du ein eigenes Template erstellst
Logo Größe anpassen mit Less für Shopware 5
Theme: Eigenes Listing Layout erstellen
Theme Entwicklung: Hugo Boss Header zum Selbermachen
Plugin Theme anpassen
Shopware Shop DSGVO konform gestalten - Alles auf einen Blick
Vorsicht Shopware Update! Was du beim Updaten beachten musst
Staging Umgebung – Was ist das und warum brauchst du eine?
Shopware Logo aus dem Footer entfernen
Die größten Fehler bei der Entwicklung eines Shopware 5 Themes
© 2017 by 8mylez. Powered by Goltfisch GmbH.