Medoo – Eine Datenbankklasse für mehrere Systeme

Anfangen habe ich mit PHP 5.3. In der Version habe ich im Bereich Datenbanken die üblichen PHP Funktionen mysql_query(), mysql_fetch_row() und mysql_connect() benutzt. Mit dem Umstieg auf MySqli gab es viel Arbeit. Denn jede MySql Funktion musste händisch nachgezogen werden und das kostete viel Zeit. Seit dem setze ich auf Datenbankklassen. Ändert sich eine Version oder der Treiber, brauche ich nur noch eine Stelle anpassen: Die Klasse selber.

Im laufe der Zeit habe ich so einige Datenbankklassen ausprobiert und selber eine eigene kleine für mich intern programmiert. Da die Pflege einer Datenbankklasse viel Zeit kostet, habe ich dann doch lieber die Finger davon gelassen. Letztendlich bin ich bei der Datenbankklasse Medoo gelandet.

Medoo

The lightest PHP database framework to accelerate development

Die Datenbankklasse Medoo ist in PHP geschrieben, mit PHP Version 5.6 und 7.1 kompatibel und unter der Haube setzt Medoo auf PDO.  Die Klasse kommt mit vielen verschiedenen Datenbanksystemen aus. So kann Medoo unter anderen für SQLite, MySQL, MSSQL, Sybase, PostgreSQL und anderen Datenbanksystemen eingesetzt werden.

PDO Medthoden

Die Methoden sind einfach zu lernen und der Umstieg ist leicht. Denn die Methoden query() und exec() greifen direkt auf die gleichnamigen PDO Methoden zu.

Für normale Abfragen wird query() verwendet. Die Methode gibt ein PDO Objekt zurück. Dieses kann im Code direkt weiter verwendet werden. Beispiel Selektierung:

$Medoo = new Medoo([..]);
$pdoObject = $Medoo->query("SELECT * FROM cms_pages WHERE active = 1");
$cmsPages = ($pdoObject !== false) ? $pdoObject->fetchAll() : [];

In $cmsPages steh jetzt ein Array allen aktiven Einträgen.

Zum hinzufügen, ändern und löschen von Einträgen wird exec() verwendet. Diese Methode gibt die Anzahl der betroffenen Zeilen zurück. (query() gibt ein PDO Object zurück.) Das Ändern eines Eintrags kann in einer Zeile geschrieben werden:

$Medoo = new Medoo([..]);
$Medoo->exec("UPDATE cms_pages SET active = 0 WHERE id = 122");

Spezielle Medoo Methoden

Mein Grund für die Vorstellung von Medoo ist nicht nur, weil es eine stabile Datenbankklasse ist und aktiv daran entwickelt wird. Viel mehr stelle ich Medoo vor, weil die hauseigenen Methoden sau gut umgesetzt sind und Zeit sparen. So kann beispielsweise eine Abfrage mit verschiedenen JOINs und WHERE-Bedingungen in nur ein paar Zeilen geschrieben werden, ohne viel Vorarbeit in PHP.

Einfache SELECT-Abfrage in Medoo

Die select()-Methode generiert ein SELECT-Statement. Zurück gegeben wird ein mehrdimensionales Array.

<?php 
$Medoo = new Medoo([..]);
$cmsPages = $Medoo->select(
 "cms_pages", // Tabelle
 ["id", "name", "active"], // Spalten
 [ // Where
   "active" => 1
 ]
);
var_dump($cmsPages); // array (20)

Einfaches SELECT mit LIMIT 1

Möchte man nur eine Zeile abfragen, reicht die get()-Methode. Diese setzt automatisch ein „LIMIT 1“ am Ende des Statements. Ansonsten gibt die Methode ein Array zurück. Ausnahme: Wird nur eine Spalte abfragt, wirft die Methode ein String zurück.

<?php 
$Medoo = new Medoo([..]);
$cmsPage = $Medoo->get(
 "cms_pages", // Tabelle
 "*", // Spalten
 [ // Where
   "active" => 1
 ]
); 
var_dump($cmsPage); // array (1)

Einträge hinzufügen

