Anzeige
Tutorialbeschreibung

PHP - Teil 26 - PEAR: Datenbankabstraktion mit MDB2

PHP - Teil 26 - PEAR: Datenbankabstraktion mit MDB2

PEAR bietet eine umfangreiche Datenbankabstraktion, die es ermöglicht, Anwendungen zu programmieren, die auf verschiedenen Datenbanksystemen lauffähig sind. Von der Funktionalität her ist dies beispielsweise mit AdoDB vergleichbar. Es spielt also für die Entwicklung einer Anwendung keine Rolle, ob später das Datenbanksystem gewechselt wird. Die Vorteile hiervon liegen auf der Hand: Wenn ihr beispielsweise eine Anwendung für eine MySQL-Datenbank mit den PHP-eigenen Funktionen programmiert, ist diese ausschließlich auf MySQL-Datenbanken anwendbar. Soll von einer MySQL- auf eine Access-Datenbank umgestiegen werden, müssen alle Skripte angepasst werden. Mit der PEAR-Datenbankabstraktion kann dieser zusätzliche Programmieraufwand vermieden werden.

Icon-Ersteller: Oxygen-Team

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Das zentrale Paket für die Datenbankabstraktion unter PEAR nennt sich MDB2. (Bis vor einigen Jahren kam das Paket DB zum Einsatz. Dieses Paket wurde aber mittlerweile durch MDB2 ersetzt). Die Paketseite findet ihr unter http://pear.php.net/package/MDB2.

Bilder



 
Von dort könnt ihr das Paket herunterladen oder es direkt über den PEAR-Installer installieren. Überprüft aber zunächst am besten, ob das Paket nicht schon bei euch vorhanden ist. Öffnet dazu das PEAR-Verzeichnis.

Bilder



 
Liegt im PEAR-Verzeichnis das Verzeichnis MDB2, könnt ihr direkt mit der Datenbankabstraktion beginnen. Was höchstwahrscheinlich noch fehlt, sind die Treiber für die Datenbanksysteme. Ruft dazu die Kommandozeile auf und wechselt in das PEAR-Verzeichnis eurer PHP-Installation. Um nun beispielsweise den MySQL-Treiber zu installieren, gebt ihr Folgendes in die Kommandozeile ein:

pear install MDB2_Driver_mysql

Die folgenden Treiber gibt es:

fbsql: FrontBase
ibase: InterBase
mssql: MS SQL Server
mysql: MySQL
mysqli: MySQL
oci8: Oracle
pgsql: PostgreSQL
querysim: Querysim
sqlite: SQLite

Nach erfolgreicher Installation gibt es eine entsprechende Meldung.

Bilder



 
MDB2 deckt momentan die folgenden Datenbanksysteme ab:

• MySQL
• MySQLi
• PostgreSQL
• Oracle
• Frontbase
• Querysim
• Interbase/Firebird
• MSSQL
• SQLite


Die Verbindung zur Datenbank herstellen

Die Verbindung zu einer Datenbank aufzubauen, funktioniert prinzipiell genauso, wie ihr das von den herkömmlichen Datenbankfunktionen aus PHP gewohnt seid. Es wird eine Verbindung zur Datenbank hergestellt und ein Handle zurückgeliefert. Gebt die folgende Syntax in einen Editor ein und ruft die Datei anschließend in einem Browser auf.

<?php
 require_once 'MDB2.php';
 $dsn = 'mysql://root:@localhost/joomla17';
 $options = array(
     'debug' => 2,
     'result_buffering' => false,
 );
 $mdb2 =& MDB2::factory($dsn, $options);
 if (PEAR::isError($mdb2)) {
     die($mdb2->getMessage());
 }
 $mdb2->disconnect();
?>


 
Das Browserfenster sollte nach dem Aufrufen der Datei leer sein. Wurde der Treiber nicht gefunden, gibt es eine Fehlermeldung.

Bilder



 
Über require_once() werden die Datenbankfunktionen von MDB2 eingebunden. Die Variablen enthalten die bekannten Werte zum Zugriff auf Datenbanken. Entscheidender Bedeutung kommt hier der Definition des DSN (Data Source Name) zu. Dieser kann sich aus bis zu sieben Parametern zusammensetzen. Im Regelfall werden aber lediglich der Datenbanktyp (in unserem Beispiel mysql für eine MySQL-Datenbank), der Benutzername, das Passwort, der Server sowie der Datenbankname benötigt. Die folgenden Syntaxformen können ebenfalls eingesetzt werden.

mysql://username:password@protocol+hostspec:110//usr/db_file.db
mysql://username:password@hostspec/database_name
mysql://username:password@hostspec
mysql://username@hostspec
mysql://hostspec/database
mysql://hostspec


SQL-Abfragen durchführen

Um mit MDB2 produktiv arbeiten zu können, reicht eine Verbindungsaufnahme zur Datenbank aber freilich nicht aus. Zum Arbeiten mit Datenbanken werden SQL-Befehle benötigt.

<?php
 require_once 'MDB2.php';
 $dsn = 'mysql://root:@localhost/joomla17';
 $options = array ('persistent' => true);
 $mdb2 =& MDB2::factory($dsn, $options);
 $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
 $sql = 'SELECT * FROM jos_menu';
 $result = $mdb2->query($sql);
 while ($row = $result->fetchRow()) {
  echo $row['alias'], '<br />';
 }
 $result->free();
 $mdb2->disconnect();
