De:DBAPI

From MODx Wiki

Jump to: navigation, search
Dieser Artikel kann noch eine Rechtschreibprüfung vertragen.

Wenn du gut Deutsch kannst, schau mal drüber.

Dieser Artikel ist noch nicht ganz vollständig.

Wenn du Ahnung von diesem Thema hast schau einfach mal wo du noch was erweitern kannst.

Die DBAPI stellt die grundlegenden Funktionen zur Kommunikation mit der Datenbank dar. Sie ist eine Abstraktionsebene - sollte MODx also einmal weiter Datenbanksysteme als MySQL benutzen ist die Benutzer der DBAPI einem direkten Benutzen der PHP-Funktionen vorzuziehen, um die Kompatibilität zu wahren. Dieser Artikel bietet eine grundlegende Übersicht über die Funktionen und Beispiele für den Einsatz.

Anm. Es ist hilfreich die Schriftgröße deines Browser eins größer zu stellen (strg + (Windows),⌘ + (Mac))

Contents

Select

Befehl

Wie der Name schon sagt ist das ein einfacher Wrapper für eine SELECT-Abfrage:

select(string felder,string tabelle[, string bedingung[,string sortierung[,string limit]]])

Erklärung

Die erzeugte Abfrage entspricht also je nach Angaben diesem Schema:

SELECT felder FROM tabelle WHERE bedingung ORDER BY sortierung LIMIT limit

Der Query wird dabei auch gleich durchgeführt.

Rückgabewerte

Rückgabewert (Erfolg): Resource des Queries

Rückgabewert (Fehler): FALSE

Beispiel

Einfach

$modx->db->select('*','freunde');

Zeigt alle meine Freunde. Die erzeugte Abfrage entspricht also

SELECT * FROM freunde

Vollständig

$heute = $modx->db->prepareDate(time(),'DATE');
$modx->db->select('*','geburtstage','verhaeltnis = familie AND datum >= ' . $heute,'datum ASC','0,5');

Diese Abfrage zeigt die nächsten 10 Geburtstage in meiner Familie, ausgehend von Heute. Die erzeugte Abfrage entspricht also:

SELECT * FROM geburtstage WHERE verhaeltnis = familie AND datum >= 2006-10-24  ORDER BY datum ASC LIMIT 0,5

Record Count

Befehl

Dieser Befehl entspricht mysql_num_rows von PHP und gibt die Anzahl der Werte die eine Select-Abfrage liefern würde zurück.

getRecordCount(resource query);

Rückgabewerte

Erfolg: Anzahl der Einträge als Ganzzahl (Int)

Beispiel

$query = $modx->db->select('*','freunde');
$anzahlMeinerFreunde = $modx->db->getRecordCount($query);

Dieser Befehl sagt mir wie viele Freunde ich habe.

Get a single Row

Befehl

Jetzt wird es interessant: Die Select-Abfrage von oben gibt ja erstmal nur eine Resource zurück. Um nun aber wirklichen ein Ergebnis zu erhalten benutzen wir diesen Befehl. Er ist ein Wrapper für mysql_fetch_assoc,mysql_fetch_row und mysql_fetch_array von PHP.

getRow(resource query[,string modus])

Der Modus gibt den Typ des zurückgegebenen Arrays an. Möglich sind folgende Werte:

assoc Gibt einen assoziativen Array (enthält die Namen der Tabellenspalten als Schlüssel) (Standardeinstellung)
num Gibt nur einen numerisch indizierten Array zurück
both Gibt einen Array der sowohl einen numerischen Index und Schlüsselwerte hat zurück

Rückgabewerte

Erfolg: Ein Array den Werten einer Tabellenzeile Fehler oder keine Werte mehr in der Tabelle: FALSE

Beispiel

Einfach

$query = $modx->db->select('*','freunde');
$daten = $modx->db->getRow($query);

Praxisnah

Das obige Beispiel ist nützlich wenn nur eine Zeile in der Tabelle vorhanden ist. Wenn man, wie in den meisten Fällen, mehrere Zeilen holen will kann man beispielsweise folgende Methode einsetzen:

$query =  $modx->db->select('*','geburtstage','verhaeltnis = familie AND datum >= ' . $heute,'datum ASC','0,5');
while($daten = $modx->db->getRow($query)) {
echo	"Mein Verwandter " . $daten["name"] . "hat am " . $daten["datum"] . "Geburtstag.\n";
}

Als Rückgabe würde ich nun folgendes erhalten:

Mein Verwandter Hans hat am 2006-10-28 Geburtstag.
Mein Verwandter Anne hat am 2006-11-09 Geburtstag.
...

Zwar noch nicht ganz praxistauglich, aber es erklärt das Prinzip.

Alte Methode

In manchen Snippets wird noch diese oder eine ähnliche Methode zu finden sein. Sie gilt als veraltet und sollte nicht mehr verwendet werden.