Zum Hinzufügen von Einträgen wird die insert()-Methode benutzt. Das erste Argument gibt die Tabelle an und das Array danach die Spalten mit Werte.

<?php 
$Medoo = new Medoo([..]);
$Medoo->insert(
 "cms_pages", // Tabelle
 [ // (..)VALUES(..)
   [
     "name" => "Seite Test",
     "active" => 1
   ],
   [
     "name" => "Seite mit Beispiele",
     "active" => 0
   ],
 ]
);

Eigene Syntax

Anfangs ist die Medoo Schreibweise kompliziert. Nach einigen Versuchen klappt das Schreiben von Medoo Queries dagegen schneller als eine übliche Abfrage in PHP mit PDO.

Wer jetzt neugierig geworden ist, der sollte sich die Open Source Datenbankklasse ansehen und ausprobieren. Installiert werden kann Medoo via Composer oder direkt Download. Eine ausführliche Anleitung findet ihr auf medoo.in/api/new.

7 comments

„$cmsPages = $Medoo->query(„SELECT * FROM cms_pages WHERE active = 1″)->fetchAll();“

Schlechtes Beispiel, weil der Fall, daß Query kein ResultSet liefert nicht abgefangen wird.

Ich würde hierauf ehrlich gesagt keine ernsthaften Projekte aufbauen. Es umgeht sämtliche Sicherheitsfunktionen von PDO. Im Gegensatz zu den Behauptungen bietet es so gut wie keinen Schutz gegen SQL-Injections. Dass der Autor ernsthaft behauptet zwischen quoted queries und prepared statements läge kaum ein Unterschied zeigt mir, dass er oder sie besser die Finger von einem Datenbank-Wrapper lassen sollte. Unabhängig von den Sicherheitsproblemen wird es auch in der Performance ordentliche Einbußen geben.

Das „lightweight“ Argument ist kompletter Quatsch. Das spielt für PHP überhaupt keine Rolle. Der Typ hätte besser seinen Code übersichtlicher strukturieren sollen anstatt alles in eine Datei zu packen (anfangs sogar minified, was bei PHP völliger Unsinn ist).

Ich würde ehrlich gesagt eines von drei Systemen nutzen: Entweder direkt PDO wenn ich ausschliesslich mit raw queries arbeiten will. Bei den meisten Projekten will ich aber eine Art ORM. Da ich den ActiveRecord-Ansatz bevorzuge greife ich zu Eloquent. Wenn es Datamapper sein soll, greift man zu Doctrine ORM. Alles simpelst zu benutzen und ganz sicher sinnvoller als dieser Wrapper. Selbst bei Projekten, wo ich kein ORM nutze, setze ich meistens auf das Datenbank-Toolkit von Eloquent: https://github.com/illuminate/database.

Es umgeht sämtliche Sicherheitsfunktionen von PDO
Ganz unrecht magst du sicherlich nicht haben. Auf Github wurde auch schon öfters diskutiert, wie sicher Medoo im Grunde ist. Letztendlich darf man sich nie ganz blind auf fertige Datenbankklassen verlassen. Bei meinen Projekten verwende ich zusätzlich Sanitize Klassen.

Das die Medoo Klasse „lightweight“ ist behauptet der Entwickler. Großer Vorteil von Medoo ist, dass man diverse Datenbanksysteme damit verwalten kann. Die meisten anderen können nicht mit sqlite, mysql, mssql, etc. gleichzeitig umgehen.

Ich kenne eigentlich umgekehrt keine, die das nicht kann. Am Ende setzen alle (wie Medoo) auf PDO und haben genau daher ihre Unterstützung für sqlite, mysql, mssql etc.

Validation und sanitization sollte man ohnehin unabhängig vom Datenbank-Layer machen. Das ändert nichts daran, dass das dort kaputt ist.

PS: Es wäre super hilfreich, wenn man die Kommentare abonnieren könnte. Dann bekommt man auch mit, wenn geantwortet wird. 😉

Hey,
ich bin gerade dabei ein Plugin einzurichten. In Zukunft sollte es dir möglich sein Kommentar zu abonnieren.