MySQL & COMBRIX
Geschrieben von Silvermoon am 10.07.2010 11:36
Das COMBRIX Content Management System arbeitet mit einer MySQL Klasse und bietet bessere Möglichkeiten Datenbankkabfragen durchzuführen.

Aus diesem Grund möchten wir Euch bitten die neue Schreibweise bei der Entwicklung anzunehmen.

Die alte Schreibweise von DB-Anfragen:
$result=dbquery("SQL Anweisung");
$rows=dbrows($result);
$data=dbarray($result);


Die neue Schreibweise von DB-Abfragen:
$result=$db->query("SQL Anweisung");
$rows=$result->size();
$data=$result->fetch();


Eine Vermischung der alten und neuen Schreibweise ist nicht zulässig.

Wie man in der neuen Schreibweise erkennt, wird hierfür das Klassenobjekt "$db" genutzt. Dieses Klassenobjekt wird in der maincore.php erzeugt und ist in allen Dateien verfügbar, sobald die maincore.php eingebunden ist.

Zum Nutzen dieses Objektes in Funktionen muss in der Funktion global $db; definiert sein.

Warum jetzt die neue Schreibweise?
Die neue Schreibweise ist zum einen übersichtlicher und einfacher zu handhaben.
Das Hauptaugenmerk ist aber noch ein ganz anderer.

Möchte man jetzt mal schnell auf eine andere Datenbank zugreifen (Gleicher Host vorausgesetzt) ist es mit nur einem kleinen Schritt möglich und der sieht folgender Maßen aus:

$db2=new COMMySQL('MySQL Host','MySQL User','MySQL Pass','MySQL DB Name');

Wie man sieht wurde jetzt eine Datenbankverbindung zu einer zweiten Datenbank aufgebaut. Mit "$db2" kann diese jetzt angesteuert werden. Die erste Datenbankverbindung bleibt weiterhin aufrecht.

Bei der alten Schreibweise ist jetzt jedoch das Problem, dass alle Datenbank-Anfragen an die neue Datenbankverbindung durchgeführt werden. Sind Tabellen oder Felder hier nicht verfügbar würden schnell MySQL Fehler das Ergebnis sein.

MySQL Klassen Methoden am Beispiel "$db"
$db ist immmer mit der gewünschten Datenbank Verbindung zu ersetzen

Anweisung einen Anfrage an die Datenbank
$result = $db->query('SQL Anweisung');

Ermitteln der Gesamtergebnisse der Anfrage
- mit count() in der Anweisung
$result->rows();

- ohne count() in der Anweisung
$result->size();

Ausgabe eines Ergebniss die der Funktion mysql_result entspricht
$result->result(0); 0 Ersetzen mit der entsprechenden Zahl

Ausgabe als assoiziertes Array
$result->fetch();

Ausgabe als Objekt
$result->fetch_object();

Ausgabe als numeralisches Array
$result->fetch_row();

Die MySQL Klasse bietet natürlich auch Methoden ohne das $db->query() gemacht werden muss, da dieses intern gemacht wird.
Solche Methoden sind:

Überprüfung ob eine Tabelle existiert
$db->mysql_table_exists('Tabellenname'); // Kompletter Tabellname erforderlich

Überprüfen on ein Tabellenfeld existiert
$db->mysql_field_exists('Tabellenname','Feldname'); // Kompletter Tabellname erforderlich

Entfernen einen Indizes aus einer Tabelle
$db->mysql_drop_indizes('Tabellenname','Indexname'); // Kompletter Tabellname erforderlich

Hinzufügen einen Indizes in einer Tabelle
$db->mysql_add_indizes('Tabellenname','Indexname','Tabellenfeldname','Type') ;
-> Kompletter Tabellname erforderlich
-> Indexname ist der Name des Indizies
-> Tabellenfeldname ist der name des Tabellenfeldes (Durch Kommas mehrere möglich)
-> Type ist standardmäßig auf INDEX gesetzt. Kann aber auch auf UNIQUE,PRIMARY und FULLTEXT gesetzt werden


Wird ein neuer Tabelleneintrag gemacht und benötigt man im weiteren Verlauf des Scripts die ID (Auto_Increment Wert), dann ist die Schreibweise folgender Maßen:

$result = $db->query("INSERT INTO.....");
$mysql_id = $db->insertID();Hier noch ein paar kleine Beispiele:

SQL-Abfrage für mehrere Artikel:
$sql_statement="SELECT * FROM ".DB_PREFIX."articles";
$result=$db->query($sql_statement);

Anzahl der Ergebnisse:
$rows=$result->size();

Ausgabe der Artikel als Array:
if ($rows>0) {
while($data=$result->fetch()) {
echo $data['article_name'].' <br />';
}
}

oder

Ausgabe der Artikel als Objekt:
while($data=$result->fetch_objekt()) {
echo $data->article_name.'<br />';
}

Gibt man in $sql_statement noch eine WHERE, ORDER BY, GROUP BY, werden diese wie gehabt behandelt und man somit die Anzahl der Ausgabe beeinflussen.

Möchte man sich nur einen geziehlten Eintrag ausgeben lassen, bietet die Klasse folgende Möglichkeit:

Als Funktionsaufruf:
$var=first_query($fields,$table,$where);

Als Methodenausruf:
$var=$db->first_query($fields,$table,$where);

$fields => Definition der Tabellenfelder, Bsp: article_id,article_name,article_description oder als *

$table => Definition der Tabelle, Bsp: DB_PREFIX.'articles'

$where => Definitionen für die WHERE Klausel. Hier bitte kein WHERE selbst angeben, da dieses direkt integriert wird.

Beispiel hierzu:
$user=$db->first_query("user_id,user_name",DB_PREFIX."users","user_id=1");


Wie kann ich die first_query mit gejointe Tabellen verwenden?
Mit der first_query kann man auch gejointe Abfragen tätigen.

Bei $fields gibt man die Felder an, Bsp: ac.*,a.*

Bei $table beginnt man mit der FROM Tabelle und hängt die gejointen einfach dahinter, Bsp:
DB_PREFIX.'articles as a LEFT JOIN '.DB_PREFIX.'article_cats as ac ON ac.article_cat_id=a.article_cat

Bei $where gibt man dann die gewünschte WHERE Klausel ein, Bsp: 'a.article_published='1'

Jetzt nochmal die komplette Abfrage im Zusammenhang
$last_article = $db->first_query("ac.*,a.*",DB_PREFIX."articles as a LEFT JOIN ".DB_PREFIX."article_cats AS ac ON ac.article_cat_id=a.article_cat WHERE a.article_published='1' ORDER BY article_datestamp DESC");

Diese Funktion/Methode gibt genau einen Wert aus es ist automatisch auf LIMIT 0,1 gesetzt