$result = $modx->dbQuery("SELECT * FROM foobar");
for($i=0;$i<@$modx->recordCount($result);$i++)  {
  array_push($ergebnisseArray,@$modx->fetchRow($result));
}

Die in diesem Beispiel eingesetzten Funktionen benutzen nicht die DBAPI (Intern sind es nurnoch Wrapper für die entsprechenden Funktionen der DBAPI)

Get Column Names

Befehl

Gibt die Namen der Spalten einer Tabelle zurück

getColumnNames(resource query);

Ansatt eine resource kann auch eine SQL-Abfrage angegeben werden. Diese wird dann zu erst durchgeführt.

Beispiel

$spaltenNamenQuery = $modx->db->select('*','geburtstage');
$spaltenNamenArray = $modx->db->getColumnNames($spaltenNamenQuery);

Get Entries in Column

Befehl

Dieser Befehl gibt alle Werte in einer Spalte zurück

getColumn(string spaltenname,resource query);

Genau wie bei getColumnNames kann hier anstatt einer resource auch eine SQL-Abfrage angegeben werden.

Beispiel

$query = $modx->db->select('*','geburtstage');
$tageMitGeburtstagenArray = $modx->db->getColumn('datum',$query);

Jetzt habe ich einen Array in dem alle Tage aufgelistet sind, an denen jemand aus meiner Geburtstagsliste Geburtstag hat.

Get First Field

Befehl

Stellt man sich die Datenbanktabelle wie die Matrix einer Tabellenkalkulation vor so erhält man mit diesem Befehl das Feld A1

getValue(resource query);

Beispiel

$query = $modx->db->select('*','foobar');
$ersterWert = $modx->db->getValue($query);

Stellt man sich also folgende Tabelle vor

    +-----+-----+-----+
    |  A  |  B  |  C  |
+---+-----+-----+-----+
| 1 | 42  |  1  |  2  |
+---+-----+-----+-----+
| 2 | 5   |  7  |  3  |
+---+-----+-----+-----+

So würde das Ergebnis der Abfrage 42 sein. Der Befehl ist ein Wrapper für getRow, kann also auch in einer Schleife benutzt werden.

Get XML

Befehl

Dieser Befehl gibt die Werte einer Abfrage im XML-Schema zurück

getXML(resource query);

Beispiel

$query = $modx->db->query('*','freunde');
$xml = $modx->db->getXML($query);

$xml enthält nun einen String der etwa so aussieht:

<xml>
  <recordset>
    <item>
      <name>Hans Müller</name>
      <ort>Buxdehude</ort>
    </item>
    <item>
     <name>Max Mustermann</name>
     <ort>Musterstadt</ort>
    </item>
  </recordset>
</xml>

Damit sollte das Prinzip klar sein: Jede Zeile der Tabelle wird als <item> ausgegeben, die einzelnen Spalten erhalten ihren eigenen Tag nach ihrem Namen.

Get Table Metadata

Befehl

Gibt weitere Informationen zu den einzelnen Spalten einer Tabelle zurück.

getTableMetaData(string tabellenname);

Das Ergebnis ist ein multidimensionaler Array, die Schlüsselwerte des obersten Arrays sind die Namen der Spalten.

Prepare a Date for MySQL

Befehl

Diese Funktion wandelt einen UNIX-Timestamp in ein Datum um, das in Feldern mit einem Datumstyp eingesetzt werden kann.

prepareDate(int timestamp[, string datumstyp])

Datumstyp kann einer der folgenden Werte sein:

DATETIME Y-m-d H:i:s (Standardeinstellung)
DATE Y-m-d
TIME H:i:s
YEAR Y

Eine Erklärung der Variablen gibt es in der PHP-Dokumentation zu date().

Beispiel

$timestamp = 1161711995; //Tue, 24 Oct 2006 19:46:35
$datumFuerMysql = $modx->db->prepareDate($timestamp);

Als Rückgabewert erhalte ich nun

2006-10-24 19:46:35

Get as HTML Grid

Befehl

Diese Funktion gibt eine HTML-Tabelle aus

getHTMLGrid(resource query,array parameter);

parameter ist ein assoziativer Array und sollte folgende Schlüssel enthalten

columnHeaderClass CSS-Klasse des Spaltenkopfs (<th class="columnHeaderClass">)
tableClass CSS-Klasse der Tabelle (<table class="tableClass">)
itemClass CSS-Klasse eines Feldes (<td class="itemClass">)
altItemClass Alternative CSS-Klasse eines Feldes (Für abwechselnde Zeilenhintergründe)
columnHeaderStyle Style-Attribut des Tabellenkopfs (<th style="columnHeaderStyle">)
tableStyle Style-Attribut der Tabelle (<table style="tableStyle">)
itemStyle Style-Attribut eines Feldes (<td style="itemStyle">)
altItemStyle Style-Attribut für alternative Felder (siehe oben)
columns
fields
colWidths
colAligns
colColors
colTypes
cellPadding
cellSpacing
header
footer
pageSize
pagerLocation
pagerClass
pagerStyle

