Wird PHP den Support für MySQL bald ein­stel­len? Genau diese Frage ver­un­si­cher­te die PHP-Community, seitdem eine Feh­ler­mel­dung erschien, sobald man sich über die alte mysql-Extension mit einem MySQL-Server verband und der Wechsel zu ext/mysqli empfohlen wurde. Dieser De­pre­ca­ti­on Notice wurde seit PHP 5.5 aus­ge­ge­ben, die mysqli-Er­wei­te­rung erblickte al­ler­dings schon mit PHP 5.0 das Licht der Welt. Zur Er­in­ne­rung: Das war 2004.

Aber woher kam dann diese Ver­un­si­che­rung? Das PHP-Team bei Oracle musste fest­stel­len, dass noch viele ext/mysql ver­wen­de­ten, unter anderem auch Bran­chen­schwer­ge­wich­te wie WordPress. Deshalb ent­schloss sich Oracle dazu, einen langsamen De­pre­ca­ti­on-Prozess ein­zu­lei­ten. Aber alles hat ir­gend­wann ein Ende und so wurde auch der mysql-Extension mit der Ein­füh­rung von PHP 7 das Licht aus­ge­knipst. In diesem Artikel wird der Nach­fol­ger MySQLi aus­führ­lich mit Bei­spie­len vor­ge­stellt und die Un­ter­schie­de der beiden Er­wei­te­run­gen werden genauer be­leuch­tet.

IONOS Cloud Object Storage
Daten sicher und günstig speichern

Ersetzen Sie eigene, kos­ten­in­ten­si­ve Spei­cher­lö­sun­gen mit IONOS Cloud Object Storage. Es ist hoch­gra­dig ska­lier­bar, äußerst kos­ten­ef­fi­zi­ent und in­te­griert sich in Ihre An­wen­dungs­sze­na­ri­en. Die extrem hohe Aus­fall­si­cher­heit unserer Server sowie eine in­di­vi­du­el­le Zu­griffs­steue­rung schützen Ihre Daten zu­ver­läs­sig.

Was ist MySQLi?

MySQLi ist eine ver­bes­ser­te (das -i steht für „improved“) Er­wei­te­rung von PHP zum Zugriff auf MySQL-Da­ten­ban­ken. MySQL gehört neben Oracle und Microsoft SQL Server zu den weltweit po­pu­lärs­ten re­la­tio­na­len Datenbank-Ma­nage­ment-Systemen (DBMS). Re­la­tio­na­le Da­ten­ban­ken sind ein zentrales Element des Internets, denn sie er­mög­li­chen es, große Da­ten­men­gen zu ver­ar­bei­ten und dauerhaft zu speichern. Dabei werden komplexe Da­ten­be­stän­de in Teil­men­gen zerlegt und bei Bedarf in Relation zu­ein­an­der gesetzt.

Die 1994 vom schwe­di­schen Un­ter­neh­men MySQL AB ent­wi­ckel­te Software wird heute von der Oracle Cor­po­ra­ti­on über ein duales Li­zenz­sys­tem ver­trie­ben: Neben der pro­prie­tä­ren En­ter­pri­se-Aus­füh­rung bietet Oracle eine GPL-li­zen­zier­te, quell­of­fe­ne Version an. Diese Dop­pel­li­zen­zie­rung gibt Un­ter­neh­men die Mög­lich­keit, eigene An­wen­dun­gen auf Basis von MySQL zu ent­wi­ckeln, ohne sich der Open-Source-Lizenz un­ter­wer­fen zu müssen.

Was umfasst die mysqli-Extension?

In PHP gibt es drei ver­schie­de­ne Mög­lich­kei­ten, auf eine MySQL-Datenbank zu­zu­grei­fen. Die älteste nutzt die MySQL-Er­wei­te­rung, die aber seit PHP 5.5 als veraltet (de­pre­ca­ted) markiert und in PHP 7 voll­stän­dig entfernt wurde. In PHP 7 funk­tio­niert die Funktion mysql() nicht mehr, sie wurde durch mysqli() ersetzt.

Für den Zugriff auf die MySQL-Datenbank exis­tie­ren 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-Er­wei­te­rung er­mög­licht es seit PHP 5, auf MySQL-Da­ten­ban­ken zu­zu­grei­fen. Das folgende Code-Snippet ver­mit­telt 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 pro­ze­du­ral, sondern auch ob­jekt­ori­en­tiert benutzen. Ein Vorteil der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung besteht darin, dass der einmal ge­schrie­be­ne Code künftig leicht gepflegt und mo­di­fi­ziert werden kann, weil bei­spiels­wei­se neue Klassen entworfen werden können, die Ei­gen­schaf­ten und Verhalten von bereits exis­tie­ren­den Klassen erben. Dies verkürzt die Ent­wick­lungs­zeit erheblich und er­leich­tert die Anpassung des Programms an eine sich ändernde Umgebung oder neue An­for­de­run­gen.

