# Shopware Plugin verbinden mit Datenbank

**URL:** <https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199>\
**Category:** Programmierung\
**Created:** [31. Juli 2017 um 14:43 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199 "2017-07-31T14:43:32Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [31. Juli 2017 um 14:43 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/1 "2017-07-31T14:43:32Z")

</div>

Hallo Community,

Ich hab ein einfaches Problem, aber anscheinend gibt es dazu noch keinen Forenbeitrag.

Ich möchte einfach nur innerhalb von einem Shopwareplugin mit der Datenbank connecten. Ich hab die normale Syntax von PHP und SQLi benutzt aber irgendwie funktioniert das nicht so wirklich.

&nbsp;

Hier mein Quellcode:

```
subscribeEvent(
                    'Enlight_Controller_Action_PostDispatchSecure_Frontend',
                    'onFrontendPostDispatch',
                    'connectSQL'

            );

        $this->createConfig();

        return true;
    }

    private function createConfig()
    {
        //Configuration in the Plugin Manager goes here

        $form = $this->Form();

        $form->setElement(
            'text',
            'host_cf',
            array(
                'label' => 'Host',
                'value' => 'localhost',
                'description' => 'Type your Host URL in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'user_cf',
            array(
                'label' => 'Username',
                'description' => 'Type your Username in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'password_cf',
            array(
                'label' => 'Password',
                'description' => 'Type your Password in here',
                'required' => true
            )
        );
        $form->setElement(
            'text',
            'db_cf',
            array(
                'label' => 'DB Name',
                'description' => 'Type your Database Name in here',
                'required' => true
            )
        );
    }

    public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
    {
        /** @var \Enlight_Controller_Action $controller */
        $controller = $args->get('subject');
        $view = $controller->View();

        $view->addTemplateDir(
                    __DIR__. '/Views'
            );

    }

    public function connectSQL()
    {
				$con = mysqli_connect($host_cf, $user_cf, $password_cf, $db_cf);
				if (mysqli_connect_errno())
			  {
			  echo "Failed to connect to Database";
			} else {
				echo "Success";
			}
    }
}

```

&nbsp;

Die Problematik ist hauptsächlich, dass ich nicht ganz verstehe, wie ich was abrufe. Ich möchte die Werte aus den textfeldern in der config benutzen als variablen für die mysqli\_connect.

Außerdem verstehe ich trotz mehrfachen Lesen der Documentation nicht wie ich mit der onFrontendDispatch umgehen soll und wofür ich diese benötige.

&nbsp;

Wäre toll, wenn mir da jemand einen kurzen Einblick geben könnte,

Grüße,

Max K.

---

<div class="post-metadata">

**Author:** ![hsoebbing](https://avatars.discourse-cdn.com/v4/letter/h/898d66/32.png) [@hsoebbing](https://forum.shopware.com/u/hsoebbing)\
**Post date:** [31. Juli 2017 um 14:50 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/2 "2017-07-31T14:50:12Z")

</div>

Hi Max,

brauchst Du explizit eine neue DB-Verbindung? Das sollte eigentlich nur der Fall sein wenn Du Dich zu einer anderen Maschine/DB als der die Shopware nutzt verbindest. Und selbst dann solltest Du nicht die Methode mysqli\_connect nutzen (die ist veraltet) sondern PDO ([http://php.net/manual/de/book.pdo.php](http://php.net/manual/de/book.pdo.php)).

Sollte Dir auch eine Verbindung zur DB von Shopware reichen kannst Du Dir einfach das entsprechende Objekt aus dem Dependency Injection Container holen:

```
 /\*\* @var $connection \Doctrine\DBAL\Connection \*/ $connection = $this-\>get('dbal\_connection');

```

Bzgl. onFrontendDispatch: Der Name der Methode ist eigentlich egal, relevant ist der Name des Events auf dass Du Dich registrierst (in Deinem Fall hier “Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend”), das legt fest zu welchem Zeitpunkt innerhalb des Quellcodes von Shopware Dein Code ausgeführt wird.

Ich hoffe das hilft Dir ein wenig weiter!

Hendrik

\*Edit: Typo

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [31. Juli 2017 um 14:56 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/3 "2017-07-31T14:56:52Z")

</div>

Ah okey vielen Dank. Ja ich muss in der Tat nur auf die Shopwaredatenbank zugreifen und möchte diese dann per SQL verändern/auslesen etc.

Eine Frage hätte ich dann aber noch: Gibt es eine Möglichkeit über echo/alert() zu testen, ob diese PDO Verbindung erfolgreich war? Einfach so ne art console.log() für php und im shopware plugin 🙂

---

<div class="post-metadata">

**Author:** ![hsoebbing](https://avatars.discourse-cdn.com/v4/letter/h/898d66/32.png) [@hsoebbing](https://forum.shopware.com/u/hsoebbing)\
**Post date:** [31. Juli 2017 um 15:00 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/4 "2017-07-31T15:00:56Z")

</div>

Die PHP-Pendants zu console.log sind [print\_r](http://php.net/manual/de/function.print-r.php) und [var\_dump](http://php.net/manual/de/function.var-dump.php).

Solltest Du ein sehr großes Objekt oder eines mit Rekursionen (wie bei Doctrine-Objekten) ausgeben wollen benötigst Du den Doctrine-Dump:

```
\Doctrine\Common\Util\Debug::dump($user);
```

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [31. Juli 2017 um 15:46 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/5 "2017-07-31T15:46:59Z")

</div>

Also ich hab jetzt das versucht so wie beschrieben, aber es ist wirklich extrem umständlich sich mit dieser syntax auszukennen, da sowas wie ein

```
CREATE TABLE example

```

sich als extrem kompliziert herausstellt für mich in dieser DBAL library. Ich kenne mich schon in PHP und SQL aus, aber irgendwie finde ich nicht die nötige Dokumentation um mich wirklich sicher fortzubewegen in der Plugin entwicklung. Habe ich vielleicht eine gewisse Dokumentation übersehen, in der das ausführlich erklärt wird wie man mit dieser Library und SQL/phpMyAdming arbeitet?

Das wäre sehr hilfreich

&nbsp;

Grüße,

Max K.

---

<div class="post-metadata">

**Author:** ![simkli](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/simkli/32/13124_2.png) [@simkli](https://forum.shopware.com/u/simkli)\
**Post date:** [31. Juli 2017 um 16:20 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/6 "2017-07-31T16:20:35Z")

</div>

Wenn du umbedingt “plain”-SQL verwenden möchtest, ist das auch mit dem Doctrine DBAL möglich:

```
$stmt = $connection->prepare('CREATE TABLE xxx ....');
$stmt->execute();

```

Wenn du aber mal die Vorteile vom&nbsp;DBAL erkannt hast, möchtest du es nicht mehr missen.&nbsp; ![Wink](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/b3785da0cbf2c8566cb535dcf55b2730b5224899.png "Wink")&nbsp;Schau dir mal das SearchBundle an. Eine Query wird hier durch verschiedenste Stellen zusammengebastelt. Jede Klasse (auch Plugins) kann dann z.B. ein select/where/join hinzufügen, ohne kompliziert via str\_replace oder ähnliches das SQL-Statement manipulieren zu müssen.

Die Dokumentation findest du hier:&nbsp;[http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/)

Viele Grüße

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [31. Juli 2017 um 16:43 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/7 "2017-07-31T16:43:08Z")

</div>

> [@simkli schrieb:](https://forum.shopware.com/profile/16741/simkli "simkli")
> 
> Wenn du umbedingt „plain“-SQL verwenden möchtest, ist das auch mit dem Doctrine DBAL möglich:
> 
> $stmt = $connection-\>prepare(‚CREATE TABLE xxx …‘);  
> $stmt-\>execute();
> 
> Wenn du aber mal die Vorteile vom&nbsp;DBAL erkannt hast, möchtest du es nicht mehr missen.&nbsp; ![Wink](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/b3785da0cbf2c8566cb535dcf55b2730b5224899.png "Wink")&nbsp;Schau dir mal das SearchBundle an. Eine Query wird hier durch verschiedenste Stellen zusammengebastelt. Jede Klasse (auch Plugins) kann dann z.B. ein select/where/join hinzufügen, ohne kompliziert via str\_replace oder ähnliches das SQL-Statement manipulieren zu müssen.
> 
> Die Dokumentation findest du hier:&nbsp;[http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/)
> 
> Viele Grüße

Was mich dabei dann aber so verwirrt sind einfach dann solche CodeSnippets wie auf der Seite: [Best practices of Shopware plugin development](https://developers.shopware.com/blog/2015/11/11/best-practices-of-shopware-plugin-development/)

unter dem Punkt DBAL Connection, dass da dann so ein CodeSnippet steht:

```
$path = $this->queryBuilder->execute()->fetch(PDO::FETCH_COLUMN);

```

und ich das leider nirgendwo auf der von dir oben verlinkten Documentation seite finde.

Außerdem habe ich momentan noch keinerlei Anhaltspunkt, ob mein Skript funktionert, bzw. wieso es nicht funktioniert. Es ist sehr frustrierend code zu debuggen bei dem man nicht weiß wo der Fehler liegt 😃

Tut mir Leid für all diese Fragen, aber ich versuche da wirklich einen Durchblick zu bekommen

---

<div class="post-metadata">

**Author:** ![simkli](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/simkli/32/13124_2.png) [@simkli](https://forum.shopware.com/u/simkli)\
**Post date:** [31. Juli 2017 um 16:54 UTC](https://forum.shopware.com/t/shopware-plugin-verbinden-mit-datenbank/47199/8 "2017-07-31T16:54:05Z")

</div>

Naja PDO ist nicht Doctrine DBAL. PDO ist eine Library von PHP selbst. Da liegt die Dokumentation dann hier:&nbsp;[PHP: PDO - Manual](http://php.net/manual/de/book.pdo.php)

Die hatte dir aber @hsoebbing‍ bereits oben verlinkt.

> und ich das leider nirgendwo auf der von dir oben verlinkten Documentation seite finde.

Dann hast du sie dir nicht genau angesehen. Das steht in [Kapitel 4](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#data-retrieval-and-manipulation).&nbsp;Die execute-Funktion gibt die ein Objekt vom Typ [PDO\_Statement](http://php.net/manual/de/class.pdostatement.php) zurück.&nbsp;

Sorry aber beim Lesen der Doku können wir dir nicht helfen 😛 Ich weiß, am Anfang ist das kompliziert, aber da hilft alles nichts. Jeder fängt mal damit an 😉

Viele Grüße