Get as Array

Befehl

Gibt alle Werte einer Abfrage als multidimensionalen Array zurück

makeArray(resource query);

Beispiel

Will ich z.b. alle meine Freunde aus einer Tabelle holen kann ich mir das ganz einfach machen:

$query = $modx->db->select('*','freunde');
$alleFreundeArray = $modx->db->makeArray($query);

Als Ergebnis habe ich jetzt einen Array nach folgenden Schema:

Array
(
    [0] => Array
        (
         [name] => Hans Müller
         [ort] => Buxdehude
        )
    [1] => Array
        (
         [name] => Max Mustermann
         [ort] => Musterstadt
        )
)

Delete

Befehl

Dieser Befehl ist ein Wrapper für eine DELETE-Abfrage

delete(string tabelle[, string bedingung[, string felder]]);

Die Abfrage entspricht

DELETE felder FROM tabelle WHERE bedingung

Diese Abfrage wird auch gleich durchgeführt.

Beispiel

Hans ist umgezogen und ich habe keinen Kontakt mehr zu ihm, also kann ich ihn als Freund löschen.

$modx->db->delete('freunde','name = "Hans Müller"');

Die Abfrage entspricht:

DELETE FROM freunde WHERE name = "Hans Müller"

Update

Befehl

Dieser Befehl ist ein Wrapper für die Update-Abfrage um Datensätze zu verändern.

update(array felder,string tabelle[,string bedingung])

felder ist ein assoziativer Array bei dem die Schlüssel dem Spaltennamen entsprechen. Der Wert kann aber auch als String übergeben werden (Spaltenname = 'Wert', Spalte2 = 'Wert2') Der Befehl entspricht folgender SQL-Abfrage

UPDATE tabelle SET felder WHERE bedingung

Beispiel

Mein anderer Freund ist jetzt auch noch umgezogen. Zum Glück nicht so weit weg, darum muss ich nur seine Adresse ändern:

$werteZumAktualisierenArray = array('ort' => 'Musterdorf');
$modx->db->update($werteZumAktualisierenArray,'freunde','name = "Max Mustermann"');

Insert

Befehl

Dieser Befehl ist ein Wrapper für den INSERT-Befehl

insert(array felder,string inTabelle[, string vonFelder[, string vonTabelle[, string bedingung[, string limit]]]]);

Der Befehl akzeptiert es neue Werte einzufügen oder sie aus einer anderen Tabelle zu holen. Siehe dazu die Beispiele.

Beispiele

Einfaches Beispiel

Ich hab einen neuen Freund gefunden!

$felderArray = array('name' => 'Anna Maier','ort' => 'Dorf Im Wald');
$modx->db->insert($felderArray,'freunde');

Dieser Befehl entspricht folgender Abfrage:

INSTERT INTO freunde (name, ort) VALUES('Anna Maier','Dorf Im Wald');

Komplexes Beispiel

Bei dem komplexen Beispiel wird ein INSERT mit einem SELECT gekoppelt. Mein ehemaliger Freund Hans ist wieder zurückgezogen. Damals hatte ich in die Tabelle altefreunde geschoben. Jetzt kann ich ihn wieder zurückholen.

$schluesselArray = array('name' => ,'ort' => );
$modx->db->insert($schluesselArray,'freunde','*','altefreunde','name = "Hans Müller");

Die erzeugte Abfrage entspricht

INSERT INTO freunde (name,ort) SELECT * FROM altefreunde WHERE name = "Hans Müller"

Last Insert Id

Befehl

Dieser Befehl entspricht mysql_insert_id von PHP.

getInsertId([resource Datenbankverbindung]);

In der Regel wird der Befehl ohne Parameter aufgerufen.

Beispiel

Vorhin habe ich ja Anna als neuen Freund hinzugefügt. Welche ID hat sie denn nun in der Datenbank?

$felderArray = array('name' => 'Anna Maier','ort' => 'Dorf Im Wald');
$modx->db->insert($felderArray,'freunde');
$id = $modx->db->getInsertId();

Query

Befehl

Dieser Befehl ist ein Wrapper für mysql_query. Wenn möglich sollte er nicht direkt benutz werden sondern die Select,Insert,Delete und Update Funktionen.

query(string sql);

Affected Rows

Dieser Befehl gibt die Anzahl der Zeilen zurück, die durch eine vorherige Abfrage verändert wurden.

getAffectedRows([resource Datenbankverbindung]);

Wie bei getInsertId gibt man normalerweise keine Parameter an.

Last Error

Befehl

Für Debugging ist diese Funktion nützlich, die den letzten Fehler bei einer SQL-Abfrage anzeigt.

getLastError();

Beispiel

$falscherQuery = 'SELECT nix FROM foobar WHERE 1 > 2';
$modx->db->query($falscherQuery);
$fehlermeldung = $modx->db->getLastError();
Personal tools