Einführung in MySQLi – mit Beispielen

Wird PHP den Support für MySQL bald einstellen? Genau diese Frage verunsicherte die PHP-Community, seitdem eine Fehlermeldung erschien, sobald man sich über die alte mysql-Extension mit einem MySQL-Server verband und der Wechsel zu ext/mysqli empfohlen wurde. Dieser Deprecation Notice wurde seit PHP 5.5 ausgegeben, die mysqli-Erweiterung erblickte allerdings schon mit PHP 5.0 das Licht der Welt. Zur Erinnerung: Das war 2004.

Aber woher kam dann diese Verunsicherung? Das PHP-Team bei Oracle musste feststellen, dass noch viele ext/mysql verwendeten, unter anderem auch Branchenschwergewichte wie WordPress. Deshalb entschloss sich Oracle dazu, einen langsamen Deprecation-Prozess einzuleiten. Aber alles hat irgendwann ein Ende und so wurde auch der mysql-Extension mit der Einführung von PHP 7 das Licht ausgeknipst. In diesem Artikel wird der Nachfolger MySQLi ausführlich mit Beispielen vorgestellt und die Unterschiede der beiden Erweiterungen werden genauer beleuchtet.

Was ist MySQLi?

MySQLi ist eine verbesserte (das -i steht für „improved“) Erweiterung von PHP zum Zugriff auf MySQL-Datenbanken. MySQL gehört neben Oracle und Microsoft SQL Server zu den weltweit populärsten relationalen Datenbank-Management-Systemen (DBMS). Relationale Datenbanken sind ein zentrales Element des Internets, denn sie ermöglichen es, große Datenmengen zu verarbeiten und dauerhaft zu speichern. Dabei werden komplexe Datenbestände in Teilmengen zerlegt und bei Bedarf in Relation zueinander gesetzt.

Die 1994 vom schwedischen Unternehmen MySQL AB entwickelte Software wird heute von der Oracle Corporation über ein duales Lizenzsystem vertrieben: Neben der proprietären Enterprise-Ausführung bietet Oracle eine GPL-lizenzierte, quelloffene Version an. Diese Doppellizenzierung gibt Unternehmen die Möglichkeit, eigene Anwendungen auf Basis von MySQL zu entwickeln, ohne sich der Open-Source-Lizenz unterwerfen zu müssen.

Was umfasst die mysqli-Extension?

In PHP gibt es drei verschiedene Möglichkeiten, auf eine MySQL-Datenbank zuzugreifen. Die älteste nutzt die MySQL-Erweiterung, die aber seit PHP 5.5 als veraltet (deprecated) markiert und in PHP 7 vollständig entfernt wurde. In PHP 7 funktioniert die Funktion mysql() nicht mehr, sie wurde durch mysqli() ersetzt.

Für den Zugriff auf die MySQL-Datenbank existieren in PHP neben der alten mysql-Extension auch noch die PHP Data Objects (PDO), die besonders flexibel in der Anwendung sind. Die dritte Variante nutzt die MySQL Improved Extension. Die mysqli-Erweiterung ermöglicht es seit PHP 5, auf MySQL-Datenbanken zuzugreifen. Das folgende Code-Snippet vermittelt Ihnen einen Eindruck von MySQLi.

Code-Snippet: SQL-Query an Datenbank senden

Zum Senden von Queries an die Datenbank wird die Methode query($sql) verwendet:

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno) {
    die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
}
 
$sql = "UPDATE tabelle SET spalte = 'Wert' WHERE id = 1";
$mysqli->query($sql);
?>

Welche Vorteile bietet MySQLi?

Im Gegensatz zum Vorgänger lässt sich die mysqli-Extension nicht nur prozedural, sondern auch objektorientiert benutzen. Ein Vorteil der objektorientierten Programmierung besteht darin, dass der einmal geschriebene Code künftig leicht gepflegt und modifiziert werden kann, weil beispielsweise neue Klassen entworfen werden können, die Eigenschaften und Verhalten von bereits existierenden Klassen erben. Dies verkürzt die Entwicklungszeit erheblich und erleichtert die Anpassung des Programms an eine sich ändernde Umgebung oder neue Anforderungen.

Ein weiterer wesentlicher Vorteil von MySQLi besteht in den Prepared Statements. Ein Prepared Statement ist eine sogenannte vorbereitete Anweisung für ein Datenbanksystem. Im Gegensatz zu gewöhnlichen Statements enthält es noch keine Parameterwerte, sondern Platzhalter. Wenn ein Statement mit unterschiedlichen Parametern mehrmals (z. B. innerhalb einer Schleife) auf dem Datenbanksystem ausgeführt werden soll, können Prepared Statements einen Geschwindigkeitsvorteil bringen, da das Statement schon vorübersetzt im Datenbanksystem vorliegt und nur noch mit den neuen Parametern ausgeführt werden muss. Außerdem können SQL-Injections mittels Prepared Statements effektiv verhindert werden, da das Datenbanksystem die Gültigkeit von Parametern prüft, bevor diese verarbeitet werden.

