1. MySQLi
Um wieder zurück auf PHP zu kommen: wir wollen natürlich mit PHP auf die Datenbank zugreifen. Da wir nicht einfach so ein SQL-Query im PHP-Skript schreiben können brauchen wir eine Möglichkeit auf die MySQL-Datenbank zuzugreifen. Wir verwenden dabei die mysqli-Extension, und davon die OOP-Variante.
Die mysqli-Extension stellt eingie Klassen bereit um mit MySQL zu arbeiten. Wir benutzen dabei die MySQLi Klasse. Über den Konstruktor geben wir die Zugangsinformationen an um auf die Datenbank zuzugreifen.
<?php
$db = new mysqli('localhost', 'username', 'password', 'database');
?>
Wenn keine Verbindung aufgebaut wurde so wird eine Warning erzeugt.
Wir unterdrücken diese Fehlermeldung indem wir ein @
-Zeichen vor dem new
-Operator
schreiben. So werden Fehlermeldungen die in dieser Zeile erzeugt werden nicht mehr angezeigt.
Dies ist jedoch keine Einladung überall @
-Zeichen hinzuschreiben. Es wird nur
die Fehlermeldung unterdrückt, der Fehler selbst ist weiterhin vorhanden. Entsprechend
prüfen wir ob wir eine Verbindung zur Datenbank aufbauen konnten oder nicht. Laut
Handbuch geht dies indem wir den
Rückgabewert von mysqli_connect_errno prüfen. Wenn der ungleich 0 ist ist ein
Fehler aufgetreten, den wir dann mit mysqli_connect_error anzeigen können.
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
?>
Da wir unser MySQLi-Objekt haben können wir nun damit arbeiten. Hauptsächlich ist dies
die query()
-Methode (MySQLi::query), kann aber auch komplexer mit
der prepare()
-Methode (>mysqli_prepare) sein. Als Parameter gibt man den
SQL-Query an, den man zur Datenbank senden möchte. Bei einem SELECT-Query
liefert diese Funktion ein MySQLi_Result-Objekt zurück.
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
?>
Da jeder Query fehlschlagen kann, egal ob er nun syntaktisch richtig ist oder nicht, müssen
wir überprüfen ob der Query fehlerhaft war. Dazu wird der Rückgabewert von query()
überprüft. Ist dieser false
so ist ein Fehler aufgetreten der über die
error-Eigenschaft des MySQLi-Objekts abgerufen werden kann.
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
var_dump($db, $result);
?>
Mit der var_dump-Zeile gucken wir uns mal an was wir für Objekte haben.
object(mysqli)#1 (0) { } object(mysqli_result)#2 (0) { }
Das eine ist unser MySQLi-Objekt, das andere unser erstelltes MySQLi_Result-Objekt mit denen
wir nun arbeiten können. Zum Testen gucken wir mal wie groß die Ergebnistabelle ist, die
wir abgefragt haben. Die Anzahl ist in der num_rows
-Eigenschaft gespeichert
(MySQLi_Result::num_rows).
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
echo 'Die Ergebnistabelle besitzt '.$result->num_rows." Datensätze<br />\n";
?>
In unserem Fall wird 2
ausgegeben da wir nur 2 Datensätze in der Tabelle
haben. Um nun auf die einzelnen Datensätze zuzugreifen verwenden wir die
fetch_assoc()
-Methode (MySQLi_Result::fetch_assoc). Diese
Methode liefert ein Array zurück was von einem Datensatz alle Daten enthält. Jeder
Aufruf der fetch_assoc()
-Methode liefert den nächsten Datensatz zurück,
bis das Ende erreicht wurde, wo dann statt dem Array der Wert NULL
zurückgeliefert wird.
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
echo 'Die Ergebnistabelle besitzt '.$result->num_rows." Datensätze<br />\n";
var_dump($result->fetch_assoc());
var_dump($result->fetch_assoc());
var_dump($result->fetch_assoc());
var_dump($result->fetch_assoc());
?>
Dieser Quellcode erzeugt folgende Ausgabe:
Die Ergebnistabelle besitzt 2 Datensätze<br /> array(2) { ["Titel"]=> string(0) "" ["Datum"]=> string(19) "0000-00-00 00:00:00" } array(2) { ["Titel"]=> string(16) "Meine erste News" ["Datum"]=> string(19) "2008-08-17 14:02:08" } NULL NULL
Wie man sieht liefern die ersten beiden Aufrufe die entsprechenden Zeilen
in der Ergebnistabelle und dann nur noch NULL
-Werte. Daher kann
man den fetch_assoc()
-Aufruf ideal in einer while-Schleife
verwenden.
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
echo 'Die Ergebnistabelle besitzt '.$result->num_rows." Datensätze<br />\n";
while ($row = $result->fetch_assoc()) { // NULL ist äquivalent zu false
// $row ist nun das Array mit den Werten
echo 'Die News "'.$row['Titel'].'" wurde am "'.$row['Datum']."\" geschrieben<br />\n";
}
?>
Nachdem wir alle Datensätze ausgelesen haben können wir die Ergebnistabelle mit
der close()
-Methode wegwerfen (MySQLi_Result::close).
<?php
$db = @new mysqli('localhost', 'username', 'password', 'database');
if (mysqli_connect_errno()) {
die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
}
$sql = 'SELECT
Titel,
Datum
FROM
News';
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
echo 'Die Ergebnistabelle besitzt '.$result->num_rows." Datensätze<br />\n";
while ($row = $result->fetch_assoc()) { // NULL ist äquivalent zu false
// $row ist nun das Array mit den Werten
echo 'Die News "'.$row['Titel'].'" wurde am "'.$row['Datum']."\" geschrieben<br />\n";
}
$result->close();
unset($result); // und referenz zum objekt löschen, brauchen wir ja nicht mehr...
?>
Wer Lust hat kann am Ende des Skriptes noch die Verbindung zur Datenbank mit der
close()
-Methode beenden (MySQLi::close), dies passiert jedoch
trivialerweise automatisch wenn das Skript beendet wird.