?>


 
Über query() können beliebige SQL-Statements angegeben werden.

Bilder



 

fetchRow()

Das im vorherigen Beispiel verwendete fetchRow() liefert die Datensätze eines Result-Objekts zeilenweise als Array zurück. Als Parameter können das Array-Format und eine Zeile angegeben werden. Für das Array-Format können die folgenden Werte verwendet werden.
Wert Beschreibung
MDB2_FETCHMODE_ORDERED
Array
(
[0] => 28
[1] => hi
)
MDB2_FETCHMODE_ASSOC
Array
(
[a] => 28
[b] => hi
)
MDB2_FETCHMODE_OBJECT
stdClass Object
(
[a] => 28
[b] => hi
)


Um das Array-Format nicht jedes Mal definieren zu müssen, könnt ihr setFetchMode() verwenden. Diese gibt das Format global für alle weiteren Abfragen an. Ein Beispiel:

$result = $db->query("SELECT * FROM jos_menu");
$db->setFetchMode(MDB2_FETCHMODE_ASSOC);
while ($row = $result->fetchRow()){
 print $row["username"] . "<br />";
}


Durch diese Syntax werden die Datensätze der Tabelle jos_menu als assoziatives Array zurückgeliefert. In dieser Tabelle befindet sich die Spalte username, auf die nun über deren Spaltennamen zugegriffen werden kann.


 

free()

free() entfernt nicht mehr verwendete Resultate aus dem Speicher. Das geschieht auch mit dem Ende des PHP-Skripts.

<?php
$res =& $mdb2->query('SELECT * FROM jos_users');
while ($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)) {
 echo $row['name'] . ', ' . $row['username'] . "\n";
}
$res->free();
?>



Informationen einholen

MDB2 hält eine stattliche Anzahl an Methoden bereit, mit denen ausführliche Informationen über eine Datenbank eingeholt werden können.
Methode Beschreibung
affectedRows()

Über die affectedRows()-Methode kann die Anzahl der von einer UPDATE-, INSERT- oder DELETE-Abfrage betroffenen Datensätze ermittelt werden.
numCols() Liefert die Anzahl der bei einer SELECT-Abfrage gefunden Tabellenfelder.
numRows() Liefert die Anzahl der von einer SELECT-Abfrage gefundenen Datensätze.


Keine der aufgeführten Methoden erwartet einen Parameter.

$sql = 'SELECT * FROM jos_menu';
$result = $mdb2->query($sql);
echo $result->numCols();


In diesem Beispiel werden die von der SELECT-Abfrage betroffenen Tabellenfelder ausgegeben. Der Wert schließt durch * alle vorhanden Felder der Tabelle jos_menu ein.

Bilder



 

tableinfo()

Mit tableInfo() können ausführliche Informationen über die von einer Abfrage betroffenen Felder und Tabellen eingeholt werden. Als Parameter werden entweder ein MDB2_Result-Objekt oder ein MDB2_Objekt erwartet. Durch den zweiten, fakultativen Parameter wird der Modus bestimmt. Fehlt der Parameter, werden die folgenden Informationen angezeigt.

 [0]["table"]  table name
 [0]["name"]   field name
 [0]["type"]   field type
 [0]["len"]    field length
 [0]["flags"]  field flags


Wird als zweiter Parameter MDB2_TABLEINFO_ORDER angegeben, werden die folgenden Informationen angezeigt.

 ["num_fields"] number of metadata records
 [0]["table"]  table name
 [0]["name"]   field name
 [0]["type"]   field type
 [0]["len"]    field length
 [0]["flags"]  field flags
 ["order"][field name]  index of field named "field name"


Bei diesem Modus wird dem Array ein Index hinzugefügt. In diesem sind die jeweiligen Feldnamen als Schlüssel und deren Position als Wert enthalten.

Beim Einsatz von JOIN kann es vorkommen, dass Tabellenfelder denselben Namen haben. Um dieses Problem zu umgehen, kann der Modus MDB2_TABLINFO_ORDERTABLE verwendet werden. Dieser generiert einen ordertable-Index, in dem die Felder ihrer jeweiligen Tabelle zugeordnet sind.

 ["ordertable"][table name][field name] index of field named "field name"

 
Wie ihr seht, ist tableInfo() ein mächtiges Werkzeug zur Informationsfindung. Die folgende Syntax zeigt, wie leicht sich die wichtigsten Informationen über die Felder einer Tabelle einholen lassen.

$bands = $db->query("SELECT * FROM jos_users");
 echo "<pre>";
 print_r( $username->tableInfo());
 echo "</pre>";


Durch das SQL-Statement SELECT * FROM werden alle Felder einer Tabelle angesprochen. Über tableInfo() können über jedes der in dieser Tabelle enthaltenen Felder ausführliche Informationen ermittelt werden. Es lassen sich die wichtigsten Eigenschaften der Felder wie Name usw. ablesen. Die angezeigten Daten bedeuten im Einzelnen: [table] = Tabellenname, [name] = Feldname, [type] = Feldtyp, [len] = Feldlänge, [flags] = auto_increment, Index, binary usw.

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 14.05.2017 - 01:51

Danke, sehr informatives Tutorial!

Portrait von dmtw2107
  • 01.11.2013 - 08:39

toll erklärt, aber bis mit den ganzen informationen durch bin! puh das kann dauern! danke schön

x
×
×