Quakenet/#php Tutorial

Hinweis: Wenn sie diese Seite von einer externen URL aufgerufen haben achten sie darauf das alle Kapitel aufeinander aufbauen. Stellen sie daher sicher dass sie alle vorherigen Kapitel gelesen haben, da sie sonst relevante Informationen übersehen.

MySQL / Zugriff über PHP

  1. MySQLi

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.

Fragen zum Kapitel

Keine Fragen zum Kapitel vorhanden

Zurück zu Weiter zu
Copyright © bei den OPs von #php.de/QuakeNet Valid XHTML 1.0 Strict Valid CSS!