Datenbankzugang

Aus MAXcms

Wechseln zu: Navigation, Suche

mit $DC = newDC(); kann an jeder Stelle im CMS ein neues Datenbank-Handle erzeugt werden. Es wird die Datenbank verwendet, die in der Datei inc.thcms_var.php im Projektroot eingetragen ist.

$DB_DRIVER = "mysql";
$DB_HOST = "localhost";
$DB_NAME = "DATENBANKNAME";
$DB_USER = "root";
$DB_PASS = "";

Inhaltsverzeichnis

[bearbeiten] Datenbankzugriff

[bearbeiten] Datenbank-Objekt erstellen

$DC = newDC();

Damit ist ein neues DB-Objekt erstellt und kann für die folgenden Kommandos verwendet werden.

[bearbeiten] einen Datensatz lesen (SELECT)

$Q = "SELECT * FROM tabelle WHERE pk=1";
$data = $DC->getByQuery($Q);
vd($data["pk"]);

[bearbeiten] mehrere Datensätze lesen (SELECT)

$Q = "SELECT * FROM tabelle WHERE wert>100";
$datas = $DC->getAllByQuery($Q);
for($i=0;$i<count($datas);$i++) {
  vd($datas[$i]["pk"]);
}

[bearbeiten] einen Datensatz eintragen (INSERT)

$data = array("wert" => 100);
$DC->setDbTable("tabelle");
$pk = $DC->insert($data);

[bearbeiten] einen Datensatz überschreiben (UPDATE)

$data = array("wert" => 100);
$DC->setDbTable("tabelle");
$DC->update($data, $pk, "pk");

[bearbeiten] einen Datensatz löschen (DELETE)

$DC->sendQuery("DELETE FROM tabelle WHERE ...");

[bearbeiten] einen beliebigen SQL-Query senden

$Q = "UPDATE tabelle SET ..... ";
$DC->sendQuery($Q);

[bearbeiten] eine 2. Datenbank ansprechen

Es kommt vor, daß innerhalb eines Webprojektes eine weitere Datenbank angesprochen werden muß. die Funktion $DC = newDC(); liefert aber immer nur ein Handle auf die Default-Datenbank zurück.

Dazu gibt es 2 Möglichkeiten:

Entweder wird direkt ein neues DC-Objekt erzeugt:

$dsn = "mysql://".$user.":".$pass."@".$host."/".$dbname;
$DB = DB::connect($dsn);
$DC2 = new DataCommon($DB);

oder in die Datei inc.thcms_var.php werden weitere Zugangsdaten eingetragen und die Variablennamen durchnummeriert:

$DB_DRIVER2 = "mysql";
$DB_HOST2 = "localhost";
$DB_NAME2 = "DATENBANKNAME";
$DB_USER2 = "root";
$DB_PASS2 = "";

und das Objekt dann mit $DC2 = newDC("2"); aufgerufen. Statt der "2" kann auch jedes andere Kürzel verwendet werden.

[bearbeiten] MySQL4 -> MySQL5

Seite der Einführung von MySQL5 hat sich leider die Priorisierung von Joins innerhalb eines Queries geändert. Folgender JOIN

SELECT * FROM tab1, tab2 WHERE tab1.pk = tab2.fk AND 1

erzeugt den JOIN über das mit Komma getrennt auflisten der zu verbindenden Tabellen und der Join-Bedingung innerhalb der WHERE-Anweisung. Korrekt sollte so ein JOIN allerdings wie folgt geschrieben werden.

SELECT * FROM tab1 INNER JOIN tab2 ON tab1.pk=tab2.fk WHERE 1

Problematisch wird es wenn beide JOIN-Arten gemischt werden, etwa weil der INNER-JOIN der mit kammaseparierten Tabellen angegeben wurde um einen LEFT JOIN erweitert werden soll

SELECT * FROM tab1, tab2 LEFT JOIN tab3 on tab2.pk=tab3.fk WHERE tab1.pk = tab2.fk AND 1

In diesem Fall hat seit MySQL5 der LEFT JOIN eine höhere Priorität als der INNER JOIN über tab1 und tab2 und wird somit zuerst abgearbeitet. An dieser Stelle ist also die Tabelle tab2 noch garnicht angefügt und die Spalte tab2.pk steht für den LEFT JOIN garnicht zur Verfügung und dies führt zu einem SQL-Fehler.

Dies kann über eine Klammerung der INNER-JOIN-Tabellen behoben werden, da die Klammern die Priorität wieder anheben.

SELECT * FROM (tab1, tab2) LEFT JOIN tab3 on tab2.pk=tab3.fk WHERE tab1.pk = tab2.fk AND 1

MAXcms erkennt selber, das MySQL5 installiert ist und überprüft daraufhin jeden Query auf mögliche JOINS der "falschen" Art. Diese werden mit eingefügten Klammern behoben. Dies bedeutet aber eine geringe Verlangsamung der SQL-Abfragen.

Achtet der Entwickler schon beim Erstellen der Queries auf MySQL-Konformität, kann über folgende Variabel dem DC-Objekt mitgegeben werden, daß die MySQL5-Überprüfung entfallen kann.

$DC = newDC();
$DC->mySQL5complient = true;
Persönliche Werkzeuge