MySQLi-Klasse

Vor einigen Jahren habe ich eine Klasse geschrieben um mit PHP Queries an eine MySQL Datenbank zu senden. Diese habe ich dann ohne sie zu bearbeiten lange verwendet und bin deshalb ich dem Trend von PDO und `prepared statements` bis vor kurzem entkommen und habe weiterhin manuell mit real-escape-string in SQL strings für Sicherheit gesorgt. Diese Klasse habe ich jetzt verbessert und den Code auf GitHub gestellt. Ich hatte den Ehrgeiz, bei MySQLi zu bleiben und `named parameters` zu unterstützen, auch wenn ich bei der Programmierung einsehen musste, dass PDO evt. doch die bessere Entscheidung gewesen wäre, vor allem, weil bei MySQLi die Verwendung von mysqli_stmt::bind_result() ziemlich umständlich ist und das zu einigen Problemen geführt hat (siehe issue #4 auf GitHub).

Im Nachhinein kann ich sagen, dass die PHP native MySQLi-Klasse eigentlich ganz in Ordnung ist, solange man nur mysqli::query() verwendet. Sobald aber `prepared statements` ausgeführt werden, wird die Handhabung des Results mit MySQLi eher unpraktisch, weil man dann auf die mysqli_stmt::bind_result() Methode angewiesen ist. Meine Klasse bietet aber genau dafür eine bequeme Handhabung und erleichtert das weiterverwenden der einzelnen Columns mit ->fetch().
Trotzdem wäre es für eine zukünftige Versionen dieser Klasse vielleicht lohnenswert auf PDO umzusteigen.

Im Framework ist eine Klasse DBi enthalten, die eine Verbindung zur Datenbank herstellen kann und auch den Umgang von mehreren Datenbankverbindungen parallel unterstützt. Eine Verbindung kann z.B. so hergestellt werden:

DBi::add(DBi::connect($host, $user, $password, $dbname));

Nach dem eine Verbindung hergestellt wurde, kann ein einfaches SQL Statement z.B. mit folgendem Code ausgeführt werden:

$sqlNamedParams = "SELECT * FROM user WHERE email = :email LIMIT :limit";
$stmt = new Query();
$stmt->prepare($sqlNamedParams);
$stmt->bindParams(array(
    ':limit' => 1,
    'email' => $email
));
$stmt->send();
while($row = $stmt->fetchObject()) {
    print_r($row);
}

Die Klasse bietet aber auch die Möglichkeit Queries mit `method chaining` in einer Zeile abzusenden. So kann z.B. bei einem Query der einen INSERT INTO ausführt direkt die neu hinzugefügte ID ausgelesen werden:

$id = Query::init("INSERT INTO user SET email = :email", array('email' => $email))->send()->insertId();

Falls Fehler auftreten (z.B. ein Tippfehler im SQL string oder in den `named parameters`) werden diese mit nützlichen Informationen zum Fehler ausgegeben. Die Fehlermeldungen selbst werden mit Bootstrap formatiert.

Es existiert auch eine Funktion, mit der das Ergebnis von einem SQL Statement schnell überprüft werden kann. Dabei muss man bloss das Klassen-Objekt mit `echo` ausgeben:

$stmt = new Query($sql);
$stmt->send($params);
echo $stmt; // Gibt eine Tabelle mit dem Result aus

Weitere Funktionen und Features können in der README.md Datei auf GitHub nachgelesen werden.

1 Kommentar zu „MySQLi-Klasse“

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert