Seite 1 von 2

Richtige Verwendung der DB

Verfasst: Di 10. Jul 2007, 11:58
von rethus
Ich habe nun öfter hier gesehen, das einige Module so programmiert sind, das normale SQL-Statements genutzt werden, um ddie Verbindung zu Datenbank aufzubauen etc.

Soweit ich es aber sehen konnte gibt es ja da auch in Klassen geschachtelte Funktionen.

Kann hier jemand kurz einen Hinweis geben, wie man für ein Modul - sauber im Contenido-Style" ne Datenbank-Verbindung aufbaut, eine Abfrage erstellt und die Datenbankverbindung wieder schließt?

Ideal wäre auch ein Hinweis wo man sich über die verwendbaren DB-Funktionen informieren kann.

Den Umstand in einem Modul den Benutzernamen und Passwort der DB unterzubringen finde ich nicht sauber, und es gibt ja schließlich andere Möglichkeiten.

Verfasst: Di 10. Jul 2007, 12:04
von MichFress
im Wesentlichen ist es wohl dieses hier:

Code: Alles auswählen

$db = new DB_Contenido;
$query = "SELECT * FROM ".$cfg['tab']['tabelle']."";
$db->query($query):
$wieviel = $db->numRows();

while($db->next_record()){
  echo $db->f("spaltenname");
  //alternativ:
  $arr =  $db->copyResultToArray();
}
Ein Blick die Module des Beispielmandanten empfiehlt sich zudem...

EDIT: hab das copyResult... mal mit aufgenommen

Verfasst: Di 10. Jul 2007, 12:09
von Dodger77
Einfach geht das über das DB-Objekt, ungefähr so:

Code: Alles auswählen

// Wenn kein DB-Objekt zur Verfügung steht, ein neues erzeugen.
// Um den Aufbau der Verbindung muss man sich nicht gesondert 
// kümmern.
if ( !is_object($db) ) {
        $db = new DB_Contenido;
}

// SQL Abfrage bauen
$sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE 1 = 1";

// SQL-Abfrage ausführen
$db->query($sql);

// Ergebnisse der Abfrage durchlaufen
while ($db->next_record()) {

  // Jeweils die idcat ausgeben.
  echo $db->f('idcat');

}
Ein Blick in die Datei "/conlib/db_mysql.inc" sollte die weiteren Möglichkeiten auszeigen.

EDIT: MichFress war schneller. :(

Verfasst: Di 10. Jul 2007, 12:13
von rethus
Danke Leute, das war super schnell :-)

Verfasst: Di 10. Jul 2007, 12:55
von rethus
Hab mal unter conlib in die mysql.inc reingeschaut, aber ich hab keine möglichkeit gefunden, das Ergebnis als array oder kompletten result zurückzugeben.

Ich nutze bei normalen SQL-Kommandos gerne

Code: Alles auswählen

while($row =mysql_fetch_array_result)
{
    echo $row['titel']."-".$row['text'];
}

Verfasst: Di 10. Jul 2007, 13:34
von Dodger77

Verfasst: Mi 11. Jul 2007, 09:34
von rethus
Danke für den Tipp,
aber gibts da nicht einen Ersatz für:

Code: Alles auswählen

while($row= mysql_fetch_array($result))
{
    echo $row[0].$row[1];
}
Wenn ich nämlich $db->$db->copyResultToArray() nutze, muss ich ja immer ne foreach-schleife proggen, und das ist ja umständlicher, als der normale mysql_fetch_array()-Befehl.

Ich finde es fehlt in der DB-Klasse ne funktion, die den kompletten query-Result zurückgibt, damit man AUCH mysql-standartfunktionen wie mysql_fetch_array, mysql_fetch_object etc. nutzen kann.

Was haltet Ihr davon?

Würde ja schon reichen, wenn $db->query anstatt die Query_ID den Result zurückgibt.

Um beides zu haben könnte man ja eine optionale Parameterübergabe machen, dass wenn der 2. Parameter bei $db->query() 1 ist, dass dann anstatt die Query_ID der Result zurückgegeben wird, oder?