Ein weiterer we­sent­li­cher Vorteil von MySQLi besteht in den Prepared State­ments. Ein Prepared Statement ist eine so­ge­nann­te vor­be­rei­te­te Anweisung für ein Da­ten­bank­sys­tem. Im Gegensatz zu ge­wöhn­li­chen State­ments enthält es noch keine Pa­ra­me­ter­wer­te, sondern Platz­hal­ter. Wenn ein Statement mit un­ter­schied­li­chen Pa­ra­me­tern mehrmals (z. B. innerhalb einer Schleife) auf dem Da­ten­bank­sys­tem aus­ge­führt werden soll, können Prepared State­ments einen Ge­schwin­dig­keits­vor­teil bringen, da das Statement schon vor­über­setzt im Da­ten­bank­sys­tem vorliegt und nur noch mit den neuen Pa­ra­me­tern aus­ge­führt werden muss. Außerdem können SQL-In­jec­tions mittels Prepared State­ments effektiv ver­hin­dert werden, da das Da­ten­bank­sys­tem die Gül­tig­keit von Pa­ra­me­tern prüft, bevor diese ver­ar­bei­tet werden.

Code-Snippet: Prepared State­ments in MySQLi

Ein Beispiel für Prepared State­ments 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 be­schreibt 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ß­kom­ma­zah­len existiert noch der Wert d.

Nachdem die Variablen mit den Pa­ra­me­tern verbunden wurden, wird diesen der ent­spre­chen­de Wert zu­ge­wie­sen und mittels $statement->execute() das Prepared Statement an die Datenbank gesendet. Im Vergleich zu PDO ist dies jedoch deutlich kom­pli­zier­ter.

Managed Nextcloud by IONOS Cloud
Team­ar­beit in der eigenen Cloud
  • Voll­stän­di­ge Da­ten­sou­ve­rä­ni­tät in deutschen Re­chen­zen­tren
  • Managed Service ohne Ad­mi­nis­tra­ti­ons­auf­wand
  • File-Sharing, Do­ku­men­ten­be­ar­bei­tung & Kom­mu­ni­ka­ti­on

mysqli() vs. mysql(): Warum wurde die PHP-Funktion um­ge­stellt?

Die Um­stel­lung auf MySQLi war un­um­gäng­lich, denn die alte mysql-Extension war schlicht­weg veraltet. Außerdem war man bei der Er­wei­te­rung immer auf Ab­wärts­kom­pa­ti­bi­li­tä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 ent­wi­ckelt.

Wenn bei­spiels­wei­se keine explizite Ver­bin­dungs­res­sour­ce angegeben war, haben alle Funk­tio­nen versucht, die zuletzt genutzte Ver­bin­dung zu verwenden. Hatte man als Nutzer großes Pech, konnte es sogar passieren, dass mysql_query() auf eine komplett andere Datenbank zugriff. Die Ver­bin­dungs­ken­nung war in der alten Funktion optional, in der neuen Extension muss diese jetzt angegeben werden. Außerdem wurden Prepared State­ments hin­zu­ge­fügt, die das Auslesen von Daten aus der DB-Tabelle schneller und sicherer machen.

Prak­ti­scher­wei­se lassen sich viele Funk­tio­nen einfach dadurch mo­di­fi­zie­ren, dass ein -i zur mysql()-Funktion hinzufügt wird. Es gibt jedoch auch einige Un­ter­schie­de zwischen den beiden Er­wei­te­run­gen.

Code-Snippet: Ver­bin­dungs­ken­nung in MySQL und MySQLi

Einige mysqli()-Funk­tio­nen benötigen eine Ver­bin­dungs­ken­nung – eine PHP-Variable, die bei der Ver­bin­dung 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 Ver­bin­dungs­ken­nung, 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 bei­spiels­wei­se auch die folgenden Funk­tio­nen eine Ver­bin­dungs­ken­nung:

Fazit: MySQLi ist sicherer und schneller

Die Um­stel­lung auf MySQLi war notwendig, um die Ge­schwin­dig­keit der Da­ten­bank­zu­grif­fe zu ver­bes­sern. In der neuen Er­wei­te­rung wurden Prepared State­ments ein­ge­führt, die überdies die Ver­bin­dungs­si­cher­heit erhöhen, da sie SQL-In­jec­tions verbeugen können. Das Da­ten­bank­sys­tem prüft dabei, ob die Parameter gültig sind, bevor diese ver­ar­bei­tet werden. Zudem lässt sich der neue Code dank ob­jekt­ori­en­tier­ter Pro­gram­mie­rung besser pflegen.

Zum Hauptmenü