Code-Snippet: Prepared Statements in MySQLi

Ein Beispiel für Prepared Statements in MySQLi sieht wie folgt aus:

<?php
$mysqli = new mysqli("localhost", "user", "Password", "database");
if ($mysqli->connect_errno) {
    die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
}
$sql = "UPDATE user SET email = ?, passwort = ? WHERE id = ?";
$statement = $mysqli->prepare($sql);
$statement->bind_param('ssi', $email, $passwort, $id);

//Variablen Werte zuweisen
$id= 1;
$email = "ein@beispiel.de";
$passwort = "neues passwort";
$statement->execute();
?>

Mittels bind_param() werden die Parameter in der SQL-Query mit den Variablen verbunden. Das erste Argument von bind_param() im obigen Beispiel mit dem Wert ssi beschreibt die Typen der Parameter. ssi gibt an, dass drei Parameter in der Query sind, der erste ist vom Typ string, der zweite vom Typ string und der dritte vom Typ integer. Für Fließkommazahlen existiert noch der Wert d.

Nachdem die Variablen mit den Parametern verbunden wurden, wird diesen der entsprechende Wert zugewiesen und mittels $statement->execute() das Prepared Statement an die Datenbank gesendet. Im Vergleich zu PDO ist dies jedoch deutlich komplizierter.

mysqli() vs. mysql(): Warum wurde die PHP-Funktion umgestellt?

Die Umstellung auf MySQLi war unumgänglich, denn die alte mysql-Extension war schlichtweg veraltet. Außerdem war man bei der Erweiterung immer auf Abwärtskompatibilität bedacht, sodass es schwer war, den Code zu pflegen. Der Code geht auf die frühen Tage von PHP und MySQL zurück und wurde zum Teil nicht optimal entwickelt.

Wenn beispielsweise keine explizite Verbindungsressource angegeben war, haben alle Funktionen versucht, die zuletzt genutzte Verbindung zu verwenden. Hatte man als Nutzer großes Pech, konnte es sogar passieren, dass mysql_query() auf eine komplett andere Datenbank zugriff. Die Verbindungskennung war in der alten Funktion optional, in der neuen Extension muss diese jetzt angegeben werden. Außerdem wurden Prepared Statements hinzugefügt, die das Auslesen von Daten aus der DB-Tabelle schneller und sicherer machen.

Praktischerweise lassen sich viele Funktionen einfach dadurch modifizieren, dass ein -i zur mysql()-Funktion hinzufügt wird. Es gibt jedoch auch einige Unterschiede zwischen den beiden Erweiterungen.

Code-Snippet: Verbindungskennung in MySQL und MySQLi

Einige mysqli()-Funktionen benötigen eine Verbindungskennung – eine PHP-Variable, die bei der Verbindung zur Datenbank erzeugt wird. In diesem Beispiel heißt sie: $link.

<?php
// mysql() Verbindung herstellen:
mysql_connect("localhost", "root", "", "test");

// mysqli() Verbindung herstellen:
$link = mysqli_connect("localhost", "root", "", "test");
?>

Code-Snippet: Daten aus der DB-Tabelle auslesen

Die Funktion mysqli_query() benötigt eine Verbindungskennung, die Funktion mysqli_fetch_array() jedoch nicht.

<?php
$link = mysqli_connect("localhost", "root", "", "test");

// Datensätze auslesen:
 $datensaetze = mysqli_query($link,
 "SELECT `name`, `text`, `datum` FROM `nachrichten`");

// Datensätze ausgeben:
while (list($name, $text, $datum) = mysqli_fetch_array($datensaetze)) {
 echo "<p>$name - $titel - $text - $datum</p>";
}
?>

Neben der bereits genannten Funktion benötigen beispielsweise auch die folgenden Funktionen eine Verbindungskennung:

Fazit: MySQLi ist sicherer und schneller

Die Umstellung auf MySQLi war notwendig, um die Geschwindigkeit der Datenbankzugriffe zu verbessern. In der neuen Erweiterung wurden Prepared Statements eingeführt, die überdies die Verbindungssicherheit erhöhen, da sie SQL-Injections verbeugen können. Das Datenbanksystem prüft dabei, ob die Parameter gültig sind, bevor diese verarbeitet werden. Zudem lässt sich der neue Code dank objektorientierter Programmierung besser pflegen.


Auf dem Laufenden bleiben?

Jetzt für unseren Newsletter anmelden und gratis Online-Marketing Whitepaper für lokale Anbieter sichern!