Verfasst: Mi 11. Jul 2007, 09:40
von rethus
Hab selbst ne Lösung gefunden... der Result wird über die Funktion query_id() zurückgegeben.

Damit geht das nutzen normaler mysql-funktionen z.B. so:

Code: Alles auswählen

$db->query($sql);
while($row = mysql_fetch_array($db->query_id()))
{
print_r($row);	
}

Verfasst: Mi 11. Jul 2007, 09:44
von Dodger77
Folgendes macht doch in etwa das Gleiche:

Code: Alles auswählen

while ($db->next_record()) {

  print_r($db->Record);

} 

Verfasst: Mi 11. Jul 2007, 10:00
von rethus
Ja super, das sieht auch viel sauberer aus, denn bei meinem mysql_fetch_array oben gibt es im backend immer eine Fehlermeldung.

So klappt es wunderbar.

Danke

Verfasst: Mi 11. Jul 2007, 11:06
von rethus
Kommando zurück! Ist doch nicht was ich brauche.

Wobei gerade als ich es jetzt anwenden möchte, sehe ich dass es nicht das gleiche ist.

Bei meinem Beispiel oben kann ich innerhalb der While-Schleife direkt auf $row[0] oder $row['titel'] zugreifen.

Dein Beispiel oben gibt den NUR gesamten Array aus, dort kann ich nicht auf die einzelnen Schlüssel zugreifen.
Sinn und zweck ist ja, das solange mysql_fetch_array daten bekommt die Schleife ausgeführt wird, und auf die Inhalte von $row DIREKT zugegriffen werden kann.

PS: den Error den ich beschrieben habe für den Backendbereich resultiert daraus, das die übergebene ID fehlt :-) also scheint meine Lösung vorab doch die praktikabelste zu sein...

Verfasst: Mi 11. Jul 2007, 11:11
von emergence
rethus hat geschrieben:Bei meinem Beispiel oben kann ich innerhalb der While-Schleife direkt auf $row[0] oder $row['titel'] zugreifen.

Dein Beispiel oben gibt den NUR gesamten Array aus, dort kann ich nicht auf die einzelnen Schlüssel zugreifen.
ähm, dann schreib den code doch etwas um so das es funktioniert...

Code: Alles auswählen

while ($db->next_record()) { 

  $row = $db->Record;
  echo $row[0];

} 

Verfasst: Mi 11. Jul 2007, 11:15
von Dodger77
Klar, kann man da direkt drauf zugreifen. Wenn du das Array mit print_r() ausgeben lassen kannst, dann kannst du auch drauf zugreifen, z.B.:

Code: Alles auswählen

// SQL-Abfrage ausführen
$db->query($sql);

// Ergebnisse der Abfrage durchlaufen
while ($db->next_record()) {

  // per Index auf die Ergebnisse zugreifen
  echo $db->Record[0] . " " . $db->Record[1];

  // per Feldtitel auf die Ergebnisse zugreifen
  echo $db->Record['feld1'] . " " . $db->Record['feld2'];

} 

Verfasst: Mi 11. Jul 2007, 12:30
von rethus
Ahhhhh sorry :oops:
Ich stand auf der Leitung... wird Zeit für ein kleines Päuschen 8)

Ich war irgendwie der Meinung, das $db->Record eine Funktion anspricht, wobei er ja auf eine Variable in der Klasse weist.

Ist doch was dran, das man beim Coden mindestens jede 45 Min 10 Min. Pause machen sollte :!:

Verfasst: Do 18. Okt 2007, 13:40
von rethus
Kann mir jemand einen kurzen Tipp geben, wie ich eine andere Datenbank über die Contenido-Funktion - beispielsweise als "$db1" ansprechen kann?

ich dachte da an:
if ( !is_object($db1) ) {
$db1 = new DB_Contenido;
}
Aber wo sage ich Ihm, welche Datenbank er nehmen soll?