Datenbankzugang MDB2

Aus MAXcms

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[bearbeiten] Leitfaden zur Benutzung der Datenbank-Abstraktionsklassen in MAXcms

[bearbeiten] Allgemein:

[bearbeiten] Globale Instanz:

global $cmsDB;

oder

$GLOBALS['cmsDB'];

[bearbeiten] Abstrakte Feldtypen:

text Text bis 4000 Byte (Vorsicht Multibyte-Zeichen: Maximal 1000 4-Byte-Zeichen)
decimal Alle decimal Felder gleiche Nachkommastellenanzahl; Lieber float nehmen
integer Längenangaben 1, 2, 3, 4 und 8 erlaubt; Feldlänge 1 z.B. Ersatz für boolean
float Geeignet für die MySQL Typen float und double; Feldlängenangabe nicht erlaubt
date YYYY-MM-DD; Nicht vorhandenen Werte sollten durch "null" repräsentiert werden
time HH:MI:SS; Nicht vorhandenen Werte sollten durch "null" repräsentiert werden
timestamp YYYY-MM-DD HH:MI:SS; 0000-00-00 00:00:00 nicht möglich, stattdessen "null"
clob Alle Textfelder größer als 4000 Byte sollen den Typen clob nutzen
blob Gedacht für große Binärdaten

[bearbeiten] Standard-Attribute:

notnull null Werte erlaubt true/false
length Feldlänge
default Standardwert
unsigned Vorzeichen true/false (sollte nie angegeben werden)
fixed Feste Länge true/false (nur für den Typen text interessant)

[bearbeiten] Allgemeine Funktionen:

$pk = (int)$cmsDB->nextId('NAME_DER_TABELLE');

Mit dieser Funktion erhält man eine neue Sequenz, die man als PK für ein INSERT-Statement nutzen kann.

$q .= ' AND '.$cmsDB->like('FELD1', 'text', '%%BELIEBIGER_TEXT%%'[, true]).' ';

Man beachte die doppelten „%%“, die man nur dann benutzen muss/darf, wenn man mit „queryF“ oder „manipulateF“ arbeitet (bei Nutzung von „query“ oder „manipulate“ reicht „%“). Der vierte Parameter ist optional. Wird dort „false“ übergeben, wird der Ausdruck CASESENSITIV behandelt.

$q .= ' AND '.$cmsDB->in('FELD1', $array, false, 'text').' ';

Diese Funktion ersetzt das aus MySQL bekannte „IN(WERT1, WERT2[, ...])“. Der dritte Parameter negiert den Ausdruck bei Angabe von „true“.

$concat = array(
    array("','"),
    array('FELD1'),
    array("','")
);
$q .= $cmsDB->like($cmsDB->concat($concat), 'text', '%,'.$suchText.',%');

Dieses Beispiel zeigt die Verwendung der abstrahierter MySQL-Funktion CONCAT. Ist zu erwarten, dass mindestens eins der Felder NULL sein könnte (z.B. ein leere Beschreibung), sollte als zweiter Parameter "true" übergeben werden.

[bearbeiten] Data Definition Language:

[bearbeiten] Tabellen:

$cmsDB->tableExists('NAME_DER_TABELLE');
$cmsDB->createTable('NAME_DER_TABELLE',
    array(
        'FELD1' => array('type' => 'text'[, ...]),
        'FELD2' => array('type' => 'text'[, ...])
        [, ...]
    )
);

oder

$cmsDB->checkTableMDB2('NAME_DER_TABELLE',
    array(
        'FELD1' => array('type' => 'text'[, ...]),
        'FELD2' => array('type' => 'text'[, ...]),
        [, ...]
    ),
    array(
        'createSequence' => true,
        'primaryKey' => array('FELD1'[, ...]),
        'indexes' => array(
             array('name' => 'NAME', 'fields' => array('FELD1'[, ...]))
             [, ...]
        )
    )
);
$cmsDB->dropTable('NAME_DER_TABELLE');
$cmsDB->renameTable('NAME_DER_TABELLE', 'NEUER_NAME_DER_TABELLE');

[bearbeiten] Felder:

$cmsDB->tableColumnExists('NAME_DER_TABELLE', 'FELD_NAME');
$cmsDB->addTableColumn('NAME_DER_TABELLE', 'FELD_NAME',
    array('type' => 'text', 'length' => 10, 'fix' => false,
          'default' => null, 'notnull' => false)
);

oder

$cmsDB->checkFieldMDB2('NAME_DER_TABELLE', 'FELD_NAME',
    array('type' => 'text', 'length' => 10, 'fix' => false,
          'default' => null, 'notnull' => false)
);
$cmsDB->dropTableColumn('NAME_DER_TABELLE', 'FELD_NAME');
$cmsDB->renameTableColumn('NAME_DER_TABELLE', 'FELD_NAME', 'NEUER_FELD_NAME');

[bearbeiten] Primärschlüssel:

$cmsDB->addPrimaryKey('NAME_DER_TABELLE', array('FELD1'[, ...]));
$cmsDB->dropPrimaryKey('NAME_DER_TABELLE');

[bearbeiten] Sequenzen:

$cmsDB->createSequence('NAME_DER_TABELLE'[, $startwertInteger]);
$cmsDB->dropSequence('NAME_DER_TABELLE');

[bearbeiten] Indizes:

$cmsDB->addIndex('NAME_DER_TABELLE',
    array('FELD1'[, ...])[, 'INDEX_NAME' [, $istVolltextIndexBoolean]]
);
$cmsDB->dropIndex('NAME_DER_TABELLE', 'INDEX_NAME');

[bearbeiten] Data Manipulation Language:

[bearbeiten] Delete:

$cmsDB->manipulateF(
    DELETE FROM NAME_DER_TABELLE WHERE FELD1 = %s',
    array('integer'),
    array($id)
);

oder

$cmsDB->manipulate('DELETE FROM NAME_DER_TABELLE WHERE FELD1 = 1');

[bearbeiten] Update:

Analog zu den DELETE-Statements sind auch INSERT- und UPDATE-Manipulationen möglich. Soll in der Manipulation jedoch ein Feld vom Typ „clob“ (oder auch „blob“) behandelt werden, ist folgendes Vorgehen einzuhalten:

$cmsDB->updateMDB2('NAME_DER_TABELLE',
    array(
        'FELD1' => array('integer', $id),
        'FELD2' => array('clob', $langerText)
    ),
    array(
        'FELD_BEDINGUNG1' => array('integer', $bedingung1),
        'FELD_BEDINGUNG2' => array('integer', $bedingung2)
    )
);

Hierbei ist zu beachten, dass die Bedingungen AND-verknüpft werden.

[bearbeiten] Insert:

$pk = (int)$cmsDB->nextId('NAME_DER_TABELLE');
if($pk)
{
    $cmsDB->insertMDB2('NAME_DER_TABELLE', array(
        'PK' => array('integer', $pk),
        'FELD1'=>  array('integer', $langerText),
        'FELD2'=> array('timestamp', null)
    ));
}
else
{
    [...]
}

[bearbeiten] Data Query Language:

$res = $cmsDB->queryF(
    'SELECT FROM NAME_DER_TABELLE WHERE FELD1 = %s AND FELD2 = %s',
    array('integer', 'text'),
    array($integer, $text)
);

oder

$res = $cmsDB->query('SELECT COUNT(FELD1) AS cnt FROM NAME_DER_TABELLE');

Das Iterieren über die einzelnen Ergebniszeilen funktioniert so:

while($rowArray = $cmsDB->fetchAssoc($res))
{
    [...]
}

oder so:

while($rowObject = $cmsDB->fetchObject($res))
{
    [...]
}
Persönliche Werkzeuge