Die MySQLi-Erweiterung kann prozedural und objektorientiert verwendet werden. Beide Alternativen bieten jedoch denselben Funktionsumfang. Wir wollen zunächst die objektorientierte Verwendung betrachten.
Beispiel 10.1 zeigt die objektorientierte Verwendung der MySQLi-Erweiterung analog zu dem in Beispiel 1.1 gezeigten Beispiel, das die MySQL-Erweiterung verwendet.
Beispiel 10.1: Die MySQLi-Erweiterung objektorientiert verwenden
<?php
$mysqli = new MySQLi(
'localhost',
'user',
'password',
'test'
);
if (mysqli_connect_errno()) {
printf(
"Can't connect to MySQL Server. Errorcode: %s\n",
mysqli_connect_error()
);
exit;
}
$result = $mysqli->query('SELECT spalte FROM tabelle');
if ($result) {
while ($row = $result->fetch_assoc()) {
// ...
}
$result->close();
}
$mysqli->close();
?>Eine Eigenheit der MySQLi-Erweiterung stellt die Verwendung von Unterstrichen in den Namen der Methoden und Instanzvariablen anstelle der üblichen StudlyCaps-Notation [10] dar.
Tabelle 10.1. Die Klassen der MySQLi-Erweiterung
| Klasse | Aufgabe |
|---|---|
MySQLi | Repräsentiert die Verbindung zum MySQL-Server. |
MySQLi_Stmt | Repräsentiert eine vorbereitete Anfrage. |
MySQLi_Result | Repräsentiert das Ergebnis einer Anfrage. |
Werden für die Verbindung zum MySQL-Server nur die Verbindungsparameter
(Hostname oder Socket) sowie die Kennungsdaten (Benutzername und Passwort)
benötigt, so können diese direkt dem Konstruktor der Klasse
MySQLi übergeben werden.
Sollen für die Verbindung stattdessen erweiterte Parameter, beispielsweise
für eine Verschlüsselung der Client-Server-Kommunikation, gesetzt werden,
so ist mit der Funktion mysqli_init() zunächst ein
MySQLi-Objekt zu erzeugen. Über die entsprechenden Methoden,
beispielsweise ssl_set(), können dann die entsprechenden
Einstellungen vorgenommen werden, bevor die eigentliche Verbindung mit
der Methode real_connect() hergestellt wird. Diese Methode
akzeptiert dieselben Parameter wie der Konstruktor.
Die Methode query() der Klasse MySQLi liefert
ein Objekt der Klasse MySQLi_Result. Dieses kapselt die
Ergebniszeilen der Anfrage. Da die Klasse MySQLi_Result leider
nicht die Schnittstelle Iterator anbietet, kann das Objekt
nicht direkt mit dem foreach-Operator verwendet werden.
Stattdessen ist eine entsprechende while-Schleife zu
verwenden (siehe
Beispiel 10.1).
Die Klassen und Methoden der MySQLi-Erweiterung benutzen in PHP 5.0
[11]
leider von Haus aus keine Ausnahmen, um die Behandlung von
Fehlersituationen zu ermöglichen. Daher müssen entweder Funktionen wie
mysqli_connect_errno() und mysqli_connect_error()
(siehe Beispiel 10.1)
verwendet werden, oder die Klasse MySQLi muss entsprechend
durch Vererbung angepasst werden.
Beispiel 10.2
zeigt eine von MySQLi abgeleitete Klasse, die bei Fehlern
während des Verbindungsaufbau sowie bei Anfragefehlern eine entsprechende
Ausnahme auslöst.
Beispiel 10.2: Die MySQLi-Erweiterung um Ausnahmenbehandlung erweitern
<?php
class MySQLi_Exception extends Exception {
}
class MySQLi_ConnectionException extends MySQLi_Exception {
}
class MySQLi_QueryException extends MySQLi_Exception {
}
class My_MySQLi extends MySQLi {
public function __construct(
$hostname, $username = '', $passwd = '',
$dbname = '', $port = 3306, $socket = '') {
parent::__construct(
$hostname,
$username,
$passwd,
$dbname,
$port,
$socket
);
if (mysqli_connect_error()) {
throw new MySQLi_ConnectionException(
mysqli_connect_error(),
mysqli_connect_errno()
);
}
}
public function query($query) {
$result = parent::query($query);
if ($this->error) {
throw new MySQLi_QueryException(
$this->error,
$this->errno
);
}
}
}
?>[10] Bei der Notation von Bezeichnernamen gibt es zwei etablierte Möglichkeiten, um Wörter, die Bestandteil des Namens sind, zu trennen. In der prozeduralen Programmierung geschieht dies meist mit einem Unterstrich, in der objektorientierten Programmierung benutzt man Groß- und Kleinbuchstaben, um die Wörter voneinander abzugrenzen. Hierbei wird das erste Zeichen eines Namens klein geschrieben, jedes neue Wort beginnt mit einem Großbuchstaben.
[11] In PHP 5.1 soll sich dies